3.3.1. Обработчики событий

Data Source Eng Data Source

Обработчики событий позволяют выполнять действия на основании данных пользователя, попадающих в PHP через специальным образом сформированные запросы на сервер. Ниже приведены основные аспекты написания обработчиков событий, которые призваны помочь с минимальными усилиями написать требуемый обработчик события.

Получение объекта, участника события

  • Если известно, что ID объекта доступно в запросе пользователя, то нужно использовать следующий код:

$object =& $event->getObject();

Этот код не только получит объект, но и загрузит в него данные по ID найденному в запросе пользователя.

  • Если про ID объекта ничего не известно, то нужно использовать следующий код:

$object =& $event->getObject( Array('skip_autoload' => true) );

Такой подход использован в событиях OnCreate и OnUpdate, т.к. в первом из них ID нету вообще, а втором может быть за раз передано более одного ID.

Получение данных из формы

Получить данные из формы (только в случае, если был использован POST запрос) можно использовав следующий код:

$items_info = $this->Application->GetVar( $event->getPrefixSpecial(true) );

Обработка данных из формы

  • В случае, если передано только одно ID, то массив $items_info (см. пример Получение данных из формы) нужно использовать следующим образом:

if ($items_info) {
    list ($id, $field_values) = each($items_info);
    // обработка данных
}
  • В случае, когда из запроса могут быть получены данные сразу нескольких объектов, то нужно использовать следующий код:

if ($items_info) {
    foreach ($items_info as $id => $field_values) {
        // обработка данных
    }
}

Указание шаблона для перенаправления

После успешного выполнения обработчика события автоматически происходит перенаправление на текущий шаблон (на Front-End) или на шаблон со списком, из которого был открыт данный шаблон (в Admin). Если требуется указать шаблон, отличный от шаблона подставляемого автоматически нужно использовать атрибут redirect объекта $event:

$event->redirect = 'template_name';

Осторожно

Название шаблонов для перенаправления не следует «зашивать» (hardcoded) в коде. Их лучше всего передавать из формы, в которой было вызвано событие.

На данный момент механизм работы с всплывающими окнами (popups) построен таким образом, что значение атрибута redirect будет проигнорировано. Независимо от этого на Front-End будет учитываться значение данного атрибута. Но надо отметить, что если будет нужно изменить шаблон для перенаправления у событий OnCreate или OnUpdate, то нужно перед присваиванием шаблона выполнить следующий код:

$event->SetRedirectParam('opener', 's');

Если используются другие обработчики событий, то этого делать не нужно.

Вызов нового события из обработчика событий

  • Для вызова нового события с таким же префиксом, как у текущего события (откуда выполняется код) нужно написать следующий код:

$event->CallSubEvent('OnSampleEvent');
  • Для вызова события у которого префикс отличается от текущего нужно написать следующий код:

$this->Application->HandleEvent( new kEvent('prefix.special:OnSampleEvent') );

Примечание

Если special не используется, то и точку ставить не надо.

Сопоставление прав доступа и обработчика события

Если пишется обработчик события, которое не описано в классе kDBEventHandler, то права доступа, необходимые для выполнения данного события нужно указать в методе kEventHandler::mapPermissions:

function mapPermissions()
{
    parent::mapPermissions();
    $permissions = Array (
        'OnSampleEvent' => Array ('self' => 'main_permissions', 'subitem' => 'subitem_permissions'),
    );

    $this->permMapping = array_merge($this->permMapping, $permissions);
}

Если в unit config, в котором указан класс, содержащий обработчик события находиться опция SubItems, то названия прав доступа нужно указывать в ключе self. Если такой опции нету, то названия прав доступа нужно указывать в ключе subitem. Если требуется указать несколько прав доступа одновременно, то нужно их разделять используя вертикальную черту (|). В таком случае у пользователя будет проверяться наличие хотя бы одного из перечисленных прав. Если для выполнения события никакие права не нужны, то нужно указать true вместо строки с названиями прав.

Осторожно

В методе mapPermissions запрещается использовать управляющие структуры.