Функция Drupal 7 menu_tree_page_data не работает правильно? - PullRequest
0 голосов
/ 06 декабря 2011

Читая документацию для menu_tree_page_data () , мне кажется, что я должен иметь возможность извлечь все содержимое моего главного меню, вызвав функцию следующим образом: menu_tree_page_data('main-menu'). Так как параметр 2, $max_depth, по умолчанию равен NULL, это должно рекурсивно пройти все уровни. Поскольку параметр 3, $only_active_trail, по умолчанию равен FALSE, он должен получить все ссылки, а не только те, которые находятся на активном трейле.

Однако при вызове этой функции я получаю данные дерева следующего типа.

Все ссылки на первом уровне глубины.
Все ссылки на втором уровне глубины.
Только активные ссылки на третьем уровне глубины.

Что здесь происходит? Я также попытался явно установить params как menu_tree_page_data('main-menu', 10, FALSE), чтобы убедиться, что я не неправильно интерпретировал поведение по умолчанию. Мне пришлось написать свою собственную функцию, чтобы дать мне все меню, но в нем нет данных активного следа. Теперь я нахожусь в ситуации, когда я смешиваю две функции для создания полного дерева меню с информацией активного следа, и это очень грязно. Было бы замечательно, если бы одно решение работало.

В качестве альтернативы, есть ли простой способ определения активного следа для данного пункта меню? Если это так, я просто добавлю это в свою уже работающую функцию поиска дерева и вызову ее через день.

1 Ответ

2 голосов
/ 06 декабря 2011

Я думаю, что это проблема со статическим кэшированием в menu_tree_page_data().Идентификатор кэша создается с использованием (помимо прочего) $max_depth, переданного в функцию или MENU_MAX_DEPTH, в зависимости от того, что меньше.

Поскольку MENU_MAX_DEPTH равно 9,когда вы передаете 10 в функцию, она автоматически сбрасывается на 9, и из этого строится идентификатор кэша.Если другая функция уже вызвала menu_tree_page_data() с MENU_MAX_DEPTH в качестве аргумента $max_depth (что происходит раньше на странице Drupal) и с $only_active_trail, установленным на TRUE, статически кэшированные данные будут возвращены с только активные элементы следа.

Я думаю будет работать следующее:

drupal_static_reset('menu_tree_page_data');
$tree = menu_tree_page_data('main-menu');

Если это не так, вам также может понадобитьсяочистить кеш для другой задействованной функции (_menu_build_tree()), поэтому попробуйте это:

drupal_static_reset('_menu_build_tree');
drupal_static_reset('menu_tree_page_data');
$tree = menu_tree_page_data('main-menu');

Надеюсь, что это имеет смысл, объяснять довольно сложно:)

...