DotClear 2 : remplacer les liens par des images dans le blogroll
Par Benjamin le lundi 17 mars 2008, 13h42 - DotClear - Lien permanent - URL miniature
Simon H., fidèle lecteur de ce blog (ou individu uniquement intéressé par la réponse à son message, allez savoir) m'a demandé dans un courriel envoyé il y a peu si ma technique de remplacement des liens par des images dans le blogroll fonctionnait avec DotClear 2. J'ai donc adapté ce bon vieux code et, 3 ans, 3 mois et presque 3 jours (c'est ballot, j'aurais pu attendre encore un peu) après la publication sur ce blog extraordinaire de cette astuce, je vous donne la même chose mais en mieux et fonctionnant avec DotClear 2.
L'idée est donc de modifier le plugin qui gère le blogroll pour permettre l'utilisation d'images à la place des liens dans le blogroll.
Pour ce faire, on va indiquer le chemin vers l'image à la fin du champ "Titre", après le caractère "|" utilisé pour la séparation des 2 valeurs. On vérifiera par la suite si le titre contient ce caractère et on s'emploiera à séparer le titre du chemin vers l'image.
Dans cet exemple pris tout à fait au hasard, j'ai modifié le lien vers le site WebCiné, l'annuaire des sites de cinéma belges francophones 
J'ai tout d'abord sauvegardé le fichier original plugins/blogroll/_public.php.
Voici ensuite les modifications que j'ai apportées à la méthode "getLinksList()", à la ligne 89.
On remplace :
$title = $v['link_title'];
$href = $v['link_href'];
$desc = $v['link_desc'];
$lang = $v['link_lang'];
$xfn = $v['link_xfn'];
$link =
'<a href="'.html::escapeHTML($href).'"'.
((!$lang) ? '' : ' hreflang="'.html::escapeHTML($lang).'"').
((!$desc) ? '' : ' title="'.html::escapeHTML($desc).'"').
((!$xfn) ? '' : ' rel="'.html::escapeHTML($xfn).'"').
'>'.
html::escapeHTML($title).
'</a>';
par :
$title = $v['link_title'];
// [images dans le blogroll]
// on tente d'extraire l'url de l'image dans le titre
// on vérifie si la fin du titre contient un "|" suivi par l'url d'une image
$titleContainsImgUrl_b = preg_match("`^(.+)\|(.+(gif|jpe?g|png))$`i", $title, $result_at);
// on récupère l'url de l'image
$img = ($titleContainsImgUrl_b) ? $result_at[2] : "";
// on supprime l'url du titre
$title = ($titleContainsImgUrl_b) ? $result_at[1] : $title;
// [/images dans le blogroll]
$href = $v['link_href'];
$desc = $v['link_desc'];
$lang = $v['link_lang'];
$xfn = $v['link_xfn'];
$link =
'<a href="'.html::escapeHTML($href).'"'.
((!$lang) ? '' : ' hreflang="'.html::escapeHTML($lang).'"').
((!$desc) ? '' : ' title="'.html::escapeHTML($desc).'"').
((!$xfn) ? '' : ' rel="'.html::escapeHTML($xfn).'"').
// [images dans le blogroll]
((!$img) ? '' : ' class="blogrollLinkImg" style="background-image: url('.html::escapeHTML($img).')"').
// [/images dans le blogroll]
'>'.
// [images dans le blogroll]
//html::escapeHTML($title).
((!$img) ? html::escapeHTML($title) : '<span>'.html::escapeHTML($title).'</span>').
// [/images dans le blogroll]
'</a>';
Pour éviter de devoir indiquer le chemin complet depuis la racine dans chaque titre, on peut bien sûr ajouter le chemin de base vers les images dans le "background-image" comme suit, on n'aura plus alors qu'à indiquer le nom de l'image après le "|" dans les titres :
((!$img) ? '' : ' class="blogrollLinkImg" style="background-image: url(/chemin/de/base/vers/les/images/'.html::escapeHTML($img).')"').
On ajoute ensuite dans le fichier "style.css" du thème utilisé :
/* images des le blogroll */
a.blogrollLinkImg {
display: block;
width: 80px;
height: 15px;
background-repeat: no-repeat;
background-position: left top;
}
a.blogrollLinkImg[hreflang]:after {
content: "";
}
a.blogrollLinkImg span {
position: absolute;
left: -9999px;
top: -9999px;
}
Vous êtes libres de modifier la CSS comme bon vous semble, cela va de soi.
Lors de l'affichage des liens dans le blogroll, si le chemin vers une image est défini, le titre du lien sera masqué (la technique pour masquer l'élément est libre, celle que je donne ici n'est qu'un exemple) et c'est l'image qui sera affichée à la place, aux dimensions définies dans la CSS. Si vos images ont des tailles différentes, définissez la taille dans le PHP.
Voilà Simon H., j'espère que cette astuce te sera utile.
Commentaires
Utile ? GENIALE OUI
Merci énormément !
par contre, l'url vers l'image doit elle être absolue ? je déduis des explications données que oui, mais je ne suis pas sûr...
tu peux soit utiliser un chemin relatif depuis la racine :
PHP :
url('.html::escapeHTML($img).')"').
Blogroll :
Le nom de mon lien|/chemin/de/base/vers/les/images/mon-image.png
ou encoder directement dans le PHP le chemin de base vers ton dossier qui contient les images de tes liens :
PHP :
url(/chemin/de/base/vers/les/images/'.html::escapeHTML($img).')"').
Blogroll :
Le nom de mon lien|mon-image.png
bon ben j'essaie et je reviens embêter si jamais ça marche pas
ben ça marche mais je reviens quand même le dire
merci m'sieur !
hey petit bémol : le code généré n'est pas supporté par ma version beta de safari (3.1.525.13) sous windows.
sinon. A l'heure actuelle, le texte superpose l'image. Mais sous
, yabon 
Il serait peut être bon de voir si on peut changer ça ? Ce serait trop dommage pour les fans de la
je viens de faire un test avec Safari 3.0.4 et tout se passe bien
par acquis de conscience j'ai mis à jour Safari (3.1.525.13 aussi donc) et ça passe aussi
ben pô chez moi
)...
et encore moins sous mac (re
je poste le code sur le fofo DC pour voir qi quelqu'un peu inspecter ça ?
Voilà l'url d'un screen pour se rendre compte du soucis :
http://pix.toile-libre.org/?img=120...
tu peux essayer avec un "display: none;" pour le span
Hello c'est encore moi, je souhaitais demander si l'astuce est compatible avec la RC...
Je teste mais visiblement rien ne se passe :
http://simonh.toile-libre.org/log/
Si jamais tu as une idée je prends :p
Super pour les blogs BD...
Par contre, comme je voulais conserver le titre affiché, j'ai fait une version extrêmement simplifiée de ta modification en utilisant un explode() au lieu de la regex compliquée :
$title_img = explode("|",$v'link_title');
$title = $title_img0;
$img = $title_img1;
Ensuite, il suffit de tester si $img est défini :
$link =
(($img) ? '<img src="/' . $img . '">' : '') .
Pour le style, comme ma blogroll est dans un div de classe .links, je peux directement modifier leur affichage par héritage :
.links ul li img {
border:1px solid #ccc;
float:left
}
(j'espère que mon code sera lisible parce que la prévisualisation a l'air de virer les crochets et inventer des mises en forme).
Merci en tout cas pour ce tutoriel très clair.
(version avec le code correct)
Super pour les blogs BD...
Par contre, comme je voulais conserver le titre affiché, j'ai fait une version extrêmement simplifiée de ta modification en utilisant un explode() au lieu de la regex compliquée :
$title_img = explode("|",$v\['link_title'\]); $title = $title_img\[0\]; $img = $title_img\[1\];Ensuite, il suffit de tester si $img est défini, et si oui, d'afficher la balise img appropriée :
Pour le style, comme ma blogroll est dans un div de classe .links, je peux directement modifier leur affichage par héritage :
.links ul li img { border:1px solid #ccc; float:left }Merci en tout cas pour ce tutoriel très clair.
alors pour toi Toufou, ce soir, je vais décortiquer cette "regex compliquée" !
"`^(.+)\|(.+(gif|jpe?g|png))$`i"je te souhaite une très bonne soirée !
Moi j'ai essayé cette technique qui me plait beaucoup mais je n'ai aucune image qui s'affiche !
Avec la dernière version de dotclear 2.1.4
L'image n'apparait pas mais le lien fonctionne bien j'ai bien la main qui s'affiche et la redirection est bonne !
Si quelqu'un peut m'aider svp.
Salutations.
Nickel, clair, précis = adoption sur mon blog :o)

Bonjour,
Déjà merci pour ce tuto super qui marche nikel pour moi
Par contre je voulais savoir si il y avait une possibilité de forcer la taille et redimensionné l'image de manière homothétique ou ce n'est pas faisable ?