Comment puis-je créer une vue des nœuds enfants en fonction de la relation de menu?

17

Supposons que vous ayez les pages suivantes dans une arborescence de menus:

  • Projets
    • Project One
    • Projet deux
    • Projet trois

Je cherche un moyen de créer une vue qui sera intégrée dans la page Projet (parent) qui montrera une image, un titre et un texte (résumé) à partir des pages enfants.

La relation entre le parent et les enfants est définie dans l'arborescence des menus.

Je sais que je peux utiliser la référence de nœud, mais cela signifierait que chaque fois que quelqu'un crée une page, il devrait définir la relation de menu, puis la relation de référence de nœud.

Je sais également que je pourrais créer un autre type de contenu, mais je pense que c'est exagéré car toutes les pages de contenu se ressemblent.

Camsoft
la source
1
Il n'y a pas de relation directe entre les nœuds qui sont affichés dans un sous-menu d'un autre nœud (La seule connexion entre un lien de menu et un nœud est qu'un lien de menu pointe vers nœud / nid). Vous avez donc besoin de quelque chose pour relier ces sous-nœuds (et au nœud parent), pourrait être un terme de taxonomie commun, book.module, ...
Berdir

Réponses:

4

Une solution consiste à utiliser des termes de taxonomie pour définir les relations, puis à utiliser le module Menu de taxonomie pour traduire ces relations de termes en éléments de menu. Vous pouvez ensuite utiliser le module Page personnalisée et les modules Contexte pour contrôler les informations et les régions sur toutes les pages si vous ne souhaitez pas utiliser de panneaux.

Adam S
la source
16

Vous pouvez faire exactement cela en utilisant l' API Menu Node et les modules Vues de nœud de menu .

Créez une vue avec votre type de contenu requis et choisissez un filtre contextuel de "Menu: ID de lien de menu" (ceci n'est disponible qu'avec les modules ci-dessus installés).

Sous "Lorsque la valeur du filtre n'est pas disponible", sélectionnez "Fournir la valeur par défaut" et choisissez "Code PHP".

L'extrait suivant le fera, alors vous exposez simplement un bloc de la vue et vous y êtes:

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
Emile Kott
la source
3
Je pense que le filtre devrait être "Menu: Identifiant du lien du menu parent" afin de prendre les enfants du nœud actuel. Et le code d'argument peut être: $ current = end (menu_get_active_trail ()); return $ current ['mlid'];
Stefan
Merci pour cela. Quelques améliorations (en plus de la correction de @ Stefan). 1) Vous pouvez utiliser menu_load_object(arg(1))au lieu de node_load()pour économiser certaines dépenses. 2) Vous devez vérifier que l'élément de menu provient du menu qui vous intéresse. En ce moment, vous retournez juste le premier $mlid. À l'intérieur de la foreach, vous devez ajouter une condition if ($data->menu_name == 'my-menu')pour résoudre ce problème. et 3) Vous souhaiterez peut-être ajouter un deuxième filtre pour menu: hiddenne renvoyer que les éléments qui ne sont pas masqués. Utilisez le même extrait de code, mais renvoyez le $data->hidden;au lieu du $mlid.
Adam Balsam
2
Je déconseillerais fortement de suggérer des modules qui sont encore au stade de développement.
Ambidex
@Stefan est là pour amener tous les enfants à tous les niveaux? au lieu de juste en premier.
Eli Stone
4

Le module Node Hierarchy permet ce type de relation, ainsi qu'une intégration des vues.

La hiérarchie des nœuds permet aux nœuds d'être des enfants d'autres nœuds créant une hiérarchie arborescente de contenu. Le module propose:

  • Création en 1 clic de menus hiérarchiques
  • Fil d'Ariane hiérarchique
  • URL hiérarchiques automatiques utilisant Pathauto (et module de jeton)

    (par exemple: q = aboutus / histoire / début).

  • Création automatique de menus hiérarchiques si souhaité.
  • Intégration facultative des vues.
  • Intégration optionnelle Node Access.
CCMonkey
la source
2

Peut-être que cela a changé pour D7 / Views 3, mais vous n'avez pas besoin de PHP pour accomplir le comportement souhaité:

  1. installez les modules menu_views , menu_node et menu_node_views .
  2. créer une nouvelle vue de type "arborescence de menu"
  3. ajouter des champs "Menu: titre du lien" et "Menu: description"
  4. Ajouter un filtre / argument contextuel "Menu: Node ID"; Indiquez la valeur par défaut "Content ID from URL"
  5. Ajouter une relation "Menu: ID du lien du menu parent"

le tour est joué. Ça ne devrait pas marcher , mais ça marche .

Cela fonctionne bien avec seulement les nœuds, mais l'avantage d'utiliser des liens de menu sur la hiérarchie des nœuds est que vous n'êtes pas limité à la construction d'une navigation autour des nœuds. Vous pouvez même inclure des liens externes dans votre vue.

aaronbauman
la source
C'est une bonne option pour exposer les liens de nœuds (et j'adore qu'Aaron Bauman ait mis en place cet exemple d'affichage pour importer: pastebin.com/u2GjmWG7 ). Cependant, j'ai eu du mal à rendre les champs de nœuds disponibles pour la vue, comme l'OP le demandait. Comment est-ce accompli?
doub1ejack
Vous devriez être en mesure d'exposer les champs de noeud en ajoutant une relation au "Menu: ID de noeud". Voyez-vous quelque chose comme ça?
aaronbauman
2

Il existe un module relativement récent, le filtre des enfants du nœud du menu Vues, qui semble faire exactement ce que vous voulez:

Ce module ajoute un filtre contextuel aux vues qui récupérera les nœuds enfants d'un nœud selon la structure d'un menu.

nwellnhof
la source
0

Avez-vous envisagé d'utiliser la référence de nœud à cette fin?

  1. Fournissez un champ de référence de nœud au type de contenu que vous souhaitez afficher.
  2. Utilisez ce champ comme filtre contextuel dans la vue (valeur par défaut: Content ID from url ).
  3. Ajoutez cet affichage de vue en tant que bloc au contenu. Le nœud dans lequel il est affiché sera considéré comme un parent des nœuds qui s'y réfèrent par exemple.

Ainsi, vous pouvez obtenir un résultat similaire à celui que vous recherchez probablement.

cptstarling
la source
0

La réponse d' Emile est juste, mais j'ai dû coller le code PHP mentionné dans un filtre contextuel du type " Menu: Identifiant du lien du menu parent ".

if (function_exists('menu_node_get_links')){  
   $node = node_load(intval(arg(1)));  
   if (isset($node->menu_node_links)){
      foreach($node->menu_node_links as $mlid=>$data){  
         return $mlid;
      }  
   }
}
cptstarling
la source
0

Si vous utilisez la traduction d'entité et que le nœud est attaché à différents menus, voici une adaptation du code qui filtre sur la langue courante. Vous devez le copier en tant que code PHP pour le filtre contextuel (identifiant du lien du menu parent) dans votre vue, comme expliqué dans les autres réponses

 if (function_exists('menu_node_get_links')) {
global $language;
$lang = $language->language;
$node = node_load(intval(arg(1)));
if (isset($node->menu_node_links)) {
  foreach ($node->menu_node_links as $mlid => $data) {  
    if ($lang == $data->language) {
      return($mlid);
    }
  }
}
  }
bendev
la source
0

À partir de la file d' attente des problèmes de vue des nœuds de menu, nous avons cette belle solution:

  • ajouter un filtre contextuel avec 'Identifiant du lien du menu parent',
  • sélectionnez «Fournir la valeur par défaut»
  • sélectionnez 'code php personnalisé'
  • entrez le code suivant

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
tostinni
la source