web-dev-qa-db-fra.com

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

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 incorporé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 aussi 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.

17
Camsoft

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

4
Adam S

Vous pouvez faire exactement cela en utilisant les modules Menu Node API et Menu Node Views ).

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, puis 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;
      }  
   }
}
16
Emile Kott

Le Node Hierarchy Module 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.
  • Facultatif Node Intégration d'accès.
4
CCMonkey

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 contextuel/argument "Menu: Node ID"; Fournir la valeur par défaut "Content ID from URL"
  5. Ajouter une relation "Menu: ID du lien du menu parent"

le tour est joué. Cela ne devrait pas fonctionner , mais c'est le cas.

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 de la navigation autour des nœuds. Vous pouvez même inclure des liens externes dans votre vue.

2
aaronbauman

Il y a un module relativement nouveau Menu Vues Node Filtre enfants 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.

2
nwellnhof

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 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);
    }
  }
}
  }
0
bendev

La réponse de Emile est juste, mais j'ai dû coller le code mentionné PHP 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;
      }  
   }
}
0
cptstarling

Avez-vous envisagé d'utiliser Node Reference à 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 de l'url ).
  3. Ajoutez cet affichage en tant que bloc au contenu. Le nœud dans lequel il est affiché sera vu 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.

0
cptstarling

À partir de file d'attente d'émission of Menu Node Views 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;  
    
0
tostinni