ertttert
Обычно при работе с Drupal требуется каким-то образом реагировать на определенные события. Например, администратору сайта может понадобиться почтовое сообщение об отправке посетителем текста на сайт. Или следует заблокировать пользователя, если он употребляет недопустимые слова. В данной главе описано, как реагировать на события Drupal с помощью собственного кода. Drupal при своей работе проходит через последовательность событий. Эти внутренние события — как раз те моменты, когда модулям разрешено взаимодействовать с процессом обработки Drupal. Некоторые события Drupal приведены в табл. 3.1.
Таблица 3.1. Примеры событий Drupal
Событие | Тип |
Создание ноды | node |
Удаление ноды | node |
Просмотр ноды | node |
Создание пользовательской учетной записи | user |
Изменение пользовательского профиля | user |
Вход пользователя | |
Выход пользователя |
Разработчики Drupal называют эти внутренние события хуками (hook
), т.к. при возникновении одного из таких событий Drupal позволяет модулям в этой точке “вмешиваться” (hook into
) в путь выполнения. Некоторые хуки уже встречались в предыдущих главах. Обычно при разработке модулей требуется решать, на какие события Drupal необходимо реагировать — т.е. какие хуки нужно реализовать в модуле. Предположим, что вы недавно создали веб-сайт, который обслуживался стоящим в кладовке компьютером. Потом сайт набрал популярность, и вы планируете продать его большой корпорации и получить кучу денег. Между тем, надо каким-то образом получать уведомления о входе пользователей на сайт. Допустим, вы решили, что в это время компьютер должен издавать звуковые сигналы. Но вашей кошке не нравятся такие звуки, когда она спит, и вы решили вместо гудков просто создавать запись в журнале. Вы быстро пишете .info
-файл и помещаете его в sites/all/modules/custom/beep/beep.info
:
name = Beepdescription = Simulates a system beep.package = Pro Drupal Developmentcore = 7.xfiles[] = beep.module
После этого необходимо написать модуль sites/all/modules/custom/beep/beep.module
:
<?php/** * @file * Имитация звукового сигнала. */ function beep_beep() {watchdog( 'beep', 'Beep!') ; }
Данный код записывает в журнал Drupal сообщение Beep! — пока этого хватит. А теперь нужно указать среде Drupal, чтобы она имитировала гудок при каждом входе пользователя. Это можно сделать, реализовав в нашем модуле функцию hook_user()
и организовав перехват операции login
:
/** * Реализация hook_user(). */ function beep_user( $op, &$edit, &$account, $category = NULL) {if ($op == 'login') {beep_beep() ; } }
Оказывается, все совсем не трудно. А как насчет сигналов при добавлении нового контента? Это можно сделать, реализовав в модуле функцию hook_node_insert()
и перехватив операцию insert
:
/** * Реализация hook_node_insert(). */ function hook_node_insert( $node) {beep_beep() ; }
А если сигнал нужен при добавлении комментария? Тогда можно реализовать функцию hook_comment_insert()
и перехватывать операцию insert
. Только давайте остановимся на минутку и подумаем. Мы все время делаем одно и то же. И лучше было бы иметь графический пользовательский интерфейс, который позволял бы связать действие (гудок) с любым хуком и любой операцией. Как раз для этого и предназначен встроенный в Drupal модуль триггера. Он позволяет связать действие с заданным событием. В коде событие определяется как уникальное сочетание хука и операции — например, перехват пользователя и операция входа или перехват ноды и операция вставки. При выполнении таких операций модуль trigger.module
позволяет запустить выполнение действия. Во избежание путаницы давайте уточним терминологию.
hook_node_insert
).
Всего комментариев: 0 | |