Drupal 6 динамический пункт меню - PullRequest
1 голос
/ 01 февраля 2010

Мне нужно создать пункт меню, который меняет его заголовок и ссылку, если у пользователя есть определенное условие или нет. Drupal кэширует все меню, поэтому я не могу придумать, как это сделать.

Например, у пользователя есть узел, прикрепленный к его профилю, пункт меню «Создать блаблу» (ссылка на узел / добавить / блабла) У пользователя нет узла, пункт меню «Создать notblablabla» (ссылка на узел / add / notblabla)

Ответы [ 6 ]

2 голосов
/ 24 мая 2011

Лучший и самый простой способ - использовать hook_menu с параметром title_callback.

См. thedrupalblog.com и drupal.org .

1 голос
/ 01 февраля 2010

Drupal не разрешает динамические пункты меню, но может скрывать определенные пункты меню, если пользователю не разрешено заходить туда. Обращаясь к вашему примеру, если вы создадите обе ссылки и используете систему разрешений, чтобы ограничить создание этих типов узлов определенными ролями, Drupal будет показывать пункты меню, только если у пользователя есть требуемая роль. Может быть, это помогает в вашей ситуации.

Другие опции:

  • написать простой модуль, который показывает одну ссылку для всех пользователей и перенаправляет на соответствующую страницу при нажатии
  • создать пользовательский блок, который отображает правильную ссылку на основе текущего пользователя (убедитесь, что блок не кэширован)
  • используйте javascript, как предлагает googletorp (хотя я бы не рекомендовал его по причинам, которые он упоминает)
0 голосов
/ 16 марта 2010

Вы пробовали это (вставляя и другие условия в оператор if):


function hook_translated_menu_link_alter(&$item, $map) {
  if ($item['href'] == 'node/add/blabla') {
    $item['href'] = 'node/add/notblabla';
  }
}

Вам, вероятно, также придется сделать это, чтобы пометить ссылку как изменяемую:


function hook_menu_link_alter(&$item, $menu) {
  if ($item['link_path'] == 'node/add/blabla') {
    $item['options']['alter'] = TRUE;
  }
}
0 голосов
/ 02 февраля 2010

Поскольку этот пункт меню основан на информации о профиле пользователя, я бы предложил написать простой модуль, который реализует hook_menu_alter() для изменения меню в зависимости от вашего состояния. Затем вы можете вызвать menu_cache_clear() внутри hook_user(), чтобы обновить кэш меню при изменении профиля пользователя.

0 голосов
/ 02 февраля 2010

Я бы, вероятно, создал два пункта меню и использовал бы систему тем, чтобы скрыть один или другой в зависимости от условия.

Это было давно, но я бы посмотрел на:

0 голосов
/ 01 февраля 2010
  • Простой способ сделать это - использовать JavaScript. Вы можете изменить HTML без особых усилий, используя jQuery. Это потребует, чтобы ваши пользователи включили JS, поэтому это не идеальное решение.

  • Другой вариант - иметь отдельный элемент меню, связанный с URL-адресом, который вы создали в модуле. Если вы можете выполнить проверку условия, перенаправьте пользователя на тот URL-адрес, на который он должен быть перенаправлен. Единственная проблема с этим методом будет то, что изменение заголовка пункта меню. Но вы могли бы дать подходящее описание для обоих случаев. Вы также можете использовать JS, чтобы изменить имя ссылки. Таким образом вы бы сохранили функциональность без JS, но улучшили бы пользовательский интерфейс для пользователей, у которых он включен.

...