2010-02-01 7 views
1

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

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

ответ

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

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

1

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

Других вариантов:

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

Поскольку это условие должно быть выполнено, разрешения, вероятно, не помогут. Создание блока приведет к удалению ссылки из системы меню, поэтому он больше не будет элементом меню. – googletorp

+0

Правда, ссылка в блоке не является элементом меню, но в некоторых случаях это не проблема, поэтому я все еще хотел упомянуть об этом как опцию. – marcvangend

0

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

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

0

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

0

Вы пробовали это (вставляя ваши другие условия в «если» заявление, а также, конечно):


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; 
    } 
} 
Смежные вопросы