Дорогие товарищи,
Помогите разобраться наконец как работает схема темизации системы меню для Drupal 6.
Вопрос касается именно собственного меню (не primary или secondary), созданного через Home » Управление » Конструкция сайта » Меню » Добавить меню.
Создал например, меню topmenu (машинное имя меню). Разместил его в блок. Как мне темизировать именно это меню?
Могу изменить вывод в template.php через theme_menu_tree($tree) или, например создал menu-tree.tpl.php, но все это влияет на вывод ВСЕХ меню (Navigation и пр.).
Как разделить вывод разных меню? Кто знает куда копать - расскажите пожалуйста.
Заранее благодарен за ответы...
Комментарии
Каждому меню назначается класс или id. Это для CSS. Если в функциях темизации или в шаблонах, то проверь машинное имя этого меню, оно должно передаваться в функцию или быть доступно в шаблоне. Д
Для своего меню выполни один код, для остальных системный.
Получается что все же нельзя штатными средствами темизировать менюшки (не рассмотриваем вариант CSS меню) - надо прибегать к кодированию.
Просто на первый взгляд казалось раз есть такой замечательный механизм как переопределение - например почему бы не темизировать свое меню из menu-tree-topmenu.tpl.php или переопределить функцию theme_menu_topmenu_tree() - но это не работает
Идем дальше - ок решаем кодировать ручками вывод своего меню
В блоке делаем следующее :
print menu_tree('menu-topmenu'); // есть такая функция в апи
?>
На выходе получаем меню topmenu c форматированием как везде, но уже хорошо что имеем на входе собственное имя "topmenu"
Смотрим из чего состоит menu_tree():
function menu_tree($menu_name = 'navigation') {
static $menu_output = array();
if (!isset($menu_output[$menu_name])) {
$tree = menu_tree_page_data($menu_name);
$menu_output[$menu_name] = menu_tree_output($tree); // Вот тут мы снова должны покапаться чтобы настроить свой вывод
}
return $menu_output[$menu_name];
}
?>
Смотртим menu_tree_output()
function menu_tree_output($tree) {
$output = '';
$items = array();
// Pull out just the menu items we are going to render so that we
// get an accurate count for the first/last classes.
foreach ($tree as $data) {
if (!$data['link']['hidden']) {
$items[] = $data;
}
}
$num_items = count($items);
foreach ($items as $i => $data) {
$extra_class = NULL;
if ($i == 0) {
$extra_class = 'first';
}
if ($i == $num_items - 1) {
$extra_class = 'last';
}
$link = theme('menu_item_link', $data['link']);
if ($data['below']) {
$output .= theme('menu_item', $link, $data['link']['has_children'], menu_tree_output($data['below']), $data['link']['in_active_trail'], $extra_class);
}
else {
$output .= theme('menu_item', $link, $data['link']['has_children'], '', $data['link']['in_active_trail'], $extra_class);
}
}
return $output ? theme('menu_tree', $output) : '';
}
?>
И снова сталкиваемся со стандартными функциями темизации меню theme('menu_tree'...), theme('menu_item' ...), theme('menu_item_link' ...) - изменение которых влияет на вывод ВСЕХ меню.
Круг замкнулся... Есть предложения?
Еще вопрос - можно ли написать свои функции по подобию theme_menu_tree_1, theme_menu_item_1, theme_menu_item_link_1 и вызывать их как theme('menu_tree_1'...), theme('menu_item_1' ...), theme('menu_item_link_1' ...)?
Если уж надо перекраивать, то идем с самого начала:
1) Копируем в template.php функции
а) menu_tree
б) menu_tree_output
И переназываем по-своему, например:
а) my_menu_tree
б) my_menu_tree_output
Далее правим их как нам нужно, например заменяем в первой функции вызов menu_tree_output на вызов my_menu_tree_output, а во второй
$output .= theme('menu_item', $link, $data['link']['has_children'], menu_tree_output($data['below']), $data['link']['in_active_trail'], $extra_class);
заменяем на
$output .= theme('my_special_theme_function' , $link, $data['link']['has_children'], menu_tree_output($data['below']), $data['link']['in_active_trail'], $extra_class);
после чего создаем нашу my_special_theme_function наподобие theme_menu_item, но с учетом наших поправок, которые нам так необходимы:)
Затем надо еще зарегистрировать эту функцию темирования в нашей теме с помощью MY_FANTASTIC_THEME_theme(), которая возвращает массив функций темирования, добавленных нашей темой MY_FANTASTIC_THEME.
Все.
Всем привет!
Будьте добры, кто-нибудь объясните поподробнее вот этот момент:
сам разобрался, пришлось покопаться в апи друпала.
MY_FANTASTIC_THEME_theme() это реализация hook_theme.
например темизация терминов таксономии:
есть такой вывод
<?php echo theme("terms_link",$taxonomy); ?>
соответственно у вас должна быть функция
<?php function yourthemename_terms_link($terms){...}?>
но для того чтобы друпал занес эту функцию в реестр тем нужно ему об ээтом сказать с помощью вызова hook_theme, для этого необходимо в модуле или файле template.php вашей темы реализовать этот хук:
<?php function yourthemename_theme() {
return array(
'terms_link' => array(
'arguments' => array("terms" => NULL))
);
}?>
затем "сбросить" кэш и вуаля, все работает.
З.Ы.: чем дольше работаю с друпалом, тем больше нравится
какой кошмар (((
выходит шаблон общий на все меню есть - menu-tree.tpl.php
а только на одно по ID или имени нет???
ерунда какая-то...
хотя, хотя помнится в 4-м друпале даже нельзя было в шаблоне задать другие зоны кроме left и right )))) http://drupal.org/node/15854