re-bonjour,
la plupart des modules implémentent des templates. Ceux-ci étant un peu plus lent, ils sont plutôt utilisés lorsqu'il y a de grosses portions de code html. Lorsque il y a au contraire énorment de logique de code pour deux balises qui se courent après, on utilise plutôt des fonctions de thème.
Une recherche *.tpl.php dans modules m'a fournit 42 fichiers. Il y en a quand même pas mal dans les modules du core…
j'ai réouvert le code d'un site pour voir comment j'avais procédé. C'est effectivement un des cas ou on se dit, c'est tout c… mais fastidieux à obtenir… heureusement une grande partie des éléments se thèment plus facilement.
Il y a plusieur manière de réaliser cela:
1) réecrire toute la fonction de thème.
2) Laisser le core faire le gros du sale boulot en changeant juste ce que l'on souhaite: ici je déclare une fonction de thème afin de réecrire les textes des liens (english, français) dans la version courte (en, fr)
Ceci est réalisé en changeant le contenu de $variables et en laissant drupal faire le reste.
function mytheme_links__locale_block($variables)
foreach ($variables['links'] as $key => $link) {
$variables['links'][$key]['title'] = $link['language']->language;
}
// j'apelle la fonction de thème originale afin de ne pas tout réecrire ^^.
return theme('links',$variables);
}
3) Si on souhaite absolument utiliser un template, on peut transformer une fonction de thème en template!
quelques précisions:
* C'est un peu plus de charge pour le serveur, surtout dans le cas du bloc locale qui n'a pas de cache (car son contenu change tout le temps).
* Si on définit aussi la fonction de thème dans template.php, celle-ci aura la priorité.
* Le module implémentant le thème d'origine n'ayant pas prévu de faire un template, les variables ne sont pas préparées pour le template, on devra donc faire ce job nous-même.
* Pour un dev, c'est une excellente façon de draguer la jolie intégratrice-graphiste qui sera toute heureuse de ne pas voir de code.
Voici comment faire (à bien tester bien sûr!):
On déclare une fonction de preprocess qui se chargera de préparer nos variables, dans template.php:
function mytheme_preprocess_links__locale_block(&$variables) {
$links = array();
foreach ($variables['links'] as $link) {
// url() ou l() acceptent $options en paramètre qui se chargent de générer la bonne url, notament selon la langue et nos règlages (en.site.com, site.en, site.com/en etc.) et la structure obtenue ($link) est déjà prête pour correspondre à $options.
// on aurait pu en code générer le lien grâce à l($text,$href,$options) en définissant $link['html'] = true, et en insérant notre image dans $text, mais du coup, le template aurait été superflu…
$links[] = array(
'href' => url($link['href'],$link),
'attributes' => drupal_attributes($link['attributes']),
'language' => $link['language']->language,
);
}
$variables['links'] = $links;
}
On crée un fichier links--locale-block.tpl.php dans notre thème. La nomenclature est la même, les _ deviennent des - comme pour tout template.
<ul class="locale-links inline">
<?php foreach ($links as $link): ?>
<li class="<?php print $link['language'] ?>">
<a href="<?php print $link['href'] ?>" <?php print $link['attributes'] ?>>
<img src="/<?php print $directory ?>/images/flag-<?php print $link['language'] ?>.png" alt="<?php print $link['language'] ?>" />
</a>
</li>
<?php endforeach; ?>
</ul>
J'ai utilisé la variable $directory, que je n'ai pas du préparer, car elle est définie dans template_preprocess() et ainsi disponibles dans tous les fichiers de template.
Et le résultat final:
<ul class="locale-links inline">
<li class="en">
<a href="/en/content/openning-hours" class="language-link" title="Openning hours">
<img src="/sites/all/themes/mytheme/images/flag-en.png" alt="en" />
</a>
</li>
<li class="fr">
<a href="/fr/content/horaire-douverture" class="language-link" title="Horaire d'ouverture">
<img src="/sites/all/themes/mytheme/images/flag-fr.png" alt="fr" />
</a>
</li>
</ul>