ertttert
Books-CMS.clan.su

Определение собственных триггеров с помощью hook_trigger_info()

Каким образом Drupal узнает, какие триггеры доступны для вывода в пользовательском интерфейсе? Обычно Drupal позволяет модулям определять хуки с объявлениями, какие триггеры реализованы в этих модулях. Вот, к примеру, простая реализация функции hook_trigger_info() из самого модуля Triggers, который определяет все стандартные триггеры, доступные после установки ядра Drupal 7:

/**
* Реализация hook_trigger_info().
*
* Определение всех триггеров.
*/
function trigger_trigger_info() {
return array(
 'node' => array(
 'node_presave' => array(
 'label' => t('When either saving new content or updating existing content'),
 // При сохранении нового контента или обновлении существующего контента
 ),
 'node_insert' => array(
 'label' => t('After saving new content'),
 // После сохранения нового контента
 ),
 'node_update' => array(
 'label' => t('After saving updated content'),
 // После сохранения измененного контента
 ),
 'node_delete' => array(
 'label' => t('After deleting content'),
 // После удаления контента
 ),
 'node_view' => array(
 'label' => t('When content is viewed by an authenticated user'),
 // При просмотре контента аутентифицированным пользователем
 ),
 ),
 'comment' => array(
 'comment_presave' => array(
 'label' => t('When either saving a new comment or updating existing comment'),
 // При сохранени нового комментария или изменении существующего комментария
 ),
 'comment_insert' => array(
 'label' => t('After saving a new comment'),
 // После сохранения нового комментария
 ),
 'comment_update' => array(
 'label' => t('After saving an updated comment'),
 // После сохранения измененного комментария
 ),
 'comment_delete' => array(
 'label' => t('After deleting a comment'),
 // После удаления комментария
 ),
 'comment_view' => array(
 'label' => t('When a comment is being viewed by an authenticated user'),
 // При просмотре комментария аутентифицированным пользователем
 ),
 ),
 'taxonomy' => array(
 'taxonomy_term_insert' => array(
 'label' => t('After saving a new term to the database'),
 // После сохранения нового термина в базе данных
 ),
 'taxonomy_term_update' => array(
 'label' => t('After saving an updated term to the database'),
 // После сохранения измененного термина в базе данных
 ),
 'taxonomy_term_delete' => array(
 'label' => t('After deleting a term'), // После удаления термина
 ),
 ),
 'system' => array(
 'cron' => array(
 'label' => t('When cron runs'), // При запуске cron
 ),
 ),
 'user' => array(
 'user_presave' => array(
 'label' => t('When either creating a new user account or updating an existing'),
 // При создании новой пользовательской учетной записи или изменении существующей
 ),
 'user_insert' => array(
 'label' => t('After creating a new user account'),
 // После создания новой пользовательской учетной записи
 ),
 'user_update' => array(
 'label' => t('After updating a user account'),
 // После изменения пользовательской учетной записи
 ),
 'user_delete' => array(
 'label' => t('After a user has been deleted'),
 // После удаления пользователя
 ),
 'user_login' => array(
 'label' => t('After a user has logged in'),
 // После входа пользователя
 ),
 'user_logout' => array(
 'label' => t('After a user has logged out'),
 // После выхода пользователя
 ),
 'user_view' => array(
 'label' => t("When a user's profile is being viewed"),
 // При просмотре пользовательского профиля
 ),
 ),
);
}

Как видно по структуре функции, каждая категория триггера (т.е. node, comment, system и user) возвращает массив опций, которые отображаются на странице конфигурирования триггеров. В каждом таком массиве категории определяется триггер и метка, которая отображается на странице настройки триггеров, наподобие приведенной ниже, где node_insert — имя триггера, а значение, связанное с элементом метки — это то, что отображается на странице Trigger configuration (Конфигурация триггера).

'node_insert' => array(
 'label' => t('After saving new content'),
)
Если добавить в модуль аннотации из главы 2 хуки, то эти хуки могут выглядеть следующим образом:
/**
* Реализация hook_trigger_info().
*/
function annotate_trigger_info() {
 return array(
 'annotate' => array(
 'annotate_insert' => array(
 'label' => t('After saving new annotations'),
 // После сохранения новых аннотаций
),
'annotate_update' => array(
 'label' => t('After saving updated annotations'),
 // После сохранения измененных аннотаций
),
'annotate_delete' => array(
 'label' => t('After deleting annotations'),
 // После удаления аннотаций
),
'annotate_view' => array(
 'label' => t('When annotation is viewed by an authenticated user'),
 // При просмотре аннотаций аутентифицированным пользователем 
),
),
);
}
После очистки кэша Drupal возьмет новую реализацию hook_trigger_info() и изменит страницу триггеров, т.е. добавит отдельную вкладку для хука Annotate, как показано на рис. 3.7. Конечно, сам модуль все так же отвечает за инициацию хуков с помощью module_invoke() или module_invoke_all() и за запуск выполнения действий. В нашем примере модулю нужно выполнить вызов module_invoke_all ('annotate_insert', 'annotate_update', 'annotate_delete', 'annotate_view'). Тогда потребуется реализовать hook_annotate_insert, hook_annotate_update, hook_annotate_delete или hook_annotate_view и запускать действия с помощью actions_do().
Всего комментариев: 0
Имя *:
Email *:
Код *:


Бесплатный конструктор сайтов - uCoz