Wie kann ich eine Ansicht der untergeordneten Knoten basierend auf der Menübeziehung erstellen?


17

Angenommen, Sie haben die folgenden Seiten in einem Menübaum:

  • Projekte
    • Projekt Eins
    • Projekt Zwei
    • Projekt Drei

Ich suche nach einer Möglichkeit, eine Ansicht zu erstellen, die in die Projektseite (übergeordnete Seite) eingebettet wird und ein Bild, einen Titel und einen Text (Zusammenfassung) von den untergeordneten Seiten anzeigt.

Die Beziehung zwischen Eltern und Kindern wird im Menübaum definiert.

Ich weiß, dass ich eine Knotenreferenz verwenden kann, aber das würde bedeuten, dass jedes Mal, wenn jemand eine Seite erstellt, diese die Menübeziehung und dann die Knotenreferenzbeziehung definieren müsste.

Ich weiß auch, dass ich einen anderen Inhaltstyp erstellen könnte, aber ich halte dies für übertrieben, da alle Inhaltsseiten gleich aussehen.


1
Es gibt keine direkte Beziehung zwischen Knoten, die in einem Untermenü eines anderen Knotens angezeigt werden (Die einzige Verbindung zwischen einem Menülink und einem Knoten besteht darin, dass ein Menülink auf node / nid verweist). Sie benötigen also etwas, um diese Unterknoten miteinander (und mit dem übergeordneten Knoten) zu verknüpfen. Dies könnte ein gebräuchlicher Taxonomiebegriff sein, book.module, ...
Berdir,

Antworten:


4

Eine Lösung besteht darin, Taxonomiebegriffe zu verwenden, um die Beziehungen zu definieren, und dann das Modul Taxonomiemenü zu verwenden, um diese Begriffsbeziehungen in Menüelemente zu übersetzen. Sie können dann das Modul "Benutzerdefinierte Seite" und das Modul " Kontext" verwenden, um Informationen und Bereiche auf allen Seiten zu steuern, wenn Sie keine Bedienfelder verwenden möchten.


16

Genau dies können Sie mit der Menüknoten-API und den Modulen " Menüknotenansichten" tun .

Erstellen Sie eine Ansicht mit dem gewünschten Inhaltstyp und wählen Sie einen Kontextfilter für "Menü: Menü-Link-ID" (dies ist nur verfügbar, wenn die obigen Module installiert sind).

Wählen Sie unter "Wenn der Filterwert nicht verfügbar ist" die Option "Standardwert bereitstellen" und dann "PHP-Code" aus.

Das folgende Snippet wird es tun, dann machen Sie einfach einen Block aus der Ansicht frei und Sie sind da:

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;
      }  
   }
}

3
Ich denke, der Filter sollte "Menü: Übergeordnete Menü-Link-ID" sein, um die untergeordneten Elemente des aktuellen Knotens zu übernehmen. Und der Argumentcode kann sein: $ current = end (menu_get_active_trail ()); return $ current ['mlid'];
Stefan

Danke dafür. Ein paar Verbesserungen (zusätzlich zu @ Stefans Korrektur). 1) Sie können menu_load_object(arg(1))anstelle von verwenden node_load(), um einige Kosten zu sparen. 2) Stellen Sie sicher, dass der Menüpunkt aus dem Menü stammt, mit dem Sie sich befassen. Im Moment kehren Sie nur den ersten zurück $mlid. Innerhalb von foreach sollten Sie eine Bedingung hinzufügen if ($data->menu_name == 'my-menu'), um dies zu beheben. und 3) Möglicherweise möchten Sie einen zweiten Filter hinzufügen, um menu: hiddennur Elemente zurückzugeben, die nicht ausgeblendet sind. Verwenden Sie dasselbe Snippet, geben Sie jedoch das $data->hidden;anstelle des zurück $mlid.
Adam Balsam

2
Ich würde dringend davon abraten, Module vorzuschlagen, die sich noch in der Entwicklungsphase befinden.
Ambidex

@Stefan ist da weg, um alle Kinder auf irgendeiner Ebene zu bekommen? statt erstmal.
Eli Stone

4

Das Knotenhierarchie-Modul ermöglicht diese Art von Beziehung und bietet eine Ansichtenintegration.

Mit der Knotenhierarchie können Knoten untergeordnete Knoten anderer Knoten sein und eine baumartige Inhaltshierarchie erstellen. Das Modul bietet:

  • 1-Klick-Erstellung von hierarchischen Menüs
  • Hierarchische Semmelbrösel
  • Automatische hierarchische URLs mit Pathauto (und Token-Modul)

    (zB: q = aboutus / history / begin).

  • Automatische Erstellung hierarchischer Menüs, falls gewünscht.
  • Optionale Ansichten Integration.
  • Optionale Knotenzugriffsintegration.

2

Möglicherweise hat sich dies für D7 / Views 3 geändert, aber Sie benötigen kein PHP, um das gewünschte Verhalten zu erreichen:

  1. Installieren Sie die Module menu_views , menu_node und menu_node_views .
  2. erstelle eine neue Ansicht vom Typ "Menübaum"
  3. Felder "Menü: Linktitel" und "Menü: Beschreibung" hinzufügen
  4. Add Contextual Filter / Argument "Menü: Node ID"; Standardwert "Inhalts-ID von URL" angeben
  5. Beziehung hinzufügen "Menü: Link-ID des übergeordneten Menüs"

voila. Es sollte nicht funktionieren , aber es funktioniert.

Es funktioniert problemlos nur mit Knoten, aber der Vorteil der Verwendung von Menüverknüpfungen gegenüber der Knotenhierarchie besteht darin, dass Sie nicht nur die Navigation um Knoten herum erstellen können. Sie können sogar externe Links in Ihre Ansicht aufnehmen.


Dies ist eine gute Option zum Anzeigen von Knotenverknüpfungen (und ich finde es toll, dass Aaron Bauman diese Beispielansicht für den Import erstellt hat: pastebin.com/u2GjmWG7 ). Ich hatte jedoch einige Probleme, Knotenfelder für die Ansicht verfügbar zu machen, da das OP dies anforderte. Wie wird das erreicht?
Doub1ejack

Sie sollten Knotenfelder anzeigen können, indem Sie eine Beziehung zu "Menü: Knoten-ID" hinzufügen. Siehst du so etwas
Aaronbauman

2

Es gibt ein relativ neues Modul, das Views Menu Node Children Filter , genau das zu tun scheint, was Sie wollen:

Dieses Modul fügt Ansichten einen Kontextfilter hinzu, der die untergeordneten Knoten eines Knotens gemäß der Menüstruktur abruft.


0

Haben Sie darüber nachgedacht, die Knotenreferenz für diesen Zweck zu verwenden?

  1. Stellen Sie ein Knotenreferenzfeld für den Inhaltstyp bereit, den Sie anzeigen möchten.
  2. Verwenden Sie dieses Feld als Kontextfilter in der Ansicht (Standardwert: Inhalts-ID von URL ).
  3. Fügen Sie diese Ansichtsanzeige als Block zum Inhalt hinzu. Der Knoten, in dem er angezeigt wird, wird als übergeordneter Knoten der Knoten angesehen, die beispielsweise auf ihn verweisen.

So können Sie ein ähnliches Ergebnis erzielen, wie Sie wahrscheinlich suchen.


0

Die Antwort von Emile ist richtig, aber ich musste den erwähnten PHP-Code in einen Kontextfilter vom Typ " Menu: Parent menu link id " einfügen .

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

Wenn Sie die Entitätsübersetzung verwenden und der Knoten an verschiedene Menüs angehängt ist, finden Sie hier eine Anpassung des Codes, der nach der aktuellen Sprache filtert. Sie müssen dies als PHP-Code für den Kontextfilter (Link-ID des übergeordneten Menüs) in Ihre Ansicht kopieren, wie in den anderen Antworten erläutert

 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

Aus der Ausgabe-Warteschlange von Menu Node Views haben wir diese schöne Lösung:

  • Hinzufügen eines Kontextfilters mit der ID des übergeordneten Menülinks
  • Wählen Sie "Standardwert angeben".
  • wähle 'custom php code'
  • Geben Sie den folgenden Code ein

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.