Drupal программно добавляет элемент в меню - PullRequest
3 голосов
/ 16 декабря 2010

Я хочу условно добавить пункт в меню.У меня есть пользовательский модуль и меню под названием «ссылки».Как добавить элемент в меню в коде моего модуля?

Ответы [ 5 ]

3 голосов
/ 16 декабря 2010

Вам необходимо реализовать hook_menu в вашем модуле. Пример:

<?php
function mymodule_menu() {
  $items['mymodule/links'] = array(
    'title' => 'Links', 
    'page callback' => 'mymodule_links_page', 
    'access arguments' => array('access content'), 
    'type' => MENU_SUGGESTED_ITEM,
  );
  return $items;
}
?>

Часть 'type' => MENU_SUGGESTED_ITEM, делает его необязательным, поэтому его может включить конечный пользователь - это то, что вы имели в виду «условно»? Если нет, пожалуйста, объясните, что за «условно» вы ищете.

2 голосов
/ 30 мая 2013

Вы можете динамически отображать или скрывать пункт меню в зависимости от условия (обратный вызов доступа).

Вот пример из https://drupal.org/project/examples:

<?php
function mymodule_menu() {
  $items = array();

  $items['my-menu-item'] = array(
    'title' => 'My Menu',
    'description' => 'My description',
    'page callback' => 'my_page_link_callback_function_name',
    'access callback' => 'can_the_user_see_this_item',
    'expanded' => TRUE,
    'weight' => -100,
    'menu_name' => 'primary-links',
  ); 

  return $items;
}

// Here we determine if the user can or can not see the item.
function can_the_user_see_this_item(){
  if (MY_CONDITION){
    return TRUE;
  }
  else {
    return FALSE;
  }
}
2 голосов
/ 20 сентября 2011

Или вы можете использовать 'type' => MENU_NORMAL_ITEM,, так как он включен по умолчанию, но может быть отключен в любое время.Это, конечно, зависит от ваших предпочтений.См. http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7 для получения дополнительной справки.

Еще одна полезная вещь, которую необходимо знать при использовании определенных в модуле пунктов меню в пользовательских меню, может заключаться в том, как программно создать меню, которое вы хотите использовать, чтобы все было создано "изиз коробки ".Просто добавьте файл mymodule.install, в который вы поместите следующий код:

<?php  
function mymodule_install() {  
  $menu = array(  
    'menu_name' => 'links',  
    'title' => 'My Custom Links',  
    'description' => 'Descriptive text.',  
  );  
  menu_save($menu);  
}  
?>

Если у вас есть функция удаления, не забудьте не только деактивировать модуль, но и удалить его.Включите модуль, очистите кэш, и пункт меню должен быть там!

1 голос
/ 19 января 2014

Использование menu_link_save () функция

Saves a menu link.

After calling this function, rebuild the menu cache using menu_cache_clear_all().

Parameters

$item: An associative array representing a menu link item, with elements:

link_path: (required) The path of the menu item, which should be normalized first by calling drupal_get_normal_path() on it.
link_title: (required) Title to appear in menu for the link.
menu_name: (optional) The machine name of the menu for the link. Defaults to 'navigation'.
weight: (optional) Integer to determine position in menu. Default is 0.
expanded: (optional) Boolean that determines if the item is expanded.
options: (optional) An array of options, see l() for more.
mlid: (optional) Menu link identifier, the primary integer key for each menu link. Can be set to an existing value, or to 0 or NULL to insert a new link.
plid: (optional) The mlid of the parent.
router_path: (optional) The path of the relevant router item.
$existing_item: Optional, the current record from the {menu_links} table as an array.

$parent_candidates: Optional array of menu links keyed by mlid. Used by _menu_navigation_links_rebuild() only.

Return value

The mlid of the saved menu link, or FALSE if the menu link could not be saved.
1 голос
/ 16 декабря 2010

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

Что вы могли бы сделать, чтобы создать этот эффект, это создать некоторую пользовательскую логику для определения управления доступом в пункте меню.Поскольку Drupal скрывает пункты меню, к которым у пользователей нет доступа, при определенных обстоятельствах вы можете отказать в разрешении скрыть пункт меню.Это немного хакерское решение.

Другое решение, которое я бы предпочел, это использовать js или css, чтобы скрыть или показать меню.Вы можете динамически добавлять / удалять класс в теле, чтобы определить, должен ли элемент меню отображаться или нет.Однако это быстро станет неуправляемым, если вам понадобится несколько таких пунктов меню.

...