Для тестирования немного, Вы сделали бы следующее: (принимающие флаги являются числом на 32 бита)
, Тест Укусил:
if((flags & 0x08) == 0x08)
(Если бит 4 установлен тогда его истинное), Переключатель Назад (1 - 0 или 0 - 1): flags = flags ^ 0x08;
Обнуленный Бит 4: flags = flags & 0xFFFFFF7F;
Я всегда задавался вопросом, почему в ядре нет функции для этого, но, черт возьми, ее нет.
Так что, похоже, нам нужно свернуть свое собственное, пройдя полное дерево меню, пока мы не найдите нужное нам поддерево:
/**
* 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, то есть чтения всех функций модуля меню, всегда задаваясь вопросом, могу ли я
Модуль Блок меню сделает именно то, что вам нужно. (Здесь используется аналогичная логика пользовательской функции, представленной выше).
Все еще на пути к пользовательским функциям ... Сегодня - зачем искать что-то совершенно другое - я нашел еще одного коллегу, столкнувшегося с той же проблемой и придумавшего еще одно решение.
исходное сообщение находится здесь . Ниже приводится c & p фрагмента кода.
// 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);
}
}