HOWTO : Afficher un bloc contextuel

La documentation Drupal 6 n'est plus maintenue et en cours de dépublication.


Consultez le guide utilisateur Drupal en français directement sur drupal.org.

Le module Views permet, entre autres, de créer des blocs. Ceux-ci peuvent ensuite être insérés dans la mise en page depuis la page d'administration des blocs (/admin/block).

Malheureusement, les blocs ainsi générés afficheront toujours le même contenu quelle que soit la page sur laquelle ils s'afficheront. Cet article vous propose de créer un bloc dont le contenu sera filtré en fonction de la catégorie du noeud affiché.

Imaginons un site web discutant de football et donnant les résultats pour la France. D'un côté vous avez les équipes de football, chaque équipe étant rattachée à un(*) championnat (L1, L2, Nationale, CFA...) par le biais d'une catégorie "Championnat". De l'autre côté vous avez les résultats sportifs, chaque résultat étant également rattaché à un championnat. Il peut être intéressant d'avoir sur la page d'une équipe les résultats des autres équipes de son championnat.

Avec Views, créons une vue "bloc" qui affiche la liste des résultats sportifs (le but de cet article n'étant pas de vous apprendre à créer des vues, nous ne nous étendrons pas plus sur le sujet). Si nous la collons sur toutes les pages, elle affichera les résultats sportifs de toutes les ligues, indépendamment de la page où elle se trouve.

bloccontextuel-editvue.png

C'est là qu'interviennent les "arguments" de la vue. Dans la zone "Arguments" de la vue, ajouter un argument "Taxonomie : identifiant de terme". Dans la liste déroulante "Par défaut", sélectionnez "Retour Page non trouvée". Cela aura pour effet de ne pas afficher le bloc sur les pages ne répondant pas aux critères. Laissez les autres valeurs du champs vides.

bloccontextuel-arguments.png

L'astuce de cet article arrive maintenant. Tel quel, le bloc n'utilise pas les arguments car Views va traditionnellement chercher les arguments dans l'URL. Or, dans le cas d'un bloc, l'URL est réservée au noeud affiché et non au bloc lui-même. Donc pas d'argument.

Il faut utiliser la zone "Code de gestion d'argument".

bloccontextuel-argumentcode.png

Copier-coller le code suivant dans cette zone :

<?php
// Ne fonctionne que dans le cas d'une vue 'block'
if($type=='block') {
 
$vocabulary_id=1; // Vocabulaire rubrique

  // Cela fonctionne uniquement sur les pages noeuds
 
if (arg(0) == 'node' && is_numeric(arg(1)) && is_null(arg(2))) {
   
// Récupère les termes du vocabulaire désigné pour le noeud en cours
   
$nid = (int)arg(1);
   
$terms=taxonomy_node_get_terms_by_vocabulary($nid,$vocabulary_id);

   
$tids=array();
    foreach(
$terms as $term) {
     
$tids[]=$term->tid;
    }

   
$ltids=implode(' ',$tids);

   
// Si la liste des termes n'est pas vide...
   
if(strlen($ltids)>1) {
     
$args[0]=$ltids;
    }
  }
}
?>

Note : ne recopiez pas les balises d'ouverture et de fermeture de PHP.

Cet exemple récupère les termes du noeud principal (celui affichant dans le corps de la page) pour les passer en argument, c'est tout ! Pour le réutiliser, déterminez l'identifiant de la catégorie (ici l'ID n°1) et affectez-le à la variable $vocabulary_id.

Pour toute adaptation à vos besoins, le code a besoin uniquement de positionner la variable $args aux bonnes valeurs. Il s'agit d'un tableau indexé 0,1,2,3... où 0 est le premier argument tel qu'il est listé dans la zone "Arguments".

L'exemple prend en compte le cas des valeurs multiples. Pour les transmettre à la vue dans $args, il suffit de les mettre dans une chaîne séparés par des espaces (ex: "10 11 24 12").

(*) Les puristes me pardonneront cet simplification pour l'exemple.

Version de Drupal :