Autour du Node Reference...

Version imprimableEnvoyer à un amiversion PDF

Le Node Reference est l'une des fonctionnalités les plus pratiques de Drupal. Il permet de créer très facilement des liens entre les contenus de votre site, pour quelque raison que vous ayez besoin d'en faire. Je parle ici de relations statiques créées par l'utilisateur (entre tel noeud et tel noeud) et non de relations dynamiques telles qu'on pourrait en créer avec Views ou la taxonomie. Petit tour d'horizon de quelques solutions et recettes pratiques qui aident à mieux l'utiliser. Pour rappel, le Node Reference est un module qui dans Drupal 6 voyage avec le CCK.

Le problème ne se pose pas au débutant qui découvre Drupal, mais deux grandes problématiques émergent rapidement dès que l'on commence à modéliser des relations complexes entre contenus :

  • puis-je référencer un noeud qui n'existe pas (et donc le créer en même temps) ?
  • comment voir la liste des noeuds qui référencent un contenu donné ?

Comme toujours avec Drupal, il existe plusieurs réponses à ces deux questions. Votre choix dépendra toujours du projet sur lequel vous travaillez : allez-vous être le seul à intervenir sur le site, ou n'êtes-vous que maître d'oeuvre d'un site largement communautaire ? y aura-t-il souvent besoin de créer des relations de noeud à noeud, ou cela n'arrivera-t-il que rarement ? ... 

Des solutions hors "Node Reference"

Avant de nous attaquer au NR lui-même, n'oublions pas qu'il existe d'autres solutions pour créer des relations d'un contenu à l'autre.

Le module Book

Ce module permet de constituer des regroupements de noeuds, appelés "Books" (la traduction française a retenu le mot Livre, je pense que Dossier aurait été plus approprié), que l'on peut ordonner librement et selon plusieurs niveaux hiérarchiques. A lui tout seul, ce module mérite un coup de projecteur similaire à celui-ci (sur le NR) car de nombreux modules s'appuient dessus et en étendent les potentialités.

  • avantages : inclus dans le core (D6, D7), liaisons automatiques
  • inconvénients : liaisons forcément hiérarchiques, et l'organisation peut devenir compliquée si de nombreuses personnes peuvent ajouter des pages

A retenir plutôt pour constituer une documentation, et seulement si quelques personnes peuvent gérer l'organisation.

Le module Insert Node

Ce module inclue un noeud dans un autre. Ce n'est pas un champ distinct, c'est un filtre dans le corps du texte.

  • avantages : simplicité, différents paramètres d'inclusion
  • inconvénients : peu commode pour gérer l'affichage, risque d'encombrer un contenu si vous en incluez trop, il faut connaître le nid du contenu que l'on veut inclure, la relation de contenu à contenu est perdue dans le corps du texte (donc irrécupérable en tant que telle).

A retenir plutôt dans le cas où vous avez peu de relations à créer, où vous les créez vous-même (nécessité de connaître le nid, rappelons qu'il est caché si vous utilisez Pathauto, il faut savoir le retrouver) et où vous n'avez pas besoin de ces relations pour construire la navigation de votre site. Par exemple, vous tenez un blog personnel et au détour d'un article vous citez celui d'hier : vous pourrez fournir à vos lecteurs un petit aperçu ou un lien.

 

 

Abordons à présent le vif du sujet. Pour simplifier la démonstration, j'envisage un type de contenu Auteur et un type de contenu Livre (j'ai fait des études littéraires), avec un auteur Joseph Conrad et un livre Lord Jim (que je vous recommande, soit dit en passant). Devinez qui a écrit Lord Jim ?

Cas particulier : créér le Livre depuis l'Auteur

Sur la page d'un auteur, je veux un lien "Ajouter un livre". Un peu comme sur une page de Book je peux cliquer sur "Add child page". C'est exactement à cela que sert Node Reference URL. C'est extrêment pratique mais à condition qu'un livre ne puisse avoir qu'un auteur.

Créer et référencer en même temps

Il arrive souvent qu'on se lance dans la création d'un noeud, et arrivé au champ Node Reference on s'aperçoit que l'on n'a pas encore créé le noeud que l'on veut référencer. Si l'on sort du formulaire de création du noeud sans l'enregistrer, tout le travail déjà effectué est perdu. D'où l'intérêt de pouvoir créer un noeud à la volée. Ici, je veux pouvoir créer un Auteur quand je crée un Livre.

C'est possible, et de plusieurs manières. Deux cas peuvent se présenter.

Il n'y a pas de champ dans le type de contenu Auteur, ou ils ne sont pas nécessaires pour le titre.

Alors la solution la plus simple (que je connaisse) est Node Reference Create. Je taperai Joseph Conrad dans le champ Node Reference du livre et Jo sera créé en même temps que son livre. S'il y a des champs dans le type de contenu Auteur, je n'aurai qu'à éditer le noeud Joseph Conrad.

Il est nécessaire de remplir complètement le type de contenu Auteur.

Mon type de contenu Auteur prévoit un champ Nom, un champ Prénom, un champ Nationalité (Conrad était Polonais naturalisé Anglais, minute culturelle) et un champ Dates (naissance et mort). Le titre est géré par Automatic NodeTitles + Token pour avoir toujours de beaux titres qui ressemblent à Conrad, Joseph. Dans ce cas, je veux pouvoir accéder au formulaire de création d'Auteur sans quitter celui de création de Livre, car j'ai déjà tapé le résumé et tout le bien que je pensais de Lord Jim, alors je ne veux pas perdre mon travail.

Et là aussi, il y a plusieurs solutions. (on va l'abréger en YAPS).

  1. dans la "description" du champ Node Reference, créer un lien (oui, un a href de grand-papa, ça marche toujours) vers node/add/auteur ; ne pas oublier le target="blank". Le noeud n'est pas référencé automatiquement. Mais ça fonctionne, je vous le garantis.
  2. le module Pop-up:Add'n Reference
  3. le module NodeRelationships, en ayant activé sur ce champ l'option "Create and Reference".
  4. je crois qu'un module de la suite développée pour France 24 / RFI permet cela aussi, mais je ne l'ai pas testé (ni la suite elle-même du reste).

Les solutions "avec module" sont en général très user-friendly, et vous les retiendrez sans doute si vos contributeurs sont nombreux et peu techniciens. Mais ces modules dépendent souvent eux-mêmes de plusieurs autres. Ils vous demanderont donc plus de maintenance et de paramétrage.

Mise à jour 15 février 2010 : il y a quelques jours est apparu le module Node Widget, qui permet de créer à la volée un noeud référencé en remplissant directement certains champs de ce contenu. Il résout donc les deux cas distingués ci-dessus. Module à suivre.

Dans un contenu donné, voir tous les contenus pointant vers ce dernier

Maintenant, supposons que sur la page d'Oncle Jo, je veuille voir apparaître sa bibliographie.

YAPS !

En passant par une vue

Il est tout à fait possible d'utiliser une vue pour cela. Elle est même déjà toute prête, pour peu que vous ayez activé le module Search : elle s'appelle Backlinks et il suffit de l'activer. Que fait-elle ? elle cherche dans un noeud tous les liens vers un autre noeud. Dans la page d'un noeud, un onglet apparait (à côté de "view" et "edit") : "what links here". Un petit coup de cron si nécessaire et vous verrez Lord Jim associé à Joseph Conrad.

  • Avantages : simplicité (c'est déjà prêt), et (sauf erreur de ma part) la vue reconnait aussi bien les liens dans le corps de texte que les liens via Node Reference.

Vous pouvez aussi créer vous même une vue : c'est ce que j'ai fait pour afficher dans un bloc à droite des modules la liste des études de cas et comparaisons qui référencent un module. Posez comme argument le champ Content:Auteur en choisissant "provide default argument : NID from URL" ; mettez le filtre Node:Type=Livre. Vous pouvez également utiliser les relations (reportez-vous à la documentation existant par ailleurs sur les relationships dans Views). Libre à vous de l'utiliser comme bon vous semble : si vous souhaitez qu'elle s'affiche sur la page de l'auteur, vous pouvez en faire un bloc ou utiliser Insert Views ou Views Reference, Panels, etc. (Merci à celui qui a hoqueté "YAPS", c'est gentil de suivre)

  • Avantage : totale personnalisation
  • Inconvénient : complexité à paramétrer

 

Mais une vue est un objet qui n'existe pas : c'est le résultat d'un calcul. Il peut être préférable d'utiliser un champ Node Reference qui serait rempli automatiquement. On pourrait alors travailler sur ce champ (l'inclure dans une vue ou récupérer des variables). Et moi je serais une princesse et un méchant dragon voudrait détruire mon château.

Les modules de "référence réciproque"

J'en connais deux, qui fonctionnent à peu près pareil en surface (je ne suis pas allée gratter la peinture) : Corresponding Node Reference et BackReference. Testez les deux, et le premier qui m'explique la différence gagne l'expression de ma très haute considération. Notez que j'ai trouvé un moyen d'intégrer (à l'arrache) CNR et Node Reference URL, ainsi que je l'ai expliqué à un utilisateur (je parle aussi anglais).

Le module NodeRelationships fournit aussi le même service, en plus élaboré.

Ces modules nécessitent un peu de concentration (appeler dans le type de contenu x le champ y du type de contenu z qui référence des contenus de type β qui eux-mêmes ont un champ a qui référence des contenus √r², cartographiez la modélisation et trouvez l'âge du capitaine)... Il vaut mieux ne pas essayer de les configurer trop tard le soir.

Le cas du module NodeReferrer

Le module NodeReferrer est encore une autre solution (ce sera la dernière, je vous rassure), un peu différente. On crée dans le type de contenu Auteur un champ de type NodeReferrer (distinct du type Node Reference). Il n'y a qu'un seul widget (Read-only List) parce qu'en fait, comme on va le comprendre un peu plus tard, ce n'est pas l'utilisateur qui remplit ce champ (automatique). On le paramètre, et dès qu'un Livre référence un Auteur, on voit sur la page de l'Auteur le titre du Livre (et après tout, c'est bien ce qu'on voulait). Les paramètres permettent de décider combien de Livres on va afficher, et dans quel ordre.

 

Et maintenant à vous de jouer et de vivre de belles aventures avec le Node Reference !

J'ouvre les commentaires pour vous permettre de réagir/compléter mais, conformément à la politique des lieux, je ne passerai pas (et je supprimerai) les commentaires demandant de l'aide pour un problème précis voire sans rapport avec la choucroute : il y a des forums pour ça. Merci !

Le cas Node Widget

Bonjour,

 

Je voudrais juste apporter mon point de vue sur Node Widget.

 

C'est un très bon module, qui permet, comme l'a ajouté Marie-Hélène de créer un noeud référencé 'à la volée' (en choisissant les champs à remplir) dans le formulaire de création d'un autre type de contenu.

 

J'ai voulu m'en servir pour permettre à un utilisateur de créer la fiche de son entreprise (les éléments essentiels) dans le même formulaire que sa fiche de Profil personnelle demandée à l'inscription.

Très bien si celui-ci n'a pas déjà la fiche de son entreprise référencée dans le site. En effet, si on a choisi dans le champ 'Node Widget' de donner à remplir des champs obligatoires (typiquement le Titre du noeud), il est impossible de valider le formulaire Profil perso, ni de dire que l'on appartient à telle Entreprise déjà référencée.

J'ai essayé de contourner le problème avec Conditionnal Fields, sans succès... En effet, ce dernier permet seulement de cacher/rendre inactif des champs par Javascript, mais ne les supprime pas complètement du DOM : les champs obligatoires du Widget sont donc toujours demandés à la validation du formulaire Profil.

 

Tout ça pour dire que le module parfait pour ce genre de cas serait un mix entre :

1/ "Node Widget" : permet de choisir les champs à remplir pour le nouveau noeud référencé, pour ne pas alourdir la tâche de l'utilisateur à son inscription.

 

2/ "Popup:Add n' Reference" : permet d'ajouter un noeud référencé seulement si le noeud voulu n'existe pas déjà. Utiliser ce wdget pose en plus le problème de types de champs CCK non pris en compte, et de la désactivation du javascript dans la popup.

 

Qu'en pensez-vous ?