Использование hook_menu() для создания страниц в Drupal 7

hook_menu() используется для программного создания страниц и ссылок меню.

Разберем пример на основе модуля Menu example (машинное имя me) в котором мы создадим тестовую страницу для демонстрации работы с hook_menu().

Первым делом создадим файл cm.info:

name = Menu example
description = Examples of using hook_menu()
core = 7.x
package = Custom

Далее создадим файл cm.module и объявим в нем hook_menu():

/**
 * Implements hook_menu().
 */
function me_menu() {
 
  $items['simple_page'] = array(
    'title' => 'Simple page',
    'page callback' => 'me_simple_page_content',
    'access callback' => TRUE,
    'menu_name' => 'main-menu',
    'file' => 'me.pages.inc',
    'options' => array('attributes' => array('class' => array('test-class'))),
  );
 
  return $items;
}

Разберем вышеприведенный код. В нем мы создаем массив $items в котором каждый ключ соответствует пути создаваемой страницы (в нашем случаем мы создаем страницу путь которой simple_page).

Каждой объявленной странице мы передаем некоторый набор настроек. Рассмотрим представленные в этом примере:

  • title - Заголовок страницы. Передаваемое значение не должно быть завернуто в функцию t().
  • page callback - функция возвращающая содержимое страницы (ее мы определим в файле me.pages.inc.
  • access callback - функция определяющая доступ к данной странице. Если эта функция возвращает TRUE значит пользователь имеет доступ, если FALSE - нет. В нашем случае мы сразу передаем TRUE, что означает что все пользователи имеют доступ.
  • menu_name - машинное имя меню в котором будет создана ссылка на эту страницу.
  • file - имя файла в котором содержится функция объявленная в page callback, если не указано значит функция содержится в том же файле что и hook_menu(), но по правилам хорошего тона следует выносить все подобные функции в файл MODULENAME.pages.inc.
  • options - массив с параметрами которые будут переданы в функцию l() при генерации ссылки в меню.

Теперь создадим файл me.pages.inc и объявим в нем функцию me_simple_page_content:

/**
 * Simple page content.
 */
function me_simple_page_content() {
  return 'Content of simple page';
}

В данном случае мы в качестве содержимого страницы возвращаем простую строку.

Включаем модуль:

Включение модуля Menu example

Видим что в главном меню появилась новая страница Simple page

Отображение страницы Simpe page

Теперь рассмотрим как создать табы для страницы Simple page. Для этого добавим в hook_menu() еще два элемента:

$items['simple_page/main-tab'] = array(
  'title' => 'Simple page (main tab)',
  'page callback' => 'me_simple_page_content',
  'access callback' => TRUE,
  'menu_name' => 'main-menu',
  'file' => 'me.pages.inc',
  'type' => MENU_DEFAULT_LOCAL_TASK,
);
 
$items['simple_page/sub-tab'] = array(
  'title' => 'Simple page (sub tab)',
  'page callback' => 'me_simple_page_content',
  'access callback' => TRUE,
  'menu_name' => 'main-menu',
  'file' => 'me.pages.inc',
  'type' => MENU_LOCAL_TASK,
);

Тут надо обратить внимание на свойство type оно может иметь следующие значения:

  • MENU_NORMAL_ITEM - страница со ссылкой в меню (ссылка может быть скрыта администратором). Этот тип является типом по умолчанию, поэтому для страницы Simple page мы его не указывали.
  • MENU_CALLBACK - станица без ссылки в меню.
  • MENU_SUGGESTED_ITEM - тоже что MENU_NORMAL_ITEM но создаваемая в меню ссылка по умолчанию отключена.
  • MENU_LOCAL_ACTION - создает ссылку на страницу какого-то действия связанно с контекстом текущей страницы (например ссылка Добавить блок в разделе Блоки).
  • MENU_LOCAL_TASK - используется для создания таба
  • MENU_DEFAULT_LOCAL_TASK - используется для создания таба по умолчанию

При создании табов один из них всегда должен иметь тип MENU_DEFAULT_LOCAL_TASK (таб по умолчанию), а остальные MENU_LOCAL_TASK. Также они должны иметь одинаковый базовый путь (в нашем случае это simpe_page).

Чистим кэш и смотрим как изменилась наша страница:

Отображение табов на странице Simple page

Теперь создадим страницу локального действия, для этого добавим еще один элемент в hook_menu():

$items['simple_page/sub-tab2'] = array(
  'title' => 'Simple page (local action)',
  'page callback' => 'me_simple_page_content',
  'access callback' => TRUE,
  'menu_name' => 'main-menu',
  'file' => 'me.pages.inc',
  'type' => MENU_LOCAL_ACTION,
);

Чистим кэш и смотрим на результат:

Отображение ссылки локального действия

Напоследок рассмотрим список остальных настроек для страниц:

  • title callback - имя функции возвращающей заголовок страницы, по умолчанию это t().
  • title arguments - массив аргументов передаваемых в функцию объявленную в title callback.
  • description - описание создаваемой ссылки меню.
  • page arguments - массив аргументов передаваемых в page callback.
  • access arguments - массив аргументов передаваемых в access callback.
  • weight - вес создаваемой ссылки меню
Поделись с друзьями:

Комментарии

Спасибо, помогла твоя статья в освоении друпала