In-Portal Developers Guide

This is a wiki-based Developers Guide for In-Portal Open Source CMS. The purpose of this guide is to provide advanced users, web developers and programmers with documentation on how to expand, customize and improve the functionality and the code the In-Portal software. Please consider contributing to our documentation writing effort.

K4:Event Handlers

From In-Portal Developers Guide

Revision as of 15:34, 25 December 2008 by Alex (Talk)
(diff) ←Older revision | Current revision (diff) | Newer revision→ (diff)
Jump to: navigation, search
Обработчик событий Обработчик событий
Статьи в этой категории
  • Event Handlers

Обработчики событий позволяют выполнять действия на основании данных пользователя, попадающих в 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';
Image:Tipbox Icon.gif Название шаблонов для перенаправления не следует "зашивать" (hardcoded) в коде. Их лучше всего передавать из формы, в которой было вызвано событие.

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

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

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

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

  • Для вызова нового события с таким же префиксом, как у текущего события (откуда выполняется код) нужно написать следующий код:
$event->CallSubEvent('OnSampleEvent');
  • Для вызова события у которого префикс отличается от текущего нужно написать следующий код:
$this->Application->HandleEvent( new kEvent('prefix.special:OnSampleEvent') );
Image:Tipbox Icon.gif Если 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" вместо строки с названиями прав.

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