Come posso creare una vista di nodi figlio in base alla relazione del menu?


17

Supponi di avere le seguenti pagine in una struttura di menu:

  • progetti
    • Project One
    • Progetto due
    • Progetto tre

Sto cercando un modo per creare una vista che verrà incorporata nella pagina Progetto (padre) che mostrerà una foto, titolo e testo (riepilogo) dalle pagine figlio.

La relazione tra padre e figlio è definita nella struttura del menu.

So di poter usare il riferimento al nodo, ma ciò significherebbe che ogni volta che qualcuno crea una pagina dovrebbe definire la relazione del menu e quindi la relazione di riferimento del nodo.

Inoltre so che potrei creare un altro tipo di contenuto, ma penso che questo sia eccessivo poiché tutte le pagine di contenuto sembrano uguali.


1
Non esiste una relazione diretta tra i nodi che vengono visualizzati in un sottomenu di un altro nodo (L'unica connessione tra un collegamento di menu e un nodo è che un collegamento di menu punta a nodo / nid). Quindi hai bisogno di qualcosa per collegare questi sottonodi (e al nodo genitore), potrebbe essere un termine comune di tassonomia, book.module, ...
Berdir

Risposte:


4

Una soluzione consiste nell'utilizzare termini di tassonomia per definire le relazioni e quindi utilizzare il modulo Menu tassonomia per tradurre tali relazioni di termini in voci di menu. È quindi possibile utilizzare il modulo Pagina personalizzata e i moduli contestuali per controllare le informazioni e le aree su tutte le pagine se non si desidera utilizzare i pannelli.


16

Puoi fare esattamente questo usando l' API Nodo menu e i moduli Viste nodo menu .

Crea una vista con il tipo di contenuto richiesto e scegli un filtro contestuale di "Menu: ID collegamento menu" (disponibile solo con i moduli sopra installati).

In "Quando il valore del filtro non è disponibile", seleziona "Fornisci valore predefinito" e scegli "Codice PHP".

Lo farà il seguente frammento, quindi esponi un blocco dalla vista e sei lì:

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
Penso che il filtro dovrebbe essere "Menu: ID collegamento menu principale" per prendere i figli del nodo corrente. E il codice dell'argomento può essere: $ current = end (menu_get_active_trail ()); restituisce $ current ['mlid'];
Stefan,

Grazie per questo. Alcuni miglioramenti (oltre alla correzione di @ Stefan). 1) È possibile utilizzare menu_load_object(arg(1))invece di node_load()risparmiare alcune spese. 2) Si dovrebbe verificare per assicurarsi che la voce di menu provenga dal menu che ti interessa. In questo momento, stai solo restituendo il primo $mlid. All'interno del foreach dovresti aggiungere un condizionale if ($data->menu_name == 'my-menu')per risolvere questo problema. e 3) Potresti voler aggiungere un secondo filtro per menu: hiddenrestituire solo gli articoli che non sono nascosti. Utilizza lo stesso frammento, ma restituisce $data->hidden;invece di $mlid.
Adam Balsam,

2
Scoraggerei fortemente i moduli che sono ancora in fase di sviluppo.
Ambidex,

@Stefan è lì per ottenere tutti i bambini a qualsiasi livello? anziché solo per primo.
Eli Stone

4

Il modulo di gerarchia dei nodi consente questo tipo di relazione, oltre a fornire un'integrazione delle viste.

La gerarchia dei nodi consente ai nodi di essere figli di altri nodi creando una gerarchia di contenuti ad albero. Il modulo offre:

  • Creazione in 1 clic di menu gerarchici
  • Pangrattato gerarchico
  • URL gerarchici automatici usando Pathauto (e modulo token)

    (es .: q = aboutus / storia / inizio).

  • Creazione automatica di menu gerarchici, se desiderato.
  • Integrazione di Views opzionale.
  • Integrazione dell'accesso al nodo opzionale.

2

Forse questo è cambiato per D7 / Views 3, ma non è necessario alcun PHP per ottenere il comportamento desiderato:

  1. installa i moduli menu_views , menu_node e menu_node_views .
  2. creare una nuova vista di tipo "albero dei menu"
  3. aggiungi campi "Menu: titolo collegamento" e "Menu: descrizione"
  4. Aggiungi filtro / argomento contestuale "Menu: ID nodo"; Fornisci il valore predefinito "Content ID dall'URL"
  5. Aggiungi relazione "Menu: ID collegamento menu principale"

Ecco. Non dovrebbe funzionare , ma funziona.

Funziona bene solo con i nodi, ma il vantaggio di utilizzare i collegamenti di menu sulla gerarchia dei nodi è che non si è limitati a costruire la navigazione attorno ai nodi. Potresti anche includere collegamenti esterni nella tua vista.


Questa è una buona opzione per esporre i collegamenti ai nodi (e adoro il fatto che Aaron Bauman abbia creato questa vista di esempio per l'importazione: pastebin.com/u2GjmWG7 ). Tuttavia, ho avuto qualche problema a rendere disponibili i campi nodo alla vista, come richiesto dall'OP. Come viene realizzato?
doub1ejack

Dovresti essere in grado di esporre i campi del nodo aggiungendo una relazione a "Menu: ID nodo". Vedi qualcosa del genere?
aaronbauman,

2

C'è un modulo relativamente nuovo Viste Menu Nodo Filtro bambini che sembra fare esattamente quello che vuoi:

Questo modulo aggiunge un filtro contestuale a Views che recupererà i nodi figlio di un nodo in base alla struttura di un menu.


0

Hai preso in considerazione l'utilizzo di Node Reference a questo scopo?

  1. Fornire un campo di riferimento nodo al tipo di contenuto che si desidera visualizzare.
  2. Utilizzare quel campo come filtro contestuale nella vista (valore predefinito: Content ID dall'URL ).
  3. Aggiungi questa visualizzazione come blocco al contenuto. Il nodo in cui viene visualizzato verrà visualizzato come genitore dei nodi che fanno riferimento ad esso, ad esempio.

In questo modo puoi ottenere un risultato simile come probabilmente stai cercando.


0

La risposta di Emile è corretta, ma ho dovuto incollare il citato codice PHP in un filtro contestuale del tipo " Menu: ID collegamento menu principale ".

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

Se si utilizza la traduzione di entità e il nodo è collegato a menu diversi, ecco un adattamento del codice che filtra sulla lingua corrente. È necessario copiarlo come codice PHP per il filtro contestuale (ID collegamento menu principale) nella vista come spiegato nelle altre risposte

 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

Dalla coda di emissione delle visualizzazioni dei nodi del menu abbiamo questa bella soluzione:

  • aggiungere un filtro contestuale con "ID collegamento menu principale",
  • seleziona "Fornisci valore predefinito"
  • seleziona 'codice php personalizzato'
  • inserisci il seguente codice

    $menu_item = menu_get_active_trail();  
    $current_item = array_pop($menu_item);  
    $menu_item_plid = $current_item['plid'];  
    return $menu_item_plid;  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.