web-dev-qa-db-ja.com

drupalで特定の親の下にあるすべてのメニュー項目を取得するにはどうすればよいですか?

私は本当に特定のメニュー項目の下の最初のレベルのmlidとタイトルテキストだけが必要です。これが私が今していることです。 (動作しますが、もっとdrupal-yの方法があるのではないかと思います。):

/**
 * Get all the children menu items below 'Style Guide' and put them in this format:
 * $menu_items[mlid] = 'menu-title'
 * @return array
 */
function mymod_get_menu_items() {
    $tree = menu_tree_all_data('primary-links');
    $branches = $tree['49952 Parent Item 579']['below']; // had to Dig for that ugly key
    $menu_items = array();
    foreach ($branches as $menu_item) {
        $menu_items[$menu_item['link']['mlid']] = $menu_item['link']['title'];
    }
    return $menu_items;
}

ある?

14
sprugman

afaik、ありません(私が間違っているといいのですが)。しばらくの間、醜いキーを探す代わりに、foreach($ tree)を追加するだけで、関数をより抽象的なヘルパー関数に変えることができます。次に、独自のロジックを使用して、必要なもの(この場合はmlid)を出力できます。ここに私の提案があります:


/**
 * Get the children of a menu item in a given menu.
 *
 * @param string $title
 *   The title of the parent menu item.
 * @param string $menu
 *   The internal menu name.
 * 
 * @return array
 *   The children of the given parent. 
 */
function MY_MODULE_submenu_tree_all_data($title, $menu = 'primary-links') {
  $tree = menu_tree_all_data($menu);
  foreach ($tree as $branch) {
    if ($branch['link']['title'] == $title) {
      return $branch['below'];
    }
  }
  return array();
}
17
Capi Etheriel

実際には、 menu_build_tree() を使用してその情報を取得する簡単な方法があります。

_// Set $path to the internal Drupal path of the parent or
// to NULL for the current path 
$path = 'node/123';
$parent = menu_link_get_preferred($path);
$parameters = array(
    'active_trail' => array($parent['plid']),
    'only_active_trail' => FALSE,
    'min_depth' => $parent['depth']+1,
    'max_depth' => $parent['depth']+1,
    'conditions' => array('plid' => $parent['mlid']),
  );

$children = menu_build_tree($parent['menu_name'], $parameters);
_

_$children_には、必要なすべての情報が含まれています。 menu_build_tree()は、アクセスまたは翻訳関連の制限もチェックするため、ユーザーが実際に表示する必要があるものだけを取得できます。

24
Bernhard Fürst

メニューブロック モジュールを調べましたか?このモジュールに関する詳細(プロジェクトページから):

...テーマでメインメニューとセカンダリメニューのリンク機能を使用して、「それよりも深いメニュー項目を表示するにはどうすればよいか」と疑問に思ったことはありませんか。

まあ、それはこのモジュールが行うことです。これは、任意のメニューの任意のレベルで始まるメニューツリーの構成可能なブロックを提供します。もっと!

したがって、テーマのメインメニューリンク機能のみを使用している場合は、「メインメニュー(レベル2+)」ブロックを追加して構成できます。このブロックは、メインメニューのページの1つに移動すると表示され、メインメニューの2番目のレベル(およびそれ以上)のメニューツリーが表示され、ツリーを下に移動すると拡大します。メニューのツリーの深さを制限したり(例:「メインメニュー(レベル2〜3)」)、すべての子サブメニューを展開したり(例:「メインメニュー(拡張レベル2+)」)することもできます。

3
Kevin

これは、指定されたmlidから始まる、メニューのサブツリー全体を返すヘルパー関数です。他の投稿のいくつかは、現在のアイテムの直接の子孫のみを返します。これにより、すべての子孫が返されます。

デフォルトでは、現在のページから始まるサブツリーが表示されますが、任意のメニューツリー(menu_build_treeによって返される)と任意のmlidを渡すことができます。

function _menu_build_subtree($menu=NULL,$mlid=NULL) {

  if ($menu == NULL || $mlid == NULL) {
    $parent = menu_link_get_preferred();
  }
  $menu = !is_null($menu) ? $menu : menu_build_tree($parent['menu_name']);
  $mlid = !is_null($mlid) ? $mlid : $parent['mlid'];

  foreach ($menu as $branch) {
    if ($branch['link']['mlid'] == $mlid) { 
      return $branch;
    }
    $twig = _menu_build_subtree($branch['below'],$mlid);
    if ($twig) { return $twig; }
  }

  return array();
}
1
vilde chaya

私はこれを使用します:あなたのパスと最終的にメニューを追加するだけで、あなたに子供を与えるでしょう。

function MY_MODULE_submenu_tree_all_data($path, $menu = 'main-menu', $curr_level = 0,          $rebuilt_path='', $childtree = array()) {
$tree = menu_tree_all_data($menu);
$args = explode('/', $path);

$rebuilt_path = empty($rebuilt_path) ? $args[$curr_level] : $rebuilt_path . '/' .  $args[$curr_level];

foreach ($tree as $branch) {
    if ($branch['link']['link_path'] == $rebuilt_path) {
        $childtree = $branch['below'];
        if ($rebuilt_path != $path) {
            $curr_level++;
            MY_MODULE_submenu_tree_all_data($path, $menu, $curr_level, $rebuilt_path, $childtree);
        }
    }
}

$items = array();
foreach ($childtree as $child) {
    $items[] = l($child['link']['title'], $child['link']['link_path']);
}

    return theme('item_list', array('items' => $items, 'attributes' => array(), 'type' => 'ul'));

}
0
bobylapointe