Создание персонализированных событий
SDK API Plesk позволяет создавать персонализированные события, записывать их в Журнал Операций и присваивать им обработчики событий через Plesk и SDK API в расширениях.
Персонализированные события можно добавить с помощью хука ActionLog, который расширяет класс pm_Hook_ActionLog и находится в hooks/ActionLog.php
. Публичный метод getEvents() должен возвращать массив пар «ключ-значение». В этом массиве ключи представляют собой уникальные (для этого расширения) идентификаторы событий, а значения ― названия событий. Чтобы предотвратить конфликты идентификаторов, мы добавляем префикс ext_my-extension_
к каждому идентификатору. Чтобы такими событиями можно было управлять через SDK API, идентификатор должен использоваться с префиксом. Например, имя вашего расширения может быть „my-extension“, а идентификатор события (в хуке) – „smth_created“. В классе, прослушивающем события, вам необходимо зафиксировать действие „ext_my-extension_smth_created“.
Новый класс pm_ActionLog был создан, чтобы обеспечить возможность запускать события (метод pm_ActionLog::submit()). Он имеет следующие аргументы:
- actionId (обязательный) – уникальный идентификатор события, такой же, какой был указан в хуке.
- objectId (необязательный) – параметр, передающий идентификатор объекта для контекста (type: integer).
- oldValue (необязательный) – параметр для контекста, показывающий некоторые изменения.
- newValue (необязательный) – параметр для контекста, показывающий некоторые изменения.
Обработчики событий также можно добавить в Plesk (Инструменты и настройки => Менеджер событий).
Эти обработчики событий хранятся в настройках расширения (pm_Settings) в формате JSON. Обработчики событий автоматически удаляются при удалении расширения.
Примеры
Добавление персонализированного события с помощью хука
class Modules_MyExtension_ActionLog extends pm_Hook_ActionLog
{
public function getEvents()
{
return [
'smth_created' => 'Something created',
];
}
}
Добавление события в Журнал Операций
/* Method in your controller */
public function addAction()
{
$form = new AddSmthForm(['context' => [
// pass some vars to context
]]);
if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) {
$status = 'success';
$message = 'OK';
try {
$objectId = $form->processForm(); // Assume that form processing returns newly created object id
// Submit action log event here
pm_ActionLog::submit('smth_created', $objectId, 'old value', 'new value');
} catch (pm_Exception $e) {
$status = 'error';
$message = $e->getMessage();
}
$this->_redirectWithStatus($status, $message, $this->getRedirectUrl());
}
$this->view->form = $form;
}
Управление событием через SDK API
class Modules_MyExtension_EventListener implements EventListener
{
public function handleEvent($objectType, $objectId, $action, $oldValue, $newValue)
{
if ($action == 'ext_myextension_smth_created') {
pm_Log::info('Handle event: ext_myextension_smth_created');
pm_Log::info('Object Id: ' . var_export($objectId, true));
pm_Log::info('Old value: ' . var_export($oldValue, true));
pm_Log::info('New value: ' . var_export($newValue, true));
}
}
}
return new Modules_MyExtension_EventListener();