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

Пока все стандартно. Теперь мы хотим, чтобы когда пользователь нажимает на меню Компания ему открывалась страница О компании.
Неправильное решение
Можно попытаться присвоить пункту Компания тот же самый адрес 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"
Чтобы комментировать, необходимо войти в систему.