Создание персонализированных событий

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',
 ];
 }
}

Добавление события в Журнал Операций

/* Метод в вашем контроллере */
public function addAction()
{
 $form = new AddSmthForm(['context' => [
 // передача некоторых переменных для контекста
 ]]);
 
 if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) {
 $status = 'success';
 $message = 'OK';
 try {
 $objectId = $form->processForm(); // Предполагаем, что обработка формы возвращает вновь созданный идентификатор объекта
 
 // Добавляем событие в Журнал Операций
 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();
 

Leave your feedback on this topic here

If you have questions or need support, please visit the Plesk forum or contact your hosting provider.
The comments below are for feedback on the documentation only. No timely answers or help will be provided.