Views 2 : Afficher sur un node tous les nodes qui possèdent au moins un de ses tags en commun

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.

Cas concret : j'ai un article vidéo qui possède un tag (taxonomie) "hip hop" et autre tag "Missy Eliott" : comment afficher tous les nodes vidéos du site qui possèdent au moins un de ces deux tags avec views ?

Créer une vue avec un affichage de bloc, bloc que vous placerez sur les nodes de votre choix. Choisissez "taxonomy_term_id" comme argument de la vue; et choisissez "provide default argument" au format "php".
Entrez le code ci-dessous : il va retourner à la vue tous les tags d'un certains vocabulaire utilisés par le node actuellement vu.
Par exemple il retournera une chaine du type "101+103+156", qui voudra dire pour la vue "je dois aller chercher tous les nodes qui ont le tag (term id) 103 ou le tag 101 ou le tag 156.

<?php
  $vid
= 3; //mettre ici l'id vocabulaire dans lequel vous voulez chercher
 
$node = node_load(arg(1));
 
$tab = array_keys((taxonomy_node_get_terms_by_vocabulary($node, $vid)));
 
$arguments = implode('+', $tab);
  return
$arguments;
?>

Pensez à exclure le node actuel de la liste de résultat !
Comme notre vue est en bloc, les arguments ne sont pas reçu dynamiquement de l'url, il faut donc faire la manip suivante :
ajouez un argument "node nid", choisissez encore "provide default argument" puis choisissez "node nid from url" et enfin cochez tout en bas "excude the argument".

Ce qui en langage terrien signifie : je ne veux pas afficher le node actuel dans la liste des nodes possédant des tags similaires.

Aller un peu plus loin : Explications détaillées du code

Note : En réalité, sur un site exigeant au niveau des performances, il serait plus avantageux de créer une requete sql complète plutôt que d'utiliser les fonctions de l'API tel que node_load ou taxonomy_node_get_terms_by_vocabulary.
Notamment parce que la fonction node_load charge TOUT l'objet node et appelle tous les hooks lié à un node; ce qui est complètement inutile dans notre cas.
La fonction node_load dispose toutefois d'un systeme de cache lorsqu'elle est appelée plusieurs fois sur la même page mais j'ignore si cela suffit à compenser la surcharge de code induite.

<?php
  $vid
= 3;
 
// l'id du vocabulaire dans lequel on va chercher
  // les tags

 
$node = node_load(arg(1));
 
// pour la fonction qu'on va utiliser ci-dessous
  // on a besoin de récupérer l'objet node
  // on utilie la fonction node_load avec pour argument
  // le nid qu'on prend dans l'url avec arg(1)

 
$tab = array_keys((taxonomy_node_get_terms_by_vocabulary($node, $vid)));
 
// on utilise la fonction taxonomy_node_get_terms_by_vocabulary
  // de l'API de Drupal qui permet de récupérer tous
  // les termes d'un node en fonction d'un id de vocabulaire.
  // Cette fonction retourne les informations complètes des termes
  // (nom, description, tid etc...)
  // en utilisant la fonction array_keys, je peux récupérer uniquement
  // les term_id, qui est la données qui intéressent views
  // on obtient un tableau avec tous nos term ids.

 
$arguments = implode('+', $tab);
 
// je transforme le contenu du tableau en une chaine de caractères
  // de la forme 105+106+64
  // qui veut dire pour views
  // chercher les nodes dont les id de termes sont 105 OU 106 OU 64

 
return $arguments;
 
// je retourne à views l'argument
?>
Version de Drupal : 

Commentaires

Ha merci pour le lien, je le cherchais mais je ne retrouvais plus son nom.

En passant par view on peut avoir le controle totale des données affichées (quelle images, avec quel preset, quels champs, filtre supplémentaire par type de contenu, dans quel ordre etc...). Je ne suis pas sur que similar terms permettent de retrouver cette souplesse. Je le re-testerai dès que possible.