2012-11-08 9 views
6

Obecnie pracuję nad modułem, który znajdzie pozycję menu nadrzędnego według ścieżki adresu URL, a następnie wyświetli bieżącą strukturę drzewa tego powiązanego menu, znajdując górny element nadrzędny i najważniejszy tylko wyświetlający ten element menu i podmenu z tego menu.Jak uzyskać wszystkie elementy menu poniżej określonego rodzica w Drupal 7?

Prostym rozwiązaniem byłoby posiadanie pętli foreach za pośrednictwem wszystkich elementów lub tablicy zawierającej wszystkie elementy jako klucze.

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

Wszystkie pozycje menu w menu "Niestandardowe":

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

kod PHP powinien wrócić w tym:

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

mojego kodu (aktualnie nie działa):

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

Uwaga: Musi to być kod php i kod PHP y, wszystkie inne moduły nie obsługują tego tylko przez ręczny wybór. Treść wyświetlana jest przez blok.

„dla nawigacji, Drupal wezwie menu_tree_page_data poprzez menu_navigation_links która będzie zwracać tylko jeden poziom linków. Możesz śledzić tę funkcję aż do menu_main_menu a następnie template_preprocess_page przed nim (co jest jak kończy się jako zmiennej w page.tpl.php)

jeśli jednak wstawić menu jako menu_tree_page_data blokowych jest zwanych przez menu_tree (który nazywa menu_tree_output natychmiast po który wykonuje pewne dodatkowe prace do tablicy dla ostatecznego znaczników.) Po oba uruchomić masz drzewo menu całą dostępną jako tablicy którą następnie prowadził przez jakiś niestandardowy PHP kod do przechodzenia przez tablicy i renderowania jej na listę HTML. "

Ludzie pytali to wcześniej, ale próbowałem ich rozwiązania, a nie sukces prawdopodobną przyczyną byłyby te pytania jest dla Drupal 6. Obecnie pracuję z Drupal 7.

Twoja pomoc jest bardzo dużo doceniane, dzięki ...

Powiązane pytania:


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

Odpowiedz

2

Pierwszą rzeczą, którą trzeba jest mlid strony dysku C urrently na:

$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(); 

Teraz jeśli plid tej pozycji menu jest 0, to wiemy, że jest to pozycja menu najwyższego poziomu, jeśli nie jest 0, to musimy rodzica. Więc górna mlid drzewa chcemy uzyskać to:

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

Następnie trzeba załadować pełne menu:

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

Teraz pętla chociaż wszystkie elementy menu i po prostu się trochę chcemy :

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

Łącza $ utrzymują teraz wszystkie linki z określonej części menu, której szukasz.

A do wyjścia, że ​​tablica w menu na stronie:

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

Jak o czymś takim?

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; 

} 
Powiązane problemy