La suggestion de templates dans Drupal 6, quelques exemples
Bonjour à tous ! Cette fois, j'ai envie de partager avec vous une technique très utile car elle permet véritablement de prendre le contrôle sur n'importe quel élément d'affichage: La suggestion de template. Pour cela, je vais vous montrer des exemples simples.
Présentation
Drupal affiche différents éléments dans des gabarits HTML + PHP qu'on appelle templates. Ainsi que ce soient les pages, les nodes, les blocs ou encore les views, tous ont un template php par défaut. Mais que se passe-t-il si nous voulons différencier la structure et le composition de certaines pages, nodes, blocs ou views ? C'est là qu'intervient la suggestion de templates.
Comment ça marche ?
Les templates sont contenus dans des fichiers .tpl.php. Ils sont présents dans le coeur, les modules et les thèmes dans Drupal. Ceci dit pour vos templates personalisés, il faudra les mettre dans le dossier du thème que vous utilisez. En général, il faudra copier dans le dossier de thème à la fois le template de base (exemple: node.tpl.php) et ajouter éventuellement d'autres templates de suggestion (exemple: node-story.tpl.php).
Dans cet exemple sur les nodes, vous pourrez ainsi avec le fichier node.tpl.php, faire des modifications pour tous les nodes. Alors qu'avec le fichier node-story.tpl.php, vous y mettrez les modifications qui sont propres aux nodes de types articles. Voilà, c'est donc plutôt simple à mettre en place. :-)
Qu'est-ce que la suggestion de templates ?
Lorsque Drupal affiche ses contenus, il va récupérer les templates. L'idée est de suggérer des templates alternatifs sur plusieurs niveaux qui seront prioritaires par rapport à celui par défaut. Voici la liste des templates et des suggestions disponibles avec les modules de base de Drupal: http://drupal.org/node/190815 .
Il faut aussi savoir que plusieurs modules que vous ajoutez à Drupal contiennent aussi des templates (par exemple views, cck).
Pour avoir les fichiers tpl.php originaux, il suffit d'aller dans le dossier du module en question et de les copier.
Attention pour certains thèmes qui contiennent déjà des templates modifiés dedans; par exemple, des fichiers de template: node.tpl.php, block.tpl.php, comment.tpl.php etc. Dans ce cas, il faudra se baser sur ceux-là.
Exemples de suggestions avec des types de nodes
Comme vous avvez pu le voir sur cette page: http://drupal.org/node/190815 , pour les nodes nous pouvons suggérer le type de node afin d'avoir un template différent pour un type donné. Par exemple, par défaut nous avons deux types de contenu de node: Articles et pages qui ont comme nom de variable dans le système "story" et "page":
Nous avons donc le fichier node.tpl.php que l'on peut copier depuis le dossier du module node. Ainsi, nous pouvons créer à partir de ce template, les suggestions node-story.tpl.php et node-page.tpl.php. Ainsi, pour spécifier une suggestion type de node nous ajoutons le type après un tiret à la suite du nom du template qui précède son extension tpl.php.
Intéressons-nous au contenu de ce template:
<div id="node-<?php print $node->nid; ?>" class="node<?php if ($sticky) { print ' sticky'; } ?><?php if (!$status) { print ' node-unpublished'; } ?> clear-block">
<?php print $picture ?>
<?php if (!$page): ?>
<h2><a href="<?php print $node_url ?>" title="<?php print $title ?>"><?php print $title ?></a></h2>
<?php endif; ?>
<div class="meta">
<?php if ($submitted): ?>
<span class="submitted"><?php print $submitted ?></span>
<?php endif; ?>
<?php if ($terms): ?>
<div class="terms terms-inline"><?php print $terms ?></div>
<?php endif;?>
</div>
<div class="content">
<?php print $content ?>
</div>
<?php print $links; ?>
</div> Je ne vais pas détailler ce template et son contenu (les variables sont documentés en commentaires en haut du fichier). Pour notre exemple, nous allons faire quelque chose de très simple:
Imaginons que je ne veux pas que les termes de taxonomy apparaissent sur les nodes de types pages. Je vais alors copier le contenu de node.tptl.php dans un template node-page.tpl.php dans lequel je vais supprimer le bout de code suivant:
<?php if ($terms): ?>
<div class="terms terms-inline"><?php print $terms ?></div>
<?php endif;?>
</div>
Un autre exemple plus subtile aller plus loin: Imaginons que je veuille que la taxoxonomy apparaisse uniquement sur les teasers (les résumés des nodes) . Autrement dit, si nous ne sommes pas en mode pleine page du node, la taxonomy doit apparaitre; j'ajoute alors cette condition php avec ce bout de code:
<?php if (!$page): ?>
<?php if ($terms): ?>
<div class="terms terms-inline"><?php print $terms ?></div>
<?php endif;?>
</div>
<?php endif; ?>
Un dernier exemple aussi simple: On veut que le petit paragraphe avec la date de publication n'apparaisse que pour les nodes de type articles. Alors on va créer un fichier de template node-story.tpl.php dans lequel on ne touche à rien. Cependant pour les autres types nodes (node.tpl.php et node-page.tpl.php), nous allons supprimer ce bout de code:
<?php if ($submitted): ?>
<span class="submitted"><?php print $submitted ?></span>
<?php endif; ?>
Voilà, pour les exemples !
Les possibilités de personnalisation de templates sont très nombreuses et si on se penche sur les variables php disponibles on peut vraiment faire presque tout ce que l'on veut !
C'est en utilisant cette méthode que j'ai pu mettre en place pour le site d'un client, des templates différents pour différents champs de contenu CCK personnalisés. Dans ce projet, j'ai ainsi pu ajouter des listes html (<ul> et <li>) pour des champs imagefield et certains attributs pour des champs textes spécifiques. C'est dire combien la personnalisation et les suggestions de templates sont utiles pour arriver à faire presque tout ce qu'on veut !
Sur ce bon Drupal et à bientôt ! ;-)
