DotClear 2 : remplacer les liens du plugin Menu Freshy par des images
Par Benjamin le mercredi 26 mars 2008, 20h41 - DotClear - Lien permanent - URL miniature
Suite à la publication de la modification pour afficher des images à la place des liens dans le blogroll sous DotClear 2, Francis T. m'a demandé sur le forum DotClear si ladite modification pourrait fonctionner avec le plugin "Menu Freshy". Oui Francis, c'est possible. Voici comment.
L'idée est donc de modifier le plugin Menu Freshy pour permettre l'utilisation d'images à la place des liens dans le menu généré par le plugin.
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/menuFreshy/_public.php.
Voici ensuite les modifications que j'ai apportées à la méthode "getLinksList()", à la ligne 87.
On remplace :
default: // Les themes studiopress et freshy et les autres
foreach ($links as $v)
{
$title = $v['link_title'];
// [images dans le menu freshy]
// 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 menu freshy]
$href = $v['link_href'];
$desc = $v['link_desc'];
$lang = $v['link_lang'];
$xfn = $v['link_xfn'];
// Si c'est le premier on lui met une classlien
if ($first==true){
$classlien=" class=\"first_menu\" ";
$first=false;
} else {
$classlien="";
}
// Si ce doit être le dernier
if ($xfn=="me"){
$classlast=" last_menu";
$classlienlast=" class=\"last_menu\"";
$classitem=$classlast;
} else {
$classlast="";
$classlienlast="";
$classitem="page_item";
}
$link =
'<a href="'.html::escapeHTML($href).'"'.
((!$lang) ? '' : ' hreflang="'.html::escapeHTML($lang).'"').
((!$desc) ? '' : ' title="'.html::escapeHTML($desc).'"').
((!$xfn) ? '' : ' rel="'.html::escapeHTML($xfn).'"').
// [images dans le menu freshy]
((!$img) ? '' : ' class="menufreshyLinkImg" style="background-image: url('.html::escapeHTML($img).')"').
// [/images dans le menu freshy]
$classlien.$classlienlast.
'><span>'.
html::escapeHTML($title).
'</span></a>';
par :
default: // Les themes studiopress et freshy et les autres
foreach ($links as $v)
{
$title = $v['link_title'];
// [images dans le menu freshy]
// 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 menu freshy]
$href = $v['link_href'];
$desc = $v['link_desc'];
$lang = $v['link_lang'];
$xfn = $v['link_xfn'];
// Si c'est le premier on lui met une classlien
if ($first==true){
$classlien=" class=\"first_menu\" ";
$first=false;
} else {
$classlien="";
}
// Si ce doit être le dernier
if ($xfn=="me"){
$classlast=" last_menu";
$classlienlast=" class=\"last_menu\"";
$classitem=$classlast;
} else {
$classlast="";
$classlienlast="";
$classitem="page_item";
}
$link =
'<a href="'.html::escapeHTML($href).'"'.
((!$lang) ? '' : ' hreflang="'.html::escapeHTML($lang).'"').
((!$desc) ? '' : ' title="'.html::escapeHTML($desc).'"').
((!$xfn) ? '' : ' rel="'.html::escapeHTML($xfn).'"').
// [images dans le menu freshy]
((!$img) ? '' : ' class="menufreshyLinkImg" style="background-image: url('.html::escapeHTML($img).')"').
// [/images dans le menu freshy]
$classlien.$classlienlast.
'><span>'.
html::escapeHTML($title).
'</span></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="menufreshyLinkImg" 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 menu freshy */
li.page_item {
list-style: none;
}
a.menufreshyLinkImg {
display: block;
float: left;
width: 80px;
height: 15px;
background-repeat: no-repeat;
background-position: left top;
}
a.menufreshyLinkImg[hreflang]:after {
content: "";
}
a.menufreshyLinkImg 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 Menu Freshy, 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.
Commentaires
Bonjour,
Je cherche depuis plusieurs jours à faire fonctionner Dotclear 2 avec le thème studiopress et le menu freshy pour avoir des onglets. Je connais bien html pour avoir réaliser plusieurs sites avec dreamweaver mais c'est mon premier blog...et la je cale! Je ne comprends pas quel fichier il faut modifier (par exemple le fichier_public.php n'existe pas dans le menu freshy lors qu'on édite le thème avec l'interface dotclear) et rien n'est documenté sur ce qu'on trouve sur les templates...Peut-on utiliser un éditeur évolué (dreamweaver par exemple) et existe-t-il une documentation sur ces thèmes et sur l'architecture de Dotclear (pas le petit dotclear illustré SVP qui parle de tout un tas de choses mais on ne sait jamais à quoi ça se rapporte ni à quel fichier). Quand je vois la propreté du code si dessus, je me dis qu'il doit exister un moyen de travailler de façon organisée..!
Merci pour votre aide
pas de dlimfeifer !
je n'ai pour ma part jamais utiliser le plugin Menu Freshy, si ce n'est pour le modifier pour lui permettre d'afficher des images à la places des liens suite à une demande faite pour quelqu'un, je te conseille donc d'aller poser ta question durectement sur le forum d'aide de la communauté DotClear à l'adresse : http://forum.dotclear.net/viewforum.php?id=11