K4:Обработчики событий
From In-Portal Developers Guide
| ||
---|---|---|
Статьи в этой категории | ||
|
Обработчики событий позволяют выполнять действия на основании данных пользователя, попадающих в PHP через специальным образом сформированные запросы на сервер. Ниже приведены основные аспекты написания обработчиков событий, которые призваны помочь с минимальными усилиями написать требуемый обработчик события.
Contents |
Получение объекта, участника события
- Если известно, что 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') );
Сопоставление прав доступа и обработчика события
Если пишется обработчик события, которое не описано в классе 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 запрещается использовать управляющие структуры.
|