
Наконец то продолжу рассказ про хуки. Что главное в любом сайте? Конечно же контент! А где контент находится? На страничках! Вот о создании страниц и поговорим.
В отличии от программного создания блоков, здесь все будет немного посложней, в первую очередь за счет большой функциональности используемого хука.
Для программного создания страницы нам прежде всего понадобится создать пустой модуль, после чего весь код будет писаться в файле modulename.module.
hook_menu()
Именно с помощью этого хука можно создать страничку в Drupal 7. Кроме того он же отвечает за элементы меню. Хук не принимает никаких аргументов, а возвращает ассоциативный массив элементов меню, каждый элемент такого массива содержит массив с атрибутами конкретного элемента меню, они могут быть следующими:
- title - заголовок элемента меню. Строка, которая будет отображаться в заголовке страницы и названии меню. Для неё не надо использовать функцию t(), но заголовок должен быть на английском языке. Обязательный элемент.
- title callback - функция обратного вызова для генерации заголовка. По умолчанию используется функция
t()
. Удобна для создания динамических заголовков. - title arguments - аргументы для функции обратного вызова, генерации заголовка.
- description - описание элемента меню.
- page callback - название функции обратного вызова, для генерации страницы.
- page arguments - массив аргументов, которые будут переданы функции обратного вызова.
- delivery callback - функция доставки html в браузер. По умолчанию
drupal_deliver_html_page()
. - access callback - функция обратного вызова для определения прав доступа к странице/ элементу меню. По умолчанию
user_access()
- access arguments - аргументы для функции определения прав доступа к элементу меню.
- theme callback - функция возвращающая машинное имя темы, которая будет использованная на странице.
- theme arguments - аргументы для "theme callback".
- file - название файла, в котором находится функция page callback.
- file path - путь к вышеназванному файлу. По умолчанию текущая директория модуля.
- load arguments - аргументы для функции загрузки. Об этом подробней в ближайшее время:)
- weight - вес элемента меню. Чем меньше, тем элемент выше.
- menu_name - название меню, в котором будет размещен новый элемент.
- context - определяет как будет отображаться ссылка в меню локальных задач, если является локальной задачей (local task). Может принимать одно из значений:
- MENU_CONTEXT_PAGE - только на странице материала.
- MENU_CONTEXT_INLINE - только как контекстная ссылка.
Так же можно использовать конструкцию
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE
- tab_parent - родительский элемент для локальной задачи. По умолчанию это элемент на уровень выше.
- tab_root - ближайший элемент не являющийся локальной задачей. По умолчанию содержит значение заданное в tab_parent.
- position - позиция блока для этого элемента на странице администраторского меню ('left' или 'right').
- type - тип элемента меню. Может принимать следующие значения:
- MENU_NORMAL_ITEM - обычный элемент меню.
- MENU_CALLBACK - простая регистрация обратного вызова страницы, без создания элемента меню.
- MENU_SUGGESTED_ITEM - пункт меню, который необходимо включить администратору.
- MENU_LOCAL_ACTION - элемент меню является локальным действием.
- MENU_LOCAL_TASK - элемент меню является локальной задачей
- MENU_DEFAULT_LOCAL_TASK - локальная задача по умолчанию.
Если значение не заданно, то используется MENU_NORMAL_ITEM.
- options - массив опций для функции
l()
, с помощью которой генерируется html ссылки.
Конечно же подробную информацию об этом хуке можно найти в англоязычной официальной документации, на сайте Drupal.org
Реализация хука, создание страницы
С хуком немного разобрались, теперь можно его реализовать. Для этого в файле modulename.module, в простейшем случае, пишем следующий код:
* Implements hook_menu().
*/
function modulename_menu() {
$items['mytestpage'] = array(
'title' => 'My test page',
'access callback' => TRUE,
'page callback' => 'mymodule_page_callback',
'type' => MENU_CALLBACK,
);
}
Такая реализация хука значит следующее - по адресу site.ru/mytestpage (или site.ru/?q=mytestpage) будет отображаться страничка с заголовком 'My test page', доступная для всех. Элемента меню для неё заданно не будет, а содержимое новой страницы возвращает функция mymodule_page_callback()
. Теперь необходимо написать саму функцию обратного вызова, например так:
* Page callback.
**/
function mymodule_page_callback() {
return t('Hello! I\'m your first page!');
}
Теперь если зайти по адресу site.ru/mytestpage (если включены "чистые ссылки", если нет, то заходим по адресу site.ru/?q=mytestpage) , то можно увидеть страничку с надписью "Hello! I'm your first page!". Элементарная страничка создана.
В функцию обратного вызова можно передавать параметры. Все следующие за указанным в хуке адресом параметры автоматически будут переданы в функцию обратного вызова. И если, например, изменить callback функцию так:
* Page callback.
**/
function mymodule_page_callback($arg = 'Hello') {
return t('@arg! I\'m your first page!',
array('@arg' => $arg));
}
То зайдя на сайт по ссылке site.ru/mytestpage/yo, на странице появится "yo! I'm your first page!". Кроме того, массив аргументов можно передать в хуке, элементу page arguments
и использовать таким же образом.
Это далеко не все возможности hook_menu() - с его помощью можно установить контроль доступа к странице, управлять ссылками меню, создавать страницы с динамическими адресами (например как node/1, node/2 и т.д.), но обо всем этом в следующий раз. А на сегодня всё, успехов и до скорых встреч!