Вы здесь

Друпал, меню и роутинг

С hook_menu начинается большинство модулей. Именно этот хук отвечает за роутинг, а если простым языком, то определяет по каким ссылкам в адресной строке что должно открываться/выводиться.

Подробны hook_menu выглядит следующим образом (перечислены все возможные параметры):

function hook_menu () {
    $items['abc/def'] = array(
      'title' => 'Route title',
      'title callback' => 'mymodule_title_callback',
      'title arguments' => array(1, 'abc'),
      'description' => 'Detail description what page do'
      'page callback' => 'mymodule_abc_view',
      'page arguments' => array(1, 'dfg'),
      'delivery callback' => 'drupal_deliver_html_page',
      'access callback' => 'user_access',
      'access arguments' => array('access administration pages'),
      'theme callback' => 'mymodule_get_active_theme_name',
      'theme arguments' => array(1, 'hij'),
      'file' => 'includes/mymodule.admin.inc',
      'file path' => drupal_get_path('module', 'mymodule'),
      'load arguments' => array(1),
      'weight' => 0,
      'menu_name' => 'navigation',
      'expanded' => TRUE,
      'context' => MENU_CONTEXT_PAGE,
      'tab_parent' => 'abc',
      'tab_root' => 'abc',
      'position' => 'left',
      'type' => MENU_NORMAL_ITEM,
      'options' => array(),
    );
    return $items;
}

Если мы не хотим чтобы наш новый пункт попадал в меню, то необходимо в качестве type указать MENU_CALLBACK. Для создания вкладок используется MENU_LOCAL_TASK и MENU_DEFAULT_LOCAL_TASK. Если необходимо создать пункт-действие (как то добавление нового чего то), то можно указать MENU_LOCAL_ACTION. Если надо чтобы пункт добавился в меню, но был выключен по умолчанию, то используем MENU_SUGGESTED_ITEM

Если пункт меню используется для возвращения контента без обертки страницы (например для результатов ajax запроса), то в delivery callback можно прописать ajax_deliver, вместо определения своего метода.

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

function mymodule_menu () {
    $items['admin/config/mymodule'] = array(
      'title' => 'Mymodule configuration page',
      'description' => 'Set configuration parameters for mymodule'
      'page callback' => 'drupal_get_form',
      'page arguments' => array('mymodule_admin_settings_form'),
      'access arguments' => array('access administration pages'),
      'file' => 'includes/mymodule.admin.inc',
    );
    return $items;
}

Т.к. title пропускается через t автоматически, то нигде дополнительно строки пропускать через t НЕ НАДО.

Как видите, тут уже не так сложно запомнить все параметры. Тем более что file и access arguments не являются обязательными. Хотя рекомендую группировать и выносить колбэки в отдельные файлы, чтобы подгружать необходимые методы только по необходимости.

Это меню рассмотрим более детально, чтобы хорошо понимать базу.

  • title – название элемента меню и по совместительству (если не указано иное) – заголовок страницы
  • description – описание элемента меню
  • page callback – метод php который будет вызван для формирования страницы. Если необходимо вывести форму, то используется drupal_get_form, тогда в page arguments необходимо передать имя формы и, если необходимо, дополнительные параметры
  • page arguments – параметры которые будут переданы в метод page callback. Также можно передать элемент из адреса, тогда необходимо указать его числовой индекс от начала адреса. Например, если путь mymodule/configure/%/edit то чтобы передать в качестве параметра то что стоит на месте % необходимо прописать page arguments => array(2). Разложим эту строку (нумерация начинается с нуля):
    • mymodule => 0
    • configure => 1
    • % => 2
    • edit => 3
  • access arguments – имя правила доступа, наличие которого у пользователя будет проверяться при доступе к странице. По умолчанию используется метод user_access в которые передается в качестве аргумента имя правила доступа. Но можно определить и свой метод проверки доступа, тогда его необходимо указать в access callback
  • file – имя файла в котором лежит метод для построения данных страницы. В данном примере в файле mymodule.admin.inc должен находится метод mymodule_admin_settings_form, который будет возвращать массив для для отрисовки формы.

title callback используется для динамического формирования заголовка на основе данных в роутинге. Например вместо «Добавить» выводить «Добавить новый объект», где на основе адреса будет выполняться разбор что же мы действительно добавляем. Либо использовать для вывода специфической информации, например, «Мой блог (10)», где в скобках выводить количество записей. Но будьте осторожны, т.к. кэширование может привести к побочным явлениям.

Больше информации вы найдете в описании к API. Конкретно по hook_menu для D7

Уровень: 
Версия: 

Добавить комментарий