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
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
** 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"). –
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). –