Сышышь ты, выходи сюда,
поговорим!

Реализация хука

Опубликовано: 21.10.2017

Среда Drupal основана на системе хуков (hook), которые иногда называют обратными вызовами (callback). Во время своей работы Drupal опрашивает модули, хотят ли они сделать что-либо. Например, при загрузке ноды из базы данных перед выводом на странице Drupal просматривает все активные модули и проверяет, реализована ли в них функция hook_node_load(). Если это так, Drupal сначала запускает хук этого модуля, а уже потом отображает ноду на странице. Мы рассмотрим работу этого механизма на примере модуля аннотации.

Первым нашим реализованным хуком будет функция hook_menu(). С ее помощью мы добавим два элемента в меню администрирования сайта. Мы добавим новый пункт меню “annotate” (аннотировать) в главное меню admin/config (администрирования/конфигурирования) и подпункт этого пункта по имени “settings” (параметры), при щелчке на котором будет открываться страница параметров настройки для аннотирования. Значениями элементов меню являются массивы пар “ключ-значение”, которые задают действия Drupal при запросе данного пути. Они будут рассмотрены в главе 4, где описывается система меню и обратных вызовов Drupal . Вызов hook_menu мы назовем annotate_menu — т.е. заменим hook именем нашего модуля. Так принято со всеми хуками: слово hook заменяется именем модуля. Ниже показано, что добавляется в модуль:

/** * Реализация hook_menu(). */functionannotate_menu() { $items['admin/config/annotate'] = array('title' => 'Node annotation', // Аннотирование ноды'description' => 'Adjust node annotation options.', // Настройка параметров аннотирования ноды'position' => 'right', 'weight' => -5, 'page callback' => 'system_admin_menu_block_page', // обратный вызов страницы'access arguments' => array('administer site configuration'), // аргументы доступа'file' => 'system.admin.inc', 'file path' => drupal_get_path('module', 'system'), ); $items['admin/config/annotate/settings'] = array('title' => 'Annotation settings', // Параметры аннотации'description' => 'Change how annotations behave.', // Изменение поведеня аннотаций'page callback' => 'drupal_get_form', 'page arguments' => array('annotate_admin_settings'), // аргументы страницы'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, 'file' => 'annotate.admin.inc', ); return$items; }

Не беспокойтесь, если что-то здесь непонятно. Приведенный код означает: “Если пользователь зайдет на страницу http://example.com/?q=admin/settings/annotate/settings , необходимо вызвать функцию drupal_get_form() и передать ей идентификатор формы annotate_admin_settings. Функцию, описывающую эту форму, нужно искать в файле annotate.admin.inc . Данный элемент меню должен быть виден только пользователям с правом administer site configuration (настройка конфигурации сайта)”. Когда понадобится вывести форму, Drupal запросит определение формы (об этом чуть ниже). После окончания запроса всех модулей для элементов меню будет сформирован список, из которого Drupal выберет нужную функцию для вызова запрошенного пути.

rss