Mes nouvelles activités ne me laissent que peu de temps pour mettre à jour ce blog. En attendant une éventuelle reprise de mes divagations éditoriales, vous pouvez toujours parcourir les anciens articles. A+ et bonne lecture!

Thèmes Drupal : comment afficher un bloc entre un article et ses commentaires ?

Rubrique:

Dans ce petit exercice, nous allons voir comment afficher un bloc de contenu entre le corps d'un article et ses commentaires. Cela parait trivial, mais en fait, cela nécessite d'insérer un petit bout de code dans votre thème...

Dans Drupal, les blocs sont utilisés pour afficher des informations secondaires. Pour afficher un bloc, vous devez lui assigner un emplacement dans votre mise en page : la région. Les régions sont définies par votre thème dans le fichier ".info".

ex: extrait d'un fichier .info. On y a déclaré les régions classiques "header", "footer", et deux "sidebars" (barres latérales).


core = 6.x
engine = phptemplate
stylesheets[all][] = style.css
regions[header] = header
regions[sidebar_first] = sidebar first
regions[sidebar_last] = sidebar last
regions[footer] = footer

Si vous utilisez le moteur de thème PHPTemplate, chaque région est ensuite déclarée dans le gabarit "page.tpl.php". Il suffit de repérer le bon emplacement dans la structure XHTML de votre page puis de placer la variable correspondant à votre région.

ex: dans ce code extrait d'un gabarit "page.tpl.php" on va afficher le contenu de la première barre latérale à l'intérieur d'un div si et seulement si la région n'est pas vide (aucun bloc à afficher).


<?php if ($sidebar_first): ?>

<?php print $sidebar_first ?>

<?php endif; ?>

Cela est rendu possible, car avant le traitement de page.tpl.php, Drupal va créer les variables de région, comme $sidebar_first, et les rendre disponibles pour l'affichage.

Et si je voulais placer un bloc de texte entre l'article et les commentaires ?

Tout d'abord, je vais déclarer ma nouvelle région "inside node" dans le fichier .info:


regions[inside_node] = inside node

Puis il va falloir que je place la région au bon endroit. Là, cela se complique car, dans page.tpl.php vous n'avez qu'une variable $content qui contient à la fois l'article et les commentaires.

ex : placée dans le gabarit "page.tpl.php", cette commande "print" va afficher l'article et les commentaires. Impossible donc, d'intercaler une région entre les deux.


<?php print $content ?>

Il faut donc se rendre dans un autre gabarit, celui qui régit l'affichage d'un contenu (d'un noeud) : "node.tpl.php". Et là effectivement, on trouve au sein de la structure l'emplacement idéal pour placer notre nouvelle région.

ex: je place notre région "$inside_node" sous le contenu de l'article, par contre je ne l'affiche pas si je suis en mode aperçu (teaser).

<?php print $content ?>

<?php if ($inside_node && !$teaser): ?>
<?php print $inside_node; ?>
<?php endif; ?>

Et là, vous sauvegardez, vous videz le cache, vous assignez un bloc de contenu à votre région "inside node" et vous affichez. Et... Rien ne se passe !

C'est normal, lorsque Drupal traite "node.tpl.php", il n'a aucune connaissance des variables des régions, elles ne lui sont rendues disponibles que lors du traitement de "page.tpl.php". Il faut donc rendre la variable $inside_node disponible lors du traitement du gabarit node.tpl.php.

Comment faire ? Il faut ajouter un petit code dans le fichier template.php de votre thème.

ex : grâce à la fonction "preprocess_node" vous pouvez demander à Drupal de préparer certaines données avant le traitement du gabarit. Ici nous créons la variable "inside_node" et lui affectons le contenu des blocs placés dans la région du même nom.

<?php
function phptemplate_preprocess_node(&$vars) {
$vars['inside_node'] = theme('blocks', 'inside_node');
}
?>

Et voilà, tout est prêt. Drupal a maintenant toutes les informations nécessaires pour le traitement du gabarit d'un noeud. Après avoir sauvegardé et vidé le cache, vous assignez un bloc de contenu à votre région "inside node" et vous affichez. Normalement, si tout se passe bien, le contenu de votre bloc devrait s'afficher lorsque que vous êtes sur la page d'un contenu.

Sympathique non ?

Commentaires

  1. Merci beaucoup il y a un bon

    Merci beaucoup il y a un bon bout de temps que je cherchais cette solution sinon très très bon site Français sur drupal.

  2. Merci pour cet article qui en

    Merci pour cet article qui en plus d'être très instructif est d'une pédagogie irréprochable.
    Est-ce qu'on ne peut pas atteindre le même résultat en utilisant le module Views ? (je débute avec Drupal alors je suis peut-être à coté de la plaque ...)

  3. Rien ne s'affiche

    Bonjour,

    J'ai suivi vos instructions mais la région inside_node ne s'affiche pas dans la liste des régions sur http://localhost/drupal/admin/build/block
    J'ai pourtant bien modifié node.tpl, zen.info et template.info puis vidé le cache.

  4. regarde du coté de se

    regarde du coté de se site

    Sinon regarde bien que tu modifies le .info du bon templete et que tu vides le cache par admin/settings/performance et pas par celui de ton navigateur.

  5. Très sympatique !

    Merci encore !

    Et merci à Yoan pour la petite précision sans laquelle on peut toujours attendre que la région apparaisse ^^ !

 

Guided search