2009-12-03 9 views
5

Drupal'daki çeşitli menü işlevlerini okudum, ama çok fazla sooo var ve bir kafa karışıklığı ve umutsuzluğa ulaştım. Buradaki akıllılar bana yardımcı olabilir ...Drupal Menü Sistemi - Bir Ağacı Bir Seviyede Çıktısı

Temel olarak, menümde dört seviyem var. İkinci seviyeden çıkış yapan bir ağaç oluşturmaya çalışıyorum.

Yani, menü aşağıdaki gibidir: LEVEL ONE> Arakatlı A> Arakatlı I> Arakatlı bir

Ben çıkışa Arakatlı A ile başlayan menü ağacı çalışıyorum (yani Arakatlı A> Arakatlı I> Arakatlı a)

Ama bana süresince ... Ben sadece

<?php print theme_menu_tree(69); ?> 
sonra bu durumda 69) içinde (Arakatlı bir menü MLID alma ve çalıştı bunun nasıl bilemiyorum

ancak sadece '69' yazdırır. Beklediğimden değil ...

Bunu nasıl yapacağını bilen var mı?

+1

Doğrudan bir tema işlevini çağırmamalısınız. beklenmedik sonucu elde etmenin doğru yolu olurdu :) – Rimian

cevap

11

Niçin bunun için neden bir işlev olmadığını merak ettim, ama afaik yoktur.

/** 
* Extract a specific subtree from a menu tree based on a menu link id (mlid) 
* 
* @param array $tree 
* A menu tree data structure as returned by menu_tree_all_data() or menu_tree_page_data() 
* @param int $mlid 
* The menu link id of the menu entry for which to return the subtree 
* @return array 
* The found subtree, or NULL if no entry matched the mlid 
*/ 
function yourModule_menu_get_subtree($tree, $mlid) { 
    // Check all top level entries 
    foreach ($tree as $key => $element) { 
    // Is this the entry we are looking for? 
    if ($mlid == $element['link']['mlid']) { 
     // Yes, return while keeping the key 
     return array($key => $element); 
    } 
    else { 
     // No, recurse to children, if any 
     if ($element['below']) { 
     $submatch = yourModule_menu_get_subtree($element['below'], $mlid); 
     // Found wanted entry within the children? 
     if ($submatch) { 
      // Yes, return it and stop looking any further 
      return $submatch; 
     } 
     } 
    } 
    } 
    // No match at all 
    return NULL; 
} 

öncelikle tüm menü için ağaç almak gerekir, bunu kullanmak için: ihtiyacımız alt ağacı bulana kadar biz tam bir menü ağacı yürüme kendi rulo gerekiyor gibi

Yani görünüyor gereksiniminize bağlı olarak menu_tree_page_data() veya menu_tree_all_data() kullanarak (fark için API tanımlarını kontrol edin). Ardından mlid'e dayanarak istediğiniz alt ağacı çıkarırsınız. Bu alt ağaç Sonra menu_tree_output() aracılığıyla HTML içine kılınabilir:

$mlid = 123; // TODO: Replace with logic to determine wanted mlid 
$tree = menu_tree_page_data('navigation'); // TODO: Replace 'navigation' with name of menu you're interested in 
// Extract subtree 
$subtree = yourModule_menu_get_subtree($tree, $mlid); 
// Render as HTML menu list 
$submenu = menu_tree_output($subtree); 

Yasal Uyarı: Ben bunu yapmak için iyi bir/uygun yolu olup olmadığından emin değilim - ben ile geldi sadece çözümdür bariz bir yere özlüyorum eğer bütün menü modülü fonksiyonları aracılığıyla okuma olduğu OP, aynı prosedür geçmekte sonra, her zaman ...

+0

Bugün daha önce soruyu gördüğümde cevap vermemeye karar verdim çünkü verebileceğim tek cevap bu satırlar boyunca oldu. Ters Yön. Artık cevabınızı yayınladığınıza göre, mutlu olmak zorunda mıyım bilmiyorum çünkü yaptığınızdan aynı sonuca vardım, ya da mutsuz çünkü bunu yapmanın daha iyi bir yolu yok. Her neyse: +1. – mac

+0

Alt menü çıktısının temasını oluşturmanın en iyi yolu nedir? –

+0

@matt ryan: 'menu_tree_output()' zaten temalı bir menü döndürdüğünden, ne demek istediğinizden emin değilim. Çıktısını yaratma şeklini etkilemek istiyorsanız, işlev için bağlantılı api doc sayfasına bakın; bunun için 'theme_menu_item_link', 'theme_menu_item' ve 'theme_menu_tree' komutlarını kullanır. –

13

Menu Block modül tam olarak neye ihtiyacınız yapacak merak. (Yukarıda sunulan özel işleve benzer mantık kullanır).

+1

+1 - iyi yakalamak. OP kodlama biraz daha iyi kaydedebilir :) –

+0

+1 - Güzel biri gerçekten! :) – mac

1

Yine de özel işlevlerin yolu üzerinde ... Bugün - neden tamamen farklı bir şey arıyoruz - aynı problemle karşılaşan ve yine başka bir çözümle karşılaşan başka bir meslektaşım buldum.

Orijinal gönderi here. Aşağıda, buradaki kod parçacığının c & p olduğunu.

// will return all menu items under "administration". 
print theme('menu_tree_by_path','admin'); 

// will return links to all node submission forms 
print theme('menu_tree_by_path','node/add'); 

// return the correct menu array by path 
function menu_get_mid_by_path($path) { 
// oddly, menu_get_item accepts a path, but returns the parent id. 
    $menu = menu_get_item(null, $path); 
    if (isset($menu['children'])) { 
// so we have to extract the mid for theme_menu_tree from one of the child items 
    if ($pid = end($menu['children'])) { 
     $menu = menu_get_item($pid); 
     return $menu['pid']; 
    } 
    } 
} 

//theme the crap out of it 
function theme_menu_tree_by_path($path) { 
    if ($mid = menu_get_mid_by_path($path)) { 
    return theme('menu_tree', $mid); 
    } 
}