Курим систему меню Drupal

Рассмотрим кусок меню на обычном сайте.

Пока все стандартно. Теперь мы хотим, чтобы когда пользователь нажимает на меню Компания ему открывалась страница О компании.

Неправильное решение

Можно попытаться присвоить пункту Компания тот же самый адрес node/45. Пользователь делает клик на Компания .. И тут мы обнаруживаем интересную особенность Друпала. Из двух пунктов меню с одинаковыми адресами активным (class=”active”) Друпал сделает только один – первый по списку. Кроме того, если вы играетесь с модулем Custom Breadcrumbs – вы получите неверные хлебные крошки.
Дальше у нас есть выбор – сдаться и сделать для пункта меню Компания отдельную нормальную страницу. Либо включить хитрость и сделать страницу-редиректор которая бы перекидывала пользователя с Компания на О компании.

Как не надо делать

Начитавшись Drupal API у вас может возникнуть “гениальная” идея. Создаем новый тип материала, например, fake_page, делаем новую ноду этого типа и в ней пишем


<?php
  drupal_goto
('node/45');
?>

Плюсов у этого решения нет, одни недостатки:

  • Внезапно отваливается индексация поиска. И вообще весь крон. В watchdog вы увидите сообщение “Cron run exceeded the time limit and was aborted.”, хотя сам крон отрабатывается мгновенно. Через некоторое время (большое? ;) вы обнаружите, что крон умирает именно в модуле search. И именно на ноде-редиректоре.
  • Человек, пришедший после вас, при попытка посмотреть содержимое fake_page будет попадать в другое место и долго удивляться что за фигня.

Правильное решение

Существует прекрасный модуль Path redirect, который в явном виде позволяет задать переадресацию с одного адреса на другой. А с помощью расово верного патча он позволяет делать переадресацию с уже существующего пути в любое другое место. Почему с уже существующего? Потому что Друпал не позволит создать пункт меню Компания с пустым адресом.
Теперь о том, где взять “уже существующий путь”. По прежнему мы можем создавать пустые ноды типа fake_page, делать им красивые алиасы и адреса этих нод указывать в качестве путей для меню. Но мне этот подход не нравится тем, что эти пустые ноды будут болтаться в списке контента.
Другой подход – следуя модному в стране тренду, сделать наномодуль ;) . Который только тем и будет заниматься, что объявлять нужный нам адрес существующим. Далее пример такого модуля:

nanofake.info

name = Nanofake
description = Emulates fake addresses
core = 6.x

nanofake.module

<?php
 
function nanofake_menu() {
  $items['fake1'] = array(
    'page callback' => 'nanofake_none',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );
 
  return $items;
}
 
function nanofake_none() {
  return '';
}

Теперь для пункта меню мы можем указать fake1 в качестве path, а в path redirector сделать перенаправление с fake1 на node/45.
Все это конечно только мой опыт (вполне возможно это все велосипед) и если у кого-то есть опыт более позитивный – прошу в комментарии.

Прикрепленный файл Размер
illustrate-1.png 6.44 кб
nanofake.zip 592 байта

Источник: http://drupal.ru/node/53508

Добавить комментарий к записи "Курим систему меню Drupal"

Чтобы комментировать, необходимо войти в систему.

© 2009 Обзор CMS