Jak mogę utworzyć widok węzłów potomnych na podstawie relacji menu?

17

Załóżmy, że masz następujące strony w drzewie menu:

  • Projektowanie
    • Projekt pierwszy
    • Projekt drugi
    • Projekt trzeci

Szukam sposobu, aby utworzyć widok, który zostanie osadzony na stronie projektu (nadrzędny), który pokaże zdjęcie, tytuł i tekst (streszczenie) ze stron podrzędnych.

Relacje między rodzicem a dziećmi są zdefiniowane w drzewie menu.

Wiem, że mogę używać odwołania do węzła, ale to oznaczałoby, że za każdym razem, gdy ktoś tworzy stronę, musiałby zdefiniować relację menu, a następnie relację odwołania do węzła.

Wiem też, że mogłem stworzyć inny typ zawartości, ale myślę, że to przesada, ponieważ wszystkie strony zawartości wyglądają tak samo.

Camsoft
źródło
1
Nie ma bezpośredniej relacji między węzłami wyświetlanymi w podmenu innego węzła (jedynym połączeniem między łączem menu a węzłem jest to, że łącze menu wskazuje węzeł / nid). Potrzebujesz więc czegoś, aby połączyć te podwęzły razem (i węzła nadrzędnego), może to być powszechny termin taksonomiczny, book.module, ...
Berdir

Odpowiedzi:

4

Jednym z rozwiązań jest użycie terminów taksonomicznych do zdefiniowania relacji, a następnie użycie modułu Menu taksonomii do przetłumaczenia tych relacji terminów na pozycje menu. Następnie możesz użyć niestandardowego modułu strony i modułów kontekstu, aby kontrolować informacje i regiony na wszystkich stronach, jeśli nie chcesz używać paneli.

Adam S.
źródło
16

Możesz to zrobić dokładnie za pomocą interfejsu API węzła menu i modułów widoków węzła menu .

Utwórz widok z wymaganym typem zawartości i wybierz filtr kontekstowy „Menu: ID linku do menu” (jest to dostępne tylko przy zainstalowanych powyższych modułach).

W obszarze „Gdy wartość filtru nie jest dostępna” wybierz „Podaj wartość domyślną” i wybierz „Kod PHP”.

Następujący fragment kodu zrobi to, po prostu odsłonisz blok z widoku i już tam jesteś:

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
źródło
3
Myślę, że filtr powinien mieć postać „Menu: Identyfikator linku do menu nadrzędnego”, aby zabrać dzieci z bieżącego węzła. A kod argumentu może być: $ current = end (menu_get_active_trail ()); return $ current ['mlid'];
Stefan
Dzięki za to. Kilka ulepszeń (oprócz poprawki @ Stefana). 1) Możesz użyć menu_load_object(arg(1))zamiast node_load()zaoszczędzić trochę pieniędzy. 2) Należy sprawdzić, aby upewnić się, że element menu pochodzi z menu, którego dotyczy. W tej chwili właśnie zwracasz pierwszy $mlid. Wewnątrz foreach należy dodać warunek, if ($data->menu_name == 'my-menu')aby to naprawić. oraz 3) Możesz dodać drugi filtr, menu: hiddenaby zwracać tylko elementy, które nie są ukryte. Użyj tego samego fragmentu kodu, ale zwróć $data->hidden;zamiast $mlid.
Adam Balsam,
2
Zdecydowanie odradzam sugerowanie modułów, które są jeszcze w fazie rozwoju.
Ambidex
@Stefan jest na miejscu, aby zdobyć wszystkie dzieci na dowolnym poziomie? zamiast tylko pierwszego.
Eli Stone,
4

Moduł Node Hierarchy pozwala na ten rodzaj relacji, a także zapewnia integrację widoków.

Hierarchia węzłów pozwala, aby węzły były potomkami innych węzłów, tworząc drzewiastą hierarchię treści. Moduł oferuje:

  • Tworzenie hierarchicznych menu jednym kliknięciem
  • Hierarchiczna bułka tarta
  • Automatyczne hierarchiczne adresy URL przy użyciu Pathauto (i modułu tokena)

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

  • Automatyczne tworzenie hierarchicznych menu w razie potrzeby.
  • Integracja widoków opcjonalnych.
  • Opcjonalna integracja z dostępem do węzła.
CCMonkey
źródło
2

Być może zmieniło się to w D7 / Views 3, ale nie potrzebujesz żadnego PHP, aby osiągnąć pożądane zachowanie:

  1. zainstaluj moduły menu_views , menu_node i menu_node_views .
  2. utwórz nowy widok typu „drzewo menu”
  3. dodaj pola „Menu: tytuł linku” i „Menu: opis”
  4. Dodaj Filtr kontekstowy / Argument „Menu: Identyfikator węzła”; Podaj wartość domyślną „Content ID from URL”
  5. Dodaj relację „Menu: identyfikator linku do menu nadrzędnego”

voila. To nie powinno działać , ale działa.

Działa dobrze tylko z węzłami, ale zaletą korzystania z łączy menu nad hierarchią węzłów jest to, że nie ogranicza się do budowania nawigacji wokół węzłów. Możesz nawet dołączyć do swojego widoku linki zewnętrzne.

aaronbauman
źródło
Jest to dobra opcja do ujawnienia linków do węzłów (i uwielbiam, że Aaron Bauman umieścił ten przykładowy widok do zaimportowania: pastebin.com/u2GjmWG7 ). Miałem jednak pewne problemy z udostępnieniem pól węzłów do widoku, ponieważ OP żądał. Jak to się osiąga?
doub1ejack
Powinieneś być w stanie ujawnić pola węzłów, dodając relację do „Menu: ID węzła”. Widzisz coś takiego?
aaronbauman
2

Jest stosunkowo nowy moduł Widoki Menu Węzeł Filtr podrzędny, który wydaje się robić dokładnie to, co chcesz:

Ten moduł dodaje filtr kontekstowy do widoków, które będą pobierać węzły potomne węzła zgodnie ze strukturą menu.

nwellnhof
źródło
0

Czy rozważałeś użycie Node Reference w tym celu?

  1. Podaj pole referencyjne węzła dla typu zawartości, który chcesz wyświetlić.
  2. Użyj tego pola jako filtru kontekstowego w widoku (wartość domyślna: identyfikator treści z adresu URL ).
  3. Dodaj ten widok widoku jako blok do treści. Węzeł, w którym jest wyświetlany, będzie postrzegany jako rodzic węzłów, które się do niego odwołują.

W ten sposób możesz osiągnąć podobny wynik, jakiego prawdopodobnie szukasz.

cptstarling
źródło
0

Odpowiedź Emile'a jest słuszna, ale musiałem wkleić wspomniany kod PHP w filtrze kontekstowym typu „ Menu: identyfikator linku do menu nadrzędnego ”.

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
źródło
0

Jeśli używasz tłumaczenia encji, a węzeł jest dołączony do różnych menu, tutaj jest adaptacja kodu filtrującego na bieżący język. Musisz skopiować to jako kod PHP dla filtru kontekstowego (identyfikator linku do menu nadrzędnego) w swoim widoku, jak wyjaśniono w innych odpowiedziach

 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
źródło
0

Z kolejki problemów z widokami węzłów menu mamy to fajne rozwiązanie:

  • dodaj filtr kontekstowy z „Identyfikatorem linku do menu nadrzędnego”,
  • wybierz „Podaj wartość domyślną”
  • wybierz „niestandardowy kod php”
  • wprowadź następujący kod

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
tostinni
źródło