Показаны сообщения с ярлыком Drupal 6. Показать все сообщения
Показаны сообщения с ярлыком Drupal 6. Показать все сообщения

среда, 5 мая 2010 г.

Модули к Drupal, ожидающие моего свободного времени

Появилась необходимость перечислить модули, которые я собираюсь доработать и опубликовать на drupal.org (благо, теперь у меня есть подтвержденный CVS-аккаунт). Здесь же будут перечислены и уже опубликованные модули. Сообщение будет изменяться, пополняться, следите за изменениями.
  • Taxonomy Menu Trails (опубликован) - если у ноды нет собственного пункта меню, но у термина, к которому привязана эта нода, есть пункт меню, то менюшка будет открыта так, чтобы показывать пункт меню с термином. Это сильно упрощает построение каталогов, где в меню только термины, а ноды представлены списками по терминам.
  • Dynarray (не опубликован, готов на 80%) - модуль, расширяющий Form API. Добавляет тип элемента dynarray - массивы элементов, которые можно добавлять/удалять динамически. Можно прямо в описании указывать то, каким будет один элемент, или указать функцию для генерации одного элемента (например, когда ранее сохраненные элементы должны отличаться от вновь добавленных). Позволяет полностью избавиться от этой головной боли при написании форм. (Пометка для себя: проект orion)
  • GT Select, GT Checkbox, GT Radio (не опубликованы) - модули для темизации таких традиционно тяжело стилизуемых элементов страницы как списки для выбора, радиокнопки, галки. Для GT Select в качестве бонуса можно будет включить поле для фильтрации списка элементов. Возможно, будут выпущены еще и как jQuery-модули.
  • Tiny Menu Editor (опубликован) - очень простой модуль, позволяющий сократить потребление памяти на сервере при открытии редактора меню. На сайте, для которого писался этот модуль, около 800 пунктов меню в редакторе приводили к превышению лимита памяти в 64Мб. После включения модуля потребление памяти сократилось примерно до 40Мб.
  • File Info Filter (не опубликован, готов на 80%) - фильтр, добавляющий к ссылкам на локальные файлы информацию о типе файла и размере, а так же мини-изображение. (Пометка для себя: проект au-edu, называется au)
  • IM Status (не опубликован, готов на 80%) - модуль для отображения собственных статус-картинок для различных систем мгновенного обмена сообщениями. Пока поддерживаются Skype и ICQ. Планируется поддержка Jabber (GTalk) и хотелось бы MSN, если это вообще возможно. Изображения кэшируются на настраиваемый интервал. Сделал поддержку нескольких номеров из одной и той же социальной сети. Теперь зависит от Dynarray. Еще хотелось бы сделать разграничение доступа для показа статус-картинок только определенным ролям (или по определенной привилегии, или еще более гибко). (Пометка для себя: проект orion).
  • Taxonomy Picture (не опубликован, готов на 30%) - изображение, на котором в админке можно отметить зоны для терминов таксономии. А в режиме просмотра эти зоны заливаются цветом или наоборот, всё кроме этих зон заливается цветом. Зоны являются ссылками на термин таксономии.

среда, 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 все данные о пункте меню. И уже во второй функции мы просто используем полученные данные для генерации класса, содержащего идентификатор этого пункта меню. Здесь можно использовать любые данные, например добавить название меню к классу, добавить идентификатор к элементу-обертке и др.