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'; }
В данном случае мы в качестве содержимого страницы возвращаем простую строку.
Включаем модуль:
Видим что в главном меню появилась новая страница Simple 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).
Чистим кэш и смотрим как изменилась наша страница:
Теперь создадим страницу локального действия, для этого добавим еще один элемент в 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 - вес создаваемой ссылки меню
Комментарии
Спасибо, помогла твоя статья в освоении друпала