Visualisez votre dépôt SVN en vidéo
Il y a des projets comme Gource qui sortent vraiment de l’ordinaire. Je suis tombé dessus complètement par hasard et suis resté bluffé par le concept.
Cette application transforme l’historique de votre outil de gestion de sources (SVN, GIT, …) en une belle vidéo artistique, montrant l’évolution de votre projet en fonction des commits, des créations de branches, des merges, etc.
Pas franchement utile mais le résultat reste vraiment sympa !
La fin d’une ère
J’ai décidé aujourd’hui de fermer définitivement mon site www.overnetcity.com pour me consacrer exclusivement à ce blog hébergé sur le même domaine.
Autrefois site d’échange autour du Peer2Peer et plus particulièrement du logiciel Overnet, OvernetCity a regroupé au plus haut de sa forme environ 20.000 membres au sein de son forum. Fermé en 2004, je me suis ensuite servis du domaine pour héberger un petit site développé en symfony (tiens donc !) et qui me permettait de publier mon CV sur Internet.
Face au design vieillissant (peut-être était-il déjà moche à la base…) j’ai longtemps voulu le reconstruire entièrement. Mais finalement, pourquoi refaire ce que WordPress sait déjà très bien accomplir tout seul.
Mon site de CV et mon blog ne font donc désormais plus qu’un.
Je vous invite ainsi à consulter mon CV ou mes réalisations grâce au menu en haut de cette page.
Et surtout, n’hésitez pas à me contacter pour toute proposition professionnelle ou pour toute question relative au contenu de ce blog.
En voulant me servir de la fonction PHP getimagesize('http://un_serveur/une_image.jpg'), je suis tombé sur une erreur après la mise en ligne du code sur un hébergement mutualisé de 1and1 :
Warning: getimagesize() [function.getimagesize]: URL file-access is disabled in the server configuration
L’erreur vient tout simplement du fait que, par défaut, dans la version 5 de PHP, la variable allow_url_fopen du php.ini est à false. Cette option active les versions étendues des fonctions d’accès aux fichiers, qui savent exploiter les URL.
Je me suis dit dans un premier temps que j’allais devoir basculer le site sur un serveur dédié mais, après quelques recherches, j’ai découvert que 1and1 autorise la modifications des valeurs du php.ini, même sur un hébergement mutualisé.
Pour ce faire, rien de plus simple ! Il suffit de créer un fichier php.ini avec les couples variables / valeurs souhaités et de le placer dans l’ensemble des répertoires contenant des scripts PHP sur le serveur.
Exemple de fichier php.ini :
upload_max_filesize = 10M
post_max_size = 10M
En ce qui nous concerne, il faut créer le fichier suivant :
allow_url_fopen = 1
Si vous travaillez sur un projet symfony, il suffit de mettre le php.ini à la racine du dossier web, puisque toutes les actions s’exécutent à partir du contrôleur frontal.
Si vous n’êtes pas chez 1and1, vérifiez si votre hébergeur vous propose la personnalisation du php.ini. De plus en plus le font afin de laisser un peu de souplesse aux développeurs. Et on ne va pas s’en plaindre…
Je m’occupe actuellement du développement du site myBonjour.fr qui permet le recensement et l’affichage de tous les blogs du type Bonjour Madame et Bonjour Poney.
Pour optimiser la vitesse de chargement des pages, je me suis intéressé à la technique aujourd’hui très populaire des Sprites CSS.
Un Sprite, qu’est-ce que c’est ? C’est une grande image qui contient plusieurs petites images utilisées au sein de votre application web, via les feuilles de style. En utilisant la propriété background CSS, il est assez facile de dire quelle partie du sprite doit être affichée en image de fond.
L’avantage de regrouper plusieurs petites images au sein d’un sprite est double. D’une part, l’image ainsi formée est souvent moins lourde que l’ensemble des petites images additionnées et, d’autre part, le nombre de requête HTTP pour charger les images est réduit à un. C’est ce dernier point qui est le plus important et le plus significatif en terme de gain de performances.
Voici un exemple de sprite :
![]()
De nombreuses applications Web apportent une aide intéressante pour la création de Sprite à partir d’un site existant non optimisé.
J’ai retenu tout particulièrement le site http://spriteme.org qui offre un bouton à glisser dans sa barre de favoris et qui ouvre une popup en Javascript qui permet de créer un sprite à la volée et même de générer le CSS correspondant à partir du CSS existant.
Maintenant, comment générer un Sprite soit même, directement dans son code symfony ? Vous allez voir ci-dessous le code que j’ai utilisé pour myBonjour.fr.
Pour cela, j’ai ajouté dans un premier temps une méthode privée dans mon modèle, s’occupant de générer le Sprite en question :
private function makeSpriteForFavicons()
{
$items = Doctrine_Core::getTable('MyBonjourItem')->getAllActiveItems();
$width = 25;
$height = 16;
$space = 14;
// On crée l'image vide
$image = imagecreatetruecolor($width, ($height+$space) * count($items));
$background = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefill($image, 0, 0, $background);
imagealphablending($image, false);
imagesavealpha($image, true);
// Ajout de tous les favicons à l'image
$pos = 7;
foreach($items as $item)
{
$tmp = imagecreatefrompng($item->getItemFilePath());
imagecopy($image, $tmp, 0, $pos, 0, 0, $width, $height);
$pos += $height + $space;
imagedestroy($tmp);
}
imagepng($image, sfConfig::get('sf_web_dir').'/images/items_icons.png');
}
Il suffit ensuite d’appeler cette méthode, quand la colonne correspondant à l’image est modifiée. Pour cela, on implémente la méthode save du modèle :
public function save(Doctrine_Connection $conn = null)
{
if(in_array('favicon_url', array_keys($this->getModified())))
{
$return = parent::save($conn);
$this->makeSpriteForFavicons();
}
else
$return = parent::save($conn);
return $return;
}
Et enfin, on génère la partie correspondante dans le fichier CSS, à la volée :
// makeCSSSuccess.php
<?php $pos = 0; foreach($items as $item): ?>
div#<?php echo $item->getSlug() ?> > h3{
background: url("/images/items_icons.png") no-repeat scroll 5px -<?php echo $pos*$width ?>px;
}
<?php $pos++; endforeach; ?>
Le fichier CSS généré par une action symfony doit être mis en cache pour éviter toute chute des performances. Il suffit de déclencher ensuite une regénération du cache lorsqu’un item est ajouté en base.
Sur myBonjour, j’ai ainsi supprimé le chargement de 60 requêtes HTTP, correspondant aux différents bonjours présents dans la liste.
Obtention du label HF Manager
A l’INSA de Lyon, j’ai eu l’occasion de suivre deux formations qui sortent du cadre classique des études d’un ingénieur en informatique. La première, en 4ème année s’intitulait Label Handi-manager et était destinée à sensibiliser les étudiants à l’intégration des personnes handicapées au sein des entreprises. Cette expérience m’avait particulièrement intéressé et je l’ai renouvelé cette année, avec une nouvelle formation, intitulée cette fois Label HF Manager. L’objectif de cette deuxième formation était de me sensibiliser aux inégalités Hommes / Femmes dans les entreprises.
Je viens tout juste de recevoir le mail me confirmant que j’ai bien obtenu ce Label HF Manager :
Cher(e) étudiant(e),
Tu t’es porté(e) candidat(e) au Label HF Manager sur le campus de ton école. J’ai le plaisir, au nom de Companieros et de ton école, de te délivrer ce certificat qui atteste que tu as obtenu le Label HF Manager 2010.
Bravo ! Ce Label est la preuve que tu as acquis un certain niveau de connaissances sur la mixité Homme-Femme, que tu as une certaine capacité à prendre du recul et à questionner tes propres préjugés, et que tu as su faire preuve d’ouverture, en comprenant l’importance du dialogue au travers de rencontres fortes.
Ces savoirs, savoir-faire et savoir-être que tu as développé par cette expérience sont fortement recherchés par les entreprises : n’hésite pas à en parler lors de tes entretiens !
A très bientôt donc, et encore bravo
Je conseille vivement à tous les étudiants en ayant l’occasion, de participer aux formations proposées par l’organisme Companieros. Elles représentent un véritable plus pour l’élève ingénieur sur le plan personnel et plus tard, vraisemblablement, sur le plan professionnel.
Le futur par Microsoft
Si il y a bien une chose qui me passionne, c’est ce que nous réserve le futur sur le plan technologique et sur le plan humain.
L’explosion de l’informatique et de l’électronique au sein de notre société va vraisemblablement apporter des bouleversements sur notre façon de vivre bien au delà de ceux que nous connaissons aujourd’hui : biotechnologies, immersion dans des environnements virtuels, interfaces entre l’homme et la machine, sont autant de domaines qui évoluent à une vitesse telle, qu’il parait aujourd’hui presque impossible d’imaginer le monde au sein duquel nous vivrons dans 30 ans.
Microsoft a tenté d’imaginer certains aspects de notre monde en 2019. Je vous invite à découvrir la vidéo que je trouve très intéressante…
RDV en 2019 !
How to launch a symfony task from action code? Ou comment appeler une tâche symfony depuis une action, sans passer par le CLI ?
Symfony permet depuis la version 1.3 / 1.4 d’appeler une tâche directement depuis une autre tâche via le code suivant :
$this->runTask('mydomain:mytask');
On peut par exemple très facilement créer une tâche au cours de laquelle un appel à symfony cc sera déclenché :
<?php
class testTask extends sfBaseTask
{
protected function configure()
{
// // add your own arguments here
// $this->addArguments(array(
// new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
// ));
$this->addOptions(array(
new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'),
new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'doctrine'),
// add your own options here
));
$this->namespace = '';
$this->name = 'test';
$this->briefDescription = '';
$this->detailedDescription = <<<EOF
The [test|INFO] task does things.
Call it with:
[php 1="test|INFO" language="symfony"][/php][/php]
EOF;
}
protected function execute($arguments = array(), $options = array())
{
// initialize the database connection
$databaseManager = new sfDatabaseManager($this->configuration);
$connection = $databaseManager->getDatabase($options['connection'])->getConnection();
// here is our code
// we do something
// and we clear cache
$this->runTask('cc');
}
}
En revanche, rien n’est actuellement prévu pour appeler cette même tâche depuis une action. Il est pourtant très utile de pouvoir appeler la tâche d’envoi des emails directement depuis une action de son backend. Ou même de vider le cache sans avoir à passer par la ligne de commandes.
Le plugin ybRunTaskPlugin a été développé justement pour palier à ce manque. Une fois le plugin installé, il est possible d’appeler directement au sein de son action une tâche symfony, de la même manière qu’on pouvait le faire en standard au sein d’une autre tâche :
class myActions extends sfActions
{
public function executeRuntask(sfWebRequest $request) {
$ret = $this->runTask('myDomain:myTask', 'myArguments');
if(null != $ret) {
$this->msg = $ret->getMessage();
} else {
$this->msg = 'everything went OK';
}
}
}
Malheureusement, le plugin ne gère actuellement pas l’affichage des logs ou d’une quelconque valeur de retour si l’exécution s’est passé correctement. Peut-être dans une prochaine version ?
En attendant, vous pouvez réaliser un petit hack du plugin en fonction de vos besoins…
jQuery Tooltip
L’affichage d’une tooltip est l’un des besoins les plus récurrents pour un développeur Web. Le tooltip permet au développeur d’apporter une information supplémentaire à un élément de la page d’une manière esthétique et non intrusive.
Un tooltip pour quel besoin ?
Le tooltip permet d’afficher une information supplémentaire lors du survol d’une image, lors du passage sur le champs d’un formulaire. Il peut être associé à différents évènements sur n’importe quel élément d’une page, l’objectif étant de rendre la navigation plus claire et de déchargée la page d’informations superflues à un instant T.
Les solutions
De très nombreuses solutions de tooltip existent en Javascript. Comme je suis un grand fan de la bibliothèque jQuery, je vous propose de vous rendre sur cette page : http://www.webdesignbooth.com/15-jquery-plugins-to-create-an-user-friendly-tooltip/ qui donne un bon aperçu des Tooltip développés avec ce framework.
Ma solution préférée : jQuery Tools et son Tooltip.
Cette solution est très bien construite tout en restant légère (~5Ko). Il est possible de personnaliser l’animation de chargement de la tooltip, choisir sa position par rapport à l’élément déclencheur, y intégrer du texte mais aussi de l’HTML très simplement. Et tout le style est aisément modifiable dans la feuille CSS. Bref, que du bonheur !
Exemple de code
Le script :
<script type="text/javascript">
$(document).ready(function() {
$("#mon_image").tooltip({
position: "center right",
effect: "fade",
opacity: 0.7,
tip: '#tooltip'
});
});
</script>
Le code HTML :
<div id="tooltip"> </div> <img id="mon_image" title="Bahunet est un site de partage de cours génial !" src="http://www.bahunet.com/images/decoupe/logo.png" alt="logo Bahunet" />
Et le CSS :
#tooltip {
background-color: #000;
border: 1px solid #fff;
padding: 10px 15px;
width: 200px;
display: none;
color: #fff;
text-align:left;
font-size:12px;
box-shadow:0 0 10px #000;
-moz-box-shadow:0 0 10px #000;
-webkit-box-shadow:0 0 10px #000;
}
Je vous propose de consulter les différents exemples du site officiel et la documentation pour avoir plus d’informations et voir l’ensemble des possibilités offertes par ce plugin jQuery : http://flowplayer.org/tools/tooltip.html
De plus en plus de développeurs font le choix d’utiliser la plateforme WordPress pour développer l’ensemble d’un site internet et non pas seulement le blog. Cette démarche a l’intérêt de préserver très facilement une cohérence globale sur le site. Une seule gestion des utilisateurs, une seule gestion des commentaires, un seul routing…
Pour ma part, je préfère garder séparée la plateforme de blog WP du reste de mon site. Mais j’ai pourtant envie d’afficher la liste des derniers articles postés sur mon blog directement sur mon site. Comment faire ?
Les solutions
Le flux RSS
Une des solutions qui semble la plus retenue par les développeurs est la récupération et le parsing du flux RSS généré automatiquement par WordPress. Ce choix présente de nombreux avantages comme la possibilité de choisir le flux adapté à son besoin : tri par tag, par auteur, par catégorie…
En revanche, le parsing peut être un peu compliqué et semble moins performant qu’un accès direct en base. J’ai donc choisi d’utiliser une classe PHP qui récupère directement dans ma base de données WordPress les articles et informations associées. Si toutefois vous préférez la solution « Flux RSS », sachez que de très nombreux exemples pourront être dénichés sur les forums francophones dédiés à WordPress ou sur Google en général.
Récupération en base
La deuxième solution consiste donc à se connecter directement à la base de données de WordPress pour y récupérer à la demande les derniers articles et les informations associées.
En cherchant sur Google je suis tombé sur un projet de Peter Upfold dédié à ce sujet. Développé en PHP, cette classe permet après configuration de générer automatiquement le code HTML permettant de lister les derniers articles de son blog. Si vous cherchez une solution clé en main, je vous invite à consulter directement son site :
http://peter.upfold.org.uk/projects/wpget
Vous trouverez même à cette adresse un script permettant de générer automatiquement le fichier de configuration adapté à votre serveur (adresse base de données, nom d’utilisateurs, password…) :
http://peter.upfold.org.uk/projects/wpget/installer
Une fois le fichier wpget.php configuré, vous n’aurez plus qu’à écrire dans le code un bout de script semblable à celui ci-dessous pour insérer la liste de vos derniers articles correctement formatée en HTML :
<?php
include_once("./wpget.php");
$wpget = new wpGet;
$wpget->dateformat = "d/m/Y H:i";
$wpget->showcredit = false;
$wpget->getWordPressEntries(2, 200, true, true, true);
?>
Pour ma part, je cherchais une classe plus simple que je pourrai utiliser dans mon application symfony et qui me laisserai gérer la partie présentation manuellement. J’ai donc réécrit entièrement la classe de Peter Upfold pour finalement obtenir deux petites classes PHP 5 (tant qu’à faire !). La première gère la récupération des données en base et la deuxième représente de manière simple un article WordPress avec les getters et setters associés.
Je vous livre le code tel quel ci-dessous :
/*
Réécriture de la classe PHP de Peter Upfold (http://peter.upfold.org.uk)
pour récupérer la liste des derniers articles postés sur un blog WordPress.
@author: Olivier Balais (http://www.overnetcity.com)
*/
class WPEntries
{
protected $dbUser;
protected $dbPwd;
protected $dbHost;
protected $dbName;
protected $dbTablesPrefix;
protected $connection;
// Fonction trouvée à l'origine sur http://uk2.php.net/manual/en/function.substr.php#59719
private static function html_substr($posttext, $minimum_length = 200, $length_offset = 20, $cut_words = false, $dots = true)
{
// $minimum_length:
// The approximate length you want the concatenated text to be
// $length_offset:
// The variation in how long the text can be in this example text
// length will be between 200 and 200-20=180 characters and the
// character where the last tag ends
// Reset tag counter & quote checker
$tag_counter = 0;
$quotes_on = false;
// Check if the text is too long
if (strlen($posttext) > $minimum_length) {
// Reset the tag_counter and pass through (part of) the entire text
$c = 0;
for ($i = 0; $i < strlen($posttext); $i++) {
// Load the current character and the next one
// if the string has not arrived at the last character
$current_char = substr($posttext,$i,1);
if ($i < strlen($posttext) - 1) {
$next_char = substr($posttext,$i + 1,1);
}
else {
$next_char = "";
}
// First check if quotes are on
if (!$quotes_on) {
// Check if it's a tag
// On a "<" add 3 if it's an opening tag (like <a href...)
// or add only 1 if it's an ending tag (like </a>)
if ($current_char == '<') {
if ($next_char == '/') {
$tag_counter += 1;
}
else {
$tag_counter += 3;
}
}
// Slash signifies an ending (like </a> or ... />)
// substract 2
if ($current_char == '/' && $tag_counter <> 0) $tag_counter -= 2;
// On a ">" substract 1
if ($current_char == '>') $tag_counter -= 1;
// If quotes are encountered, start ignoring the tags
// (for directory slashes)
if ($current_char == '"') $quotes_on = true;
}
else {
// IF quotes are encountered again, turn it back off
if ($current_char == '"') $quotes_on = false;
}
// Count only the chars outside html tags
if($tag_counter == 2 || $tag_counter == 0){
$c++;
}
// Check if the counter has reached the minimum length yet,
// then wait for the tag_counter to become 0, and chop the string there
if ($c > $minimum_length - $length_offset && $tag_counter == 0 && ($next_char == ' ' || $cut_words == true)) {
$posttext = substr($posttext,0,$i + 1);
if($dots){
$posttext .= '...';
}
return $posttext;
}
}
}
return $posttext;
}
private static function convert_smart_quotes($string) // not mine either - thanks to Chris Shiflett at http://shiflett.org/archive/165
{
$search = array(chr(145),
chr(146),
chr(147),
chr(148),
chr(151));
$replace = array('‘',
'’',
'“',
'”',
'—');
return str_replace($search, $replace, $string);
}
public function __construct($dbUser = "", $dbPwd = "", $dbHost = "localhost", $dbName = "wordpress", $dbTablesPrefix = "wp_")
{
$this->dbUser = $dbUser;
$this->dbPwd = $dbPwd;
$this->dbHost = $dbHost;
$this->dbName = $dbName;
$this->dbTablesPrefix = $dbTablesPrefix;
}
public function getLastEntries($number = 2, $limit = null, $stripJavascript = true, $stripImages = true, $stripEmbed = true)
{
// Connexion à la base de données
try
{
$connection = new PDO('mysql:host='.$this->dbHost.';dbname='.$this->dbName, $this->dbUser, $this->dbPwd);
}
catch(Exception $e)
{
echo $e->getMessage();
die();
}
// Préparation de la requête
$request = $connection->prepare("SELECT `post_content`, `post_date`, `post_title`, `display_name`, `comment_count`, `guid`
FROM `".$this->dbTablesPrefix."posts` as posts
INNER JOIN `".$this->dbTablesPrefix."users` as users ON users.ID = posts.post_author
WHERE posts.`post_status` = 'publish' AND posts.`post_type` = 'post'
ORDER BY `post_date` DESC LIMIT ".$number.";");
// Récupération des articles
$articles = array();
try
{
$request->execute(array());
}
catch(Exception $e)
{
echo $e->getMessage();
die();
}
while ($result = $request->fetch(PDO::FETCH_OBJ))
{
$content = $result->post_content;
if ($limit > 0)
{
$content = stripslashes(self::html_substr($content, $limit, 20));
$content = self::convert_smart_quotes($content);
}
else
{
$content = self::convert_smart_quotes($content);
}
if ($stripJavascript)
$content = ereg_replace("<script.*</script>", "", $content);
if ($stripImages)
$content = ereg_replace("<img.*/>", "", $content);
if ($stripEmbed)
$content = ereg_replace("<embed.*</embed>", "", $content);
$article =
new WordPressArticle($content,
$result->post_date,
$result->post_title,
$result->display_name,
$result->comment_count,
$result->guid);
$articles[] = $article; // Ajout de l'élément à la liste à retourner
}
return $articles;
}
}
class WordPressArticle
{
protected $content;
protected $postDate;
protected $postTitle;
protected $authorName;
protected $commentsCount;
protected $link;
public function __construct($content = "", $postDate = "", $postTitle = "", $authorName = "", $commentsCount = "", $link = "")
{
$this->content = $content;
$this->postDate = $postDate;
$this->postTitle = $postTitle;
$this->authorName = $authorName;
$this->commentsCount = $commentsCount;
$this->link = $link;
}
public function setContent($content)
{
$this->content = $content;
}
public function getContent()
{
return nl2br($this->content);
}
public function setPostDate($postDate)
{
$this->postDate = $postDate;
}
public function getPostDate()
{
return $this->postDate;
}
public function setPostTitle($postTitle)
{
$this->postTitle = $postTitle;
}
public function getPostTitle()
{
return $this->postTitle;
}
public function setAuthorName($authorName)
{
$this->authorName = $authorName;
}
public function getAuthorName()
{
return $this->authorName;
}
public function setCommentsCount($commentsCount)
{
$this->commentsCount = $commentsCount;
}
public function getCommentsCount()
{
return $this->commentsCount;
}
public function setLink($link)
{
$this->link = $link;
}
public function getLink()
{
return $this->link;
}
}
Ci-dessous, un exemple de fonctionnement simplissime dans une application symfony.
Dans l’action :
/**
* Executes index action
*
*/
public function executeIndex()
{
$wpEntries= new WPEntries("db_user",
"db_pwd",
"localhost",
"wordpress",
"wp_");
$this->entries = $wpEntries->getLastEntries();
}
Dans la vue :
<ul> <?php foreach($entries as $entry): ?> <li><?php echo $entry->getPostTitle() ?></li> <?php endforeach ?> </ul>
Tout simplement !
N’hésitez pas à utiliser ce bout de code et à me faire un retour le cas échéant.
GMail est un outil fabuleux !
Longtemps j’ai refusé de fournir mes données à Google par principe. Je trouve très angoissant l’idée de voir l’intégralité de sa vie électronique gérée par une entreprise qui détient déjà le monopole de la recherche sur Internet.
Néanmoins, après de longs mois de résistance, il a bien fallu se rendre à l’évidence qu’aucun des Webmails disponibles sur le marché n’égale de près ou de loin GMail. Premier webmail à supporter correctement et gratuitement l’IMAP, support des comptes Exchange, intégration quasi parfaite dans la nébuleuse Google… J’ai bien tenté GMX pendant un moment mais son incapacité à gérer correctement les caractères unicode m’a poussé vers Google.
Mais comme rien n’est parfait, Gmail a lui aussi ses défauts. Et parmi ces défauts, on compte l’absence de gestion intégrée des signatures riches, c’est à dire, au format HTML. Difficile à comprendre d’ailleurs.
Plusieurs solutions existent. Celle que j’ai retenu utilise un script qui permet de créer un lien à ajouter dans vos favoris. Ce lien, une fois cliqué, insère dans le mail en cours de rédaction la signature associée. Des plugins existent pour Chrome et Firefox notamment visant à simplifier l’insertion de signatures dans GMail. Aucun ne m’a encore convaincu à l’heure actuelle…
Etape 1 :
Dans un premier temps, créez votre signature au format HTML. Il existe certainement des outils prévus à cet effet en ligne. Je vous donne ici le code de ma signature en exemple :
<p> <img src="http://www.francetelecom.com/sirius/logos_mail/obs_left.gif" width="94" height="40"> </p> <p style="font-family: Arial, sans-serif; margin-top: 0pt; margin-bottom: 5px; font-size: 10pt; color:#000000;"> <span style="font-weight:bold;">Olivier Balais</span> </p> <p style="font-family: Arial, sans-serif; margin-top: 0pt; margin-bottom: 0pt; font-size: 10pt; color:#000000;"> tel. 06.89.xx.xx.xx<br /> <a href="mailto:mon_mail@orange-ftgroup.com" style="font-family: Arial, sans-serif; font-size: 10pt; color:#ff6600">mon_mail@orange-ftgroup.com</a><br /> BU IT&Labs <br /> <a href="http://www.orange-business.com" style="font-family: Arial, sans-serif; font-size: 10pt; color:#ff6600">www.orange-business.com</a> </p> <p> <img src="http://www.francetelecom.com/sirius/logos_mail/ampersand.gif" width="18" height="20"> </p>
Vous constaterez que le CSS est inclut directement dans le code HTML sans passer par une feuille de style. En effet, la plupart des clients mails ne gèrent pas les feuilles de style externes. Il est donc préférable de gérer sa signature de la sorte. De la même manière, pour une signature un peu plus complexe que celle là, il est plus prudent d’utiliser les tableaux HTML plutôt que les propriétés float CSS.
Etape 2 :
Une fois votre code HTML préparé, rendez-vous sur cette page : http://projets.geekfg.net/?/1-how+to+insert+html+signature+in+gmail.htm, cliquez sur le bouton HTML, et collez votre code.
Cliquez sur le bouton TEXT pour vérifier si le rendu vous semble correct.
Appuyez ensuite sur GO STEP 2 pour continuer.
Etape 3 :
Le script a généré un lien à ajouter à vos favoris. Vous n’avez donc plus qu’à glisser / déposer ce lien dans vos favoris et à le renommer comme il se doit.
Désormais, quand vous rédigerez un mail dans GMail, vous n’aurez qu’à cliquer sur le favoris ainsi créé pour que la signature HTML s’insère automatiquement. L’avantage de cette technique est que vous pouvez créer plusieurs signatures différentes pour les différents profils professionnels et personnels que vous pouvez avoir.










