Система меню Drupal - вывод дерева на один уровень вниз - PullRequest
5 голосов
/ 03 декабря 2009

Я читал различные функции меню в Drupal, но их очень много, и я достиг точки полного замешательства и отчаяния ... Надежда на одного из умников здесь может помочь мне ...

По сути, у меня есть четыре уровня в моем меню. Я пытаюсь создать дерево, которое выводит со второго уровня вниз.

Итак, меню выглядит так: УРОВЕНЬ ПЕРВЫЙ> Подуровень A> Подуровень I> Подуровень a

Я пытаюсь вывести дерево меню, начинающееся с подуровня A (то есть подуровень A> подуровень I> подуровень a)

Но, на мой взгляд, не могу понять, как это сделать ... Я попытался просто получить мл меню Подуровня А (в данном случае 69), а затем

<?php print theme_menu_tree(69); ?>

но он просто печатает '69'. Совсем не то, что я ожидал ...

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

13 голосов
/ 04 декабря 2009

Модуль Блок меню сделает именно то, что вам нужно. (Используется логика, аналогичная пользовательской функции, представленной выше).

11 голосов
/ 03 декабря 2009

Мне всегда было интересно, почему в ядре нет функции для этого, но на самом деле ее нет.

Похоже, нам нужно свернуть наше собственное, пройдя полное дерево меню, пока мы не найдем нужное поддерево:

/**
 * 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;
}

Чтобы использовать его, сначала нужно получить дерево для всего меню, используя menu_tree_page_data() или menu_tree_all_data(), в зависимости от того, что вам нужно (проверьте определения API) за разницу). Затем вы извлекаете нужное поддерево на основе mlid. Затем это поддерево можно преобразовать в HTML с помощью menu_tree_output():

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

Отказ от ответственности: Я не уверен, является ли это хорошим / правильным способом сделать это - это просто решение, которое я нашел после того, как прошел ту же процедуру, что и OP, то есть чтение через все функции модуля меню, всегда задаваясь вопросом, пропускаю ли я где-то очевидное ...

1 голос
/ 04 декабря 2009

Все еще на пути к пользовательским функциям ... Сегодня - зачем искать что-то совершенно другое - я нашел еще одного коллегу, столкнувшегося с той же проблемой и находящего еще одно решение.

Оригинальный пост здесь . Ниже приведено описание кода фрагмента кода.

// 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);
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...