...

Обработчик события в модуле на примере отслеживания изменений контекста элемента приложения.

Тема в разделе "Примеры решений и дополнительных модулей", создана пользователем grebina, 28 янв 2022.

  1. grebina

    grebina New Member

    Обработчик события — запускает определенное действие в системе после того, как событие произошло. Более подробная информация в справке по системе https://elma365.com/ru/help/events_processing.html

    Создадим обработчик события, который будет отслеживать ("перехватывать") изменение значения определенной контекстной переменной элемента приложения и логировать историю этих изменений.

    Приложение Дисконтная карта (discount_card) в разделе CRM (_clients).

    Контекст приложения:

    [​IMG]

    В данном примере мы будем отслеживать изменение значения переменной "Размер скидки, %" (percent_discount) типа Целое число и записывать историю изменений в переменную "История изменения скидки" (discount_history) типа Текст.

    Реализация обработчика.

    Создадим модуль в разделе Администрирование-Модули-Пользовательские модули.
    На вкладке «Обработка событий» создадим новое событие.

    Домен события: элементы приложений.
    Событие: обновление элемента.
    Тип обработчика: запуск скрипта.

    [​IMG]

    На вкладке Настройки нашего модуля создадим переменную Дисконтная карта с типом приложения Дисконтная карта. Это необходимо для дальнейшего поиска нашего элемента в сценарии модуля (так как Global в модулях недоступен).
    [​IMG]
    Перейдём на вкладку «Сценарии» созданного обработчика. На данной вкладке будет создан метод по умолчанию

    async function action(): Promise<void> {}

    Код обработчика необходимо реализовать в данном методе.

    Код:
    
    async function action(): Promise<void> {
    //проверяем, что обработчик сработал при изменении элемента нужного нам приложения
      
    if (Context.data.__item!.namespace === '_clients' && Context.data.__item!.code === 'discount_card') {
        
    //выполняем поиcк элемента по id, где discount_card - контекстная переменная из настроек модуля
        
    var apcard await Namespace.params.fields.discount_card.app.search().where(=> a.__id.eq(Context.data.__item!.id)).first();
        if (
    apcard) {
          const 
    oldPercent Context.data.__data.oldItem.percent_discount;//получаем значение переменной percent_discount до изменения
          
    const newPercent Context.data.__data.item.percent_discount;//получаем значение переменной percent_discount после изменения
          //сравниваем percent_discount до и после изменения. Если они не совпадают, значит в данном событии было изменено значение percent_discount
          
    if (oldPercent != newPercent) {
            const 
    tip Context.data.__data.item.tip_skidki[0].name//получаем новое значение переменной Тип скидки типа Категория
            
    const createdBy Context.data.__createdByName;//получаем автора изменений
            //формируем строку с записью истории
            
    const history Context.data.__createdAt.format("DD.MM.YYYY HH:mm:ss") + " - " "Пользователь " createdBy +
              
    " изменил размер скидки по карте. Предыдущее значение: " oldPercent.toString() + ", новое значение: " newPercent.toString() + " Новый тип: " tip '\n';
            
    //записываем строку с информацией о изменении percent_discount и tip_skidki в переменную discount_history
            
    apcard!.data.discount_history apcard!.data.discount_history apcard!.data.discount_history history history;
            
    //сохраняем элемент приложения
            
    await apcard!.save();
          }
        }
      }
    }
    В Context.data.__item хранится сам элемент приложения, по которому произошло событие, без привязки к значениям полей до и после изменения. Здесь можно обратиться к параметрам:
    "namespace": код раздела,
    "code": код приложения,
    "id": Id элемента приложения, по которому произошло событие
    В Context.data.__data.oldItem хранится значение контекста элемента приложения до изменения. Название переменной, значение которой нужно получить, необходимо указывать через точку. Автоподстановка здесь не поддерживается.
    В Context.data.__data.item хранится значение контекста элемента приложения после изменения. Название переменной, значение которой нужно получить, необходимо указывать через точку. Автоподстановка здесь не поддерживается.

    Результат работы данного обработчика на скриншоте:

    [​IMG]


    На форме просмотра элемента приложения в панели «История изменения размера скидки» размещена переменная discount_history с отключённым параметром «Показывать название на форме».


    Небольшой лайфхак.

    Для просмотра структуры Context, который формируется в событии, можно отправить HTTP-запрос на сайт https://webhook.site/

    Для этого перейдите на сайте https://webhook.site/ , включите параметр «Auto Navigate» и скопируйте значение в строке «Your unique URL»

    В коде обработчика события реализуйте следующий код:

    Код:
    
    async function action(): Promise<void> {

          
    fetch("https://webhook.site/205c73d1-2036-4e8c-8901-b31ca1a556b1", {

            
    method"POST",

            
    bodyJSON.stringify((<any>Context).json()),

        })

    }


    Где https://webhook.site/205c73d1-2036-4e8c-8901-b31ca1a556b51 – ваше значение unique URL.

    Инициализируйте нужное событие, например, изменение элемента приложения. В результате выполнения данного обработчика, вы получите HTTP-запрос на сайте https://webhook.site, где можно будет просмотреть Context в блоке «Raw Content.

    [​IMG]


    После отладки обработчика с помощью https://webhook.site не забудьте снять обработчик с публикации!
     

    Вложения:

    Последнее редактирование: 19 авг 2022
  2. m.krasnoperova

    m.krasnoperova New Member

    Спасибо! Ценно, пригодилось.