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

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