2012-11-08 14 views
6

Attualmente sto lavorando su un modulo che scopre la voce del menu genitore tramite percorso URL, quindi visualizza la struttura ad albero corrente di quel menu correlato trovando il genitore principale e più importante solo visualizzando quella voce di menu e sottomenu all'interno di quel menu.Come ottenere tutti gli elementi del menu sotto un determinato genitore in drupal 7?

Una soluzione semplice sarebbe avere un ciclo foreach attraverso tutti gli elementi o un array con tutti gli elementi come chiavi.

path = '/system/menu/submenu'; 
parent = 'system'; 
output = parent + parent submenus. 

Tutte le voci di menu in "Menu personalizzato":

- System 
    - Menu wrapper 
    - SubMenu 1A 
    - SubMenu 2A 
    - SubMenu 3A  
- Main 
    - SubMenu 1B 
    - SubMenu 2B 
    - SubChildMenu 3B 

codice PHP deve restituire questo:

- System 
    - Menu wrapper 
    - SubMenu 1A 
    - SubMenu 2A 
    - SubMenu 3A  

Il mio codice (attualmente non funziona):

$menu = menu_tree('my-custom-menu'); 
return = theme('my_custom_menu', array('system' => $menu_tree)); 

Avviso: questo deve essere il codice php e il codice php onl y, tutti gli altri moduli non supportano questo solo attraverso la selezione manuale. Il contenuto è visualizzato attraverso un blocco.

"Per la navigazione, Drupal chiamerà menu_tree_page_data via menu_navigation_links che restituisce solo un unico livello di collegamenti. È possibile seguire questa funzione fino a menu_main_menu e poi template_preprocess_page prima (che è come andrà a finire come una variabile in page.tpl.php)

Tuttavia, se si inserisce un menu come menu_tree_page_data blocco è chiamati da menu_tree (che chiama menu_tree_output subito dopo che fa un po 'di lavoro in più alla matrice per la marcatura finale.) Dopo che entrambi hanno eseguito avete tutta la struttura del menu disponibile come serie che ho poi fatto funzionare attraverso alcuni PHP personalizzato codice per scorrere attraverso la serie e renderla in un elenco HTML. "

persone hanno chiesto prima, ma ho provato le loro soluzioni e nessun successo probabile causa sarebbe queste domande è per Drupal 6. Al momento sto lavorando con Drupal 7.

Il vostro aiuto è molto apprezzato, grazie ...

domande correlate:


Restrict menu tree to first level

how to get all the menu items below a certain parent in drupal?

https://drupal.stackexchange.com/questions/28654/how-to-display-submenus-separate-from-their-menu-tree-in-drupal-7

https://drupal.stackexchange.com/questions/30112/displaying-a-menus-child-links

risposta

2

La prima cosa che serve è il MLID della pagina vostro c urrently on:

$q = variable_get('site_frontpage', 'node') == $_GET["q"] ? '<front>' : $_GET["q"]; 
$current_menu_item = db_select('menu_links' , 'ml') 
    ->condition('ml.link_path' , $q) 
    ->fields('ml', array('mlid', 'plid')) 
    ->execute() 
    ->fetchAll(); 

Ora, se l'plid di questa voce di menu è 0, allora sappiamo che è una voce di menu di livello superiore, se non è 0, allora abbiamo bisogno di ottenere il genitore. Così il MLID cima dell'albero che vogliamo ottenere è:

$top_level_mlid = $current_menu_item->plid == 0 ? $current_menu_item->mlid : $current_menu_item->plid; 

allora avete bisogno di caricare il menu completo:

$full_menu_items = menu_tree_all_data('main-menu'); 

Ora ciclo anche se tutte le voci di menu e solo ottenere il bit vogliamo :

foreach($full_menu_items as $menu_item) { 
    if($menu_item['link']['mlid'] == $top_level_mlid) { 
     $links = $menu_item['below']; 
     break; 
    } 
} 

$ link ora contengono tutti i collegamenti dalla parte specifica del menu che si sta cercando.

E per output che matrice come un menu alla pagina:

echo theme('links__system_secondary_menu', array(
    'links' => $links, 
    'attributes' => array(
     'id' => 'secondary-menu', 
     'class' => array('links', 'clearfix')), 
     'heading' => array(
      'text' => t('Secondary menu'), 
      'level' => 'h2', 
      'class' => array('element-invisible') 
     ) 
)); 
0

Che ne dite di qualcosa di simile?

function your_module_menu_link__your_menu($variables){ 

    $element = $variables['element']; 
    $sub_menu = ''; 

    if ($element['#below']) { 

     $sub_menu = drupal_render($element['#below']); 

    } 

    $ouput = ""; 

    if($element['#original_link']['plid'] > 0 || $element['#below']){ 
     $link = l($element['#title'], $element['#href'], $element['#localized_options']); 
     $ouput = '<li' . drupal_attributes($element['#attributes']) . '>' . $link . $sub_menu . "</li>\n"; 
    } 

    return $ouput; 

} 
Problemi correlati