Как темизировать только собственное меню, не трогая primary_links и navigation в drupal6

Главные вкладки

Аватар пользователя artanna@drupal.org artanna@drupal.org 17 ноября 2008 в 2:37

Дорогие товарищи,

Помогите разобраться наконец как работает схема темизации системы меню для Drupal 6.

Вопрос касается именно собственного меню (не primary или secondary), созданного через Home » Управление » Конструкция сайта » Меню » Добавить меню.
Создал например, меню topmenu (машинное имя меню). Разместил его в блок. Как мне темизировать именно это меню?
Могу изменить вывод в template.php через theme_menu_tree($tree) или, например создал menu-tree.tpl.php, но все это влияет на вывод ВСЕХ меню (Navigation и пр.).

Как разделить вывод разных меню? Кто знает куда копать - расскажите пожалуйста.

Заранее благодарен за ответы...

Комментарии

Аватар пользователя direqtor direqtor 17 ноября 2008 в 5:17

Каждому меню назначается класс или id. Это для CSS. Если в функциях темизации или в шаблонах, то проверь машинное имя этого меню, оно должно передаваться в функцию или быть доступно в шаблоне. Д

Для своего меню выполни один код, для остальных системный.

Аватар пользователя artanna@drupal.org artanna@drupal.org 17 ноября 2008 в 10:45

Получается что все же нельзя штатными средствами темизировать менюшки (не рассмотриваем вариант CSS меню) - надо прибегать к кодированию.

Просто на первый взгляд казалось раз есть такой замечательный механизм как переопределение - например почему бы не темизировать свое меню из menu-tree-topmenu.tpl.php или переопределить функцию theme_menu_topmenu_tree() - но это не работает Sad

Идем дальше - ок решаем кодировать ручками вывод своего меню
В блоке делаем следующее :

<?php
  print menu_tree('menu-topmenu'); // есть такая функция в апи
?>

На выходе получаем меню topmenu c форматированием как везде, но уже хорошо что имеем на входе собственное имя "topmenu"
Смотрим из чего состоит menu_tree():

<?php
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()

<?php
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' ...) - изменение которых влияет на вывод ВСЕХ меню.

Круг замкнулся... Есть предложения?

Аватар пользователя artanna@drupal.org artanna@drupal.org 17 ноября 2008 в 11:12

Еще вопрос - можно ли написать свои функции по подобию 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' ...)?

Аватар пользователя gorr gorr 5 января 2009 в 16:23

Если уж надо перекраивать, то идем с самого начала:
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.

Все.

Аватар пользователя artist artist 9 апреля 2009 в 14:06

Всем привет!
Будьте добры, кто-нибудь объясните поподробнее вот этот момент:

"gorr" wrote:
Затем надо еще зарегистрировать эту функцию темирования в нашей теме с помощью MY_FANTASTIC_THEME_theme(), которая возвращает массив функций темирования, добавленных нашей темой MY_FANTASTIC_THEME.

Аватар пользователя artist artist 13 апреля 2009 в 16:59

сам разобрался, пришлось покопаться в апи друпала.
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))
  );
}
?>

затем "сбросить" кэш и вуаля, все работает.
З.Ы.: чем дольше работаю с друпалом, тем больше нравится Smile

Аватар пользователя kiev1 kiev1 4 июня 2009 в 3:35

какой кошмар (((

выходит шаблон общий на все меню есть - menu-tree.tpl.php
а только на одно по ID или имени нет???
ерунда какая-то...
хотя, хотя помнится в 4-м друпале даже нельзя было в шаблоне задать другие зоны кроме left и right )))) http://drupal.org/node/15854