2010-07-02 6 views

risposta

1

Sì.

Sono sicuro che c'è un modulo per qualcosa di simile, ma potresti anche crearne uno tuo.

Ci sono due modi per procedere.

È possibile utilizzare hook_menu() per richiedere gli elementi desiderati e restituire la struttura di menu corretta. Dovresti anche assicurarti che la cache dei menu venga ricostruita su un nodo salvato usando hook_nodeapi(). Vedere i commenti Henricks' sotto di circa il motivo per cui questa è una cattiva idea

Alternitivly si potrebbe usare hook_nodeapi() per aggiungere voci di menu personalizzate con menu_link_save().

Modifica

hook_menu dovrebbe restituire una serie di voci di menu, spesso questi sono piuttosto statici tuttavia non v'è nulla di sbagliato in queste matrici vengono generati in modo dinamico.

Quindi è possibile interrogare la tabella dei nodi per ottenere un elenco di nodi che si desidera, scorrere tra questi elementi e creare dinamicamente un array che contenga le voci di menu corrette.

molto approssimativamente:

function example_menu() { 
    $result = db_query('select * from node where ...'); // put in your own select items and where clause 
    $menu = array(); 
    while ($row = db_fetch_object($result)) { 
    $menu['my_path/' . $row->nid;] = array(
     // See hook menu docs for what to put here. 
    ); 
    } 
    return $menu; 
} 
+0

hey grazie, sto considerando il primo approccio. Se ho capito bene, è più potente e può aggiungere automaticamente nodi che sono già stati creati e salvati in precedenza. Potresti elaborare di più "Puoi usare hook_menu() per richiedere gli elementi desiderati e restituire la struttura di menu corretta." Non è chiaro come ottenere l'elenco dei nodi da hook_menu – aneuryzm

+6

** Non si dovrebbe usare 'hook_menu()' per questo! ** Creare voci di menu visibili è solo un effetto collaterale/funzionalità di praticità del gancio, ** non è principale scopo**. Il "menu" creato/manipolato da questo hook è il sistema di menu interno di Drupal (tabella router), non i menu dell'interfaccia utente visibile.Le voci del menu visibile dovrebbero essere create tramite menu_link_save, come da secondo suggerimento di Jeremys (questo è ciò che hook_menu usa per creare le voci "convenience"). –

+0

Ho spiegato la differenza tra gli elementi del router e le voci del menu [in un'altra risposta] (http://stackoverflow.com/questions/1844109/drupal-module-nested-menu-items/1869469#1869469). Vedi anche [Quando e come usare menu_links] (http://drupal.org/node/217393). –

0

Si dovrebbe dare un'occhiata al Auto Menu module - mentre la versione Drupal 6 è ancora una versione dev, potrebbe coprire le vostre esigenze. In caso contrario, puoi prenderlo come esempio di come usare menu_link_save() per creare la tua soluzione.

0

Vorrei anche fare una chiamata a menu_link_save(). Insieme al modulo Regole, è possibile impostare un'azione ogni volta che viene salvato un nuovo nodo, per creare automaticamente un'opzione di menu appropriata.

Si potrebbe desiderare di avere uno sguardo al tutorial che ho scritto qualche tempo fa, che si occupa di creare programatically voci di menu utilizzando menu_link_save() e Regole: http://jan.tomka.name/blog/programmatically-creating-menu-items-drupal

0

Sembra che ci sia un modulo Drupal che fa questo: Auto Menu. Ulteriori dettagli su questo modulo (dalla pagina del progetto):

Il modulo Menu automatico genera automaticamente voci di menu sulla creazione/edizione di nodi. La voce di menu principale può essere specificata in base al tipo di contenuto.

Questo modulo agisce quando la sezione di menu di un nodo è lasciata vuota. Quindi, gli utenti possono ancora organizzare i menu manualmente. Inoltre, l'impostazione predefinita per i tipi di contenuto è di non creare automaticamente voci di menu.

2

C'è anche il modulo Menu Position che consente di inserire il contenuto in voci di menu specifiche, a seconda del tipo di contenuto, della lingua e della tassonomia. Ha anche una piccola API per aggiungere altri criteri.

4

È possibile farlo con Regole su Drupal 7. Questo modulo: http://drupal.org/project/menu_rules aggiunge alcune azioni alle regole. Uno di questi è creare una voce di menu per un nodo. Si seleziona: Evento: Crea un nodo | Aggiornare un nodo Condizione: tipo di contenuto è "il tipo di contenuto" Azione: aggiornare una voce di menu per il nodo (c'è una casella di controllo per creare la voce di menu se doesnt esiste)

+0

Dove selezioni questo evento "crea un nodo"? – Vincent

-1

Menu Views è un modulo interessante per Drupal 7 per generare automaticamente collegamenti ai menu. Consente di utilizzare la potenza di Visualizzazioni per creare collegamenti ai menu e può essere utilizzato out-of-the-box in combinazione con moduli come Superfish e Nice Menu.

(PS: la mia reputazione non è sufficiente per fornire più di due link, quindi mi hanno segnato gli altri moduli in grassetto invece di fornire collegamenti ipertestuali)

0

Ecco caso in cui si può fare questo .... Una campagna di nodi che crea la voce di menu 'CAMPAIGN 001' quando viene creata. Utilizzo di default_menu_link Ora un altro tipo di contenuto, "Campagna secondaria" crea un nodo, utilizzando la campagna come EntityRef in modo che la relativa voce di menu si trovi sotto la voce di menu della campagna creata in precedenza.

function mymodule_node_insert($node) { 
    if ($node->type == 'sub-campaign') { 
    if (isset($node->field_reference_campaign['und'][0]['target_id'])) { 
     $campaign_node_id = $node->field_photo_album_campaign['und'][0]['target_id']; 
     $campaign_loaded = node_load($campaign_node_id); 
     // Get menu link id for the campaign node. 
     $campaign_node_id_mlid = custom_node_mlid($campaign_node_id); 
     $campaign_loaded_title = strtolower(str_replace(' ', "-", $campaign_loaded->title)); 
     $campaign_loaded_title_link_path = 'campaign/' . $campaign_loaded_title . '/photo-albums'; 
     //I will query if it exist or not, if not then will create a sub menu item. 
     $link_exist = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => $campaign_loaded_title_link_path))->fetchField(); 
     dsm($link_exist); 
     if (!$link_exist) { 
     // Create menu item under campaign. 
     custom_create_menu_item($campaign_loaded_title_link_path, 'photo-albums', $campaign_node_id_mlid); 
     //watchdog('glue_site - Menu Item', 'Link Created'); 
     } 
     else { 
     //dsm('Link Exist.'); 
     watchdog('glue_site - Menu Item', 'Link Already Exist'); 
     } 
    } 
    } 
    if ($node->type == 'campaign') { 

    } 
} 

Poi una funzione personalizzata per creare la voce di menu

function custom_create_menu_item($campaign_loaded_title_link_path, $type, $plid) { 
    switch ($type) { 
    case 'photo-albums': 
     $item = array(
     'link_path' => $campaign_loaded_title_link_path, 
     // If changing the title here, change it in template.php as well. 
     'link_title' => 'Sub Campaign', 
     'menu_name' => 'menu-campaign-menu', // Menu machine name, for example: main-menu 
     'weight' => 0, 
     'plid' => $plid, // Parent menu item, 0 if menu item is on top level 
     'module' => 'menu', 
     'router_path' => 'campaign/%/sub-campaign', 
     'customized' => '1', 
    ); 
     menu_link_save($item); 
     menu_cache_clear_all(); 
     watchdog('glue_site - Menu Item', 'Link Created'); 
     break; 
    } 
} 

Per ottenere il MLID del nodo padre. nodo di campagna ...

function custom_node_mlid($nid) { 
    // Require menu node module. 
    $arr = menu_node_get_links($nid); 
    $mlid = array_keys($arr); 
    return $mlid[0]; 
} 

Per questo è necessario menu_node

0

Questo è un problema semplice che purtroppo la comunità Drupal ha deciso che vuole fare complicato. Dimentica tutte le soluzioni hacky con regole e hook. Ci sono due moduli, a seconda che tu sia su Drupal 6 o Drupal 7, che risolvono il problema in modo molto elegante. Vi sconsiglio di creare effettivamente voci di menu. Invece i due moduli sotto rendono dinamicamente i nodi nel menu, in modo che l'editor di menu non si riempia di migliaia di nodi. Quindi, ad esempio, se decidi di spostare tutti i post del blog da [Il nostro blog] a [Chi siamo] -> [Notizie], è solo questione di modificare un'impostazione. Nessun aggiornamento di migliaia di nodi.

D6 Menu Trails

D7 Menu Position

Problemi correlati