среда, 2 декабря 2009 г.

Стилизация пунктов меню в Drupal 6

Есть проблема: нужно добавить к пунктам меню уникальные стили или идентификаторы, причем не к ссылкам, как это происходит по-умолчанию, а именно к обертке этих ссылок (в шаблоне по-умолчанию это LI). Параллельно решим еще и проблему добавления к этим же элементам-оберткам класса в зависимости от меню, к которому они принадлежат.

Сложность заключается в том, что функция theme_menu_item(...) не получает в качестве аргумента массив с данными, из которого можно извлечь идентификатор пункта меню, она получает уже сгенерированный HTML для ссылки этого пункта. Нужные данные поступают только в функцию theme_menu_item_link(...), нас интересует массив $link. Чтобы этот массив был доступен и в функции генерации элемента-обертки, можно воспользоваться следующим фокусом. Нам нужно переписать в теме обе эти функции. Например, создадим файл template.php со следующим содержанием:


<?php

function phptemplate_menu_item_link($link) {
  if (empty($link['localized_options'])) {
    $link['localized_options'] = array();
  }

  return array(
    'html' => l($link['title'], $link['href'], $link['localized_options']),
    'data' => $link,
  );

}

function phptemplate_menu_item($link, $has_children, $menu = '', $in_active_trail = FALSE, $extra_class = NULL) {
  $class = ($menu ? 'expanded' : ($has_children ? 'collapsed' : 'leaf'));
  if (!empty($extra_class)) {
    $class .= ' '. $extra_class;
  }
  if ($in_active_trail) {
    $class .= ' active-trail';
  }
  $class .= ' menu-item-' . $link['data']['mlid'];
  return '<li class="'. $class .'">'. $link['html'] . $menu ."</li>\n";
}

?>

Как видите, вместо того, чтобы просто возвращать HTML в первой функции, мы возвращаем массив, содержащий в добавок к HTML все данные о пункте меню. И уже во второй функции мы просто используем полученные данные для генерации класса, содержащего идентификатор этого пункта меню. Здесь можно использовать любые данные, например добавить название меню к классу, добавить идентификатор к элементу-обертке и др.

Первая запись

В блоге буду рассказывать (по возможности) обо всех найденных особенностях в верстке, клиентских скриптах на языке JavaScript, а также о модулях и разработке в целом под Drupal 6. Браузеры, на которые я ориентируюсь в разработке:
  • IE 6,7,8
  • Firefox 3+ (хотя и про 2-ю версию стараюсь не забывать)
  • Opera 9.5+
  • Safari 4+
Как только будет готов мой персональный сайт на Drupal, этот блог переедет туда.