Курим систему меню 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://www.drupal.ru/node/53508

Курим систему меню 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

© 2009 Обзор CMS