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();