Что такое действия?
Действия
Иногда возможностей PIM недостаточно, чтобы реализовать все сложные бизнес-требования предприятия. Например, нужно добавить специальную проверку у редактируемого Продукта или нужно обогатить данные при сохранении товара или нужно добавить специальную кнопку, чтобы добавить желаемое поведение. Тогда на помощь вам придут действия.
Действие — это собственная логика, написанная на языке JavaScript, которая исполняется на сервере. Для того, чтобы действие запустилось, необходимо настроить специальное событие вызова действия – триггер.
Создание действия
Для создания действия необходимо перейти в Настройки -> Действия. В открывшимся окне нажать кнопку + рядом со списком действий.
Далее необходимо заполнить поля:
- обязательно уникальное поле Идентификатор (заполняется английскими буквами), которое служит ID для действия
- поле Наименование – по нему вы сможете искать действие в фильтре
- поле Порядковый номер – указание на то, в каком порядке исполнится ваша логика, если будет несколько одинаковых действий связанных с одинаковым событием
Ниже вы увидите две секции – ДЕЙСТВИЕ и ТРИГГЕРЫ. Секция ДЕЙСТВИЕ это поле, куда будет помещена логика – код на языке JavaScript. Секция ТРИГГЕРЫ нужна для добавления событий, при наступлении которых будет срабатывать действие.
Триггеры
Для того, чтобы собственная логика исполнилась нужно настроить триггеры – специальные события, при наступлении которых сервер PIM вызовет код, отвечающий за исполнение логики. PIM поддерживает различные типы триггеров. Чтобы добавить триггер нужно переместиться в секцию ТРИГГЕРЫ и нажать кнопку +.
В появившимся окне вы должны выбрать тип триггера.
Триггеры поддерживаю следующие типы:
- Изменение объекта
- Изменение зависимости
- Кнопка
- Группа атрибутов
- Атрибут
- Кнопка (в табличном виде)
- Изменение статуса каналов
- Список значений
Рассмотрим каждый из этих типов подробнее.
Изменение объекта
Триггер срабатывает при совершении действия над объектом в Модели данных PIM (например, над товаром). Выбирая данный тип триггера вы увидите окно:
Вы должны выбрать одно из действий над объектом, на которое будет реагировать PIM для запуска действия:
- перед созданием
- после создания
- перед изменение
- после изменения
- перед удалением
- после удаления
- перед показом
После этого вы выбираете тип объекта, для которого применим вызов действия. Нажмите на кнопку ВЫБРАТЬ ТИП ОБЪЕКТА и в дереве выберите подходящий для действия тип. Следующим шагом вам нужно выбрать объект в иерархии дерева объектов, начиная с которого будет применяться действия. Таким образом вы можете ограничить применимость действия списком конкретных объектов, а не просто всеми объектами данного типа. Нажмите кнопку ВЫБРАТЬ ОБЪЕКТ и в появившемся окне выберите корневой объект.
Завершая создания триггера нажмите кнопку СОЗДАТЬ.
Изменение зависимости
Триггер срабатывает при совершении действия над зависимостью в Модели данных PIM (например, над отношением товара и его категории). Выбирая данный тип триггера, вы увидите окно:
Вы должны выбрать одно из действий над зависимостью, на которое будет реагировать PIM для запуска действия:
- перед созданием
- после создания
- перед изменение
- после изменения
- перед удалением
- после удаления
- после изменения на клиенте
После этого вы выбираете тип зависимости, для которого применим вызов действия. Нажмите на кнопку ВЫБРАТЬ ЗАВИСИМОСТЬ и выберите подходящий для действия тип.
Завершая создания триггера нажмите кнопку СОЗДАТЬ.
Кнопка
При создании данного типа триггера в карточке объекта появится кнопа, при нажатии которой сработает соответствующее действие. Выбирая данный тип триггера, вы увидите окно:
В поле Текст на кнопке введите, то, что должно пользователь увидит на кнопке.
Вы можете выбрать опцию Запросить подтверждение выполнения, тогда после нажатие на кнопку у пользователя спросят, действительно ли он хочет совершить действие.
После этого вы выбираете тип объекта, для которого применим вызов действия. Именно в карточке этого типа объекта пользователь увидит кнопку. Нажмите на кнопку ВЫБРАТЬ ТИП ОБЪЕКТА и в дереве выберите подходящий для действия тип.
Следующим шагом вам нужно выбрать объект в иерархии дерева объектов, начиная с которого будет применяться действия. Таким образом вы можете ограничить применимость действия списком конкретных объектов, а не просто всеми объектами данного типа. Нажмите кнопку ВЫБРАТЬ ОБЪЕКТ и в появившемся окне выберите корневой объект.
Опционально вы можете выбрать роли, для которых применимо данное действие (только пользователи этих ролей увидят данную кнопку). Для выбора ролей нажмите кнопку РОЛИ
В появившемся окне выберите список ролей и нажмите кнопку ВЫБРАТЬ.
Группа атрибутов
Триггер срабатывает при совершении действия над метаданными Группа Атрибутов. Выбирая данный тип триггера, вы увидите окно:
Вы должны выбрать одно из действий над Группой Атрибутов, на которое будет реагировать PIM для запуска действия:
- после создания
- после изменения
- после удаления
Завершая создания триггера нажмите кнопку СОЗДАТЬ.
Атрибут
Триггер срабатывает при совершении действия над метаданными Атрибут. Выбирая данный тип триггера, вы увидите окно:
Вы должны выбрать одно из действий над Атрибутом, на которое будет реагировать PIM для запуска действия:
- перед созданием
- после создания
- перед изменение
- после изменения
- перед удалением
- после удаления
Завершая создания триггера нажмите кнопку СОЗДАТЬ.
Кнопка (в табличном виде)
При создании данного типа триггера в окне поиска появится кнопа, при нажатии которой сработает соответствующее действие. Выбирая данный тип триггера, вы увидите окно:
В поле Текст на кнопке введите, то, что должно пользователь увидит на кнопке.
Вы можете выбрать опцию Запросить подтверждение выполнения, тогда после нажатие на кнопку у пользователя спросят, действительно ли он хочет совершить действие.
После этого вы выбираете тип объекта, для которого применим вызов действия. В окне поиска этого типа объекта пользователь увидит кнопку. Нажмите на кнопку ВЫБРАТЬ ТИП ОБЪЕКТА и в дереве выберите подходящий для действия тип.
Следующим шагом вам нужно выбрать объект в иерархии дерева объектов, начиная с которого будет применяться действия. Таким образом вы можете ограничить применимость действия списком конкретных объектов, а не просто всеми объектами данного типа. Нажмите кнопку ВЫБРАТЬ ОБЪЕКТ и в появившемся окне выберите корневой объект.
Опционально вы можете выбрать роли, для которых применимо данное действие (только пользователи этих ролей увидят данную кнопку). Для выбора ролей нажмите кнопку РОЛИ
В появившемся окне выберите список ролей и нажмите кнопку ВЫБРАТЬ.
Список значений
Триггер срабатывает при совершении действия над метаданными Список значений. Выбирая данный тип триггера, вы увидите окно:
Вы должны выбрать одно из действий над Списоком значений, на которое будет реагировать PIM для запуска действия:
- перед созданием
- после создания
- перед изменение
- после изменения
- перед удалением
- после удаления
Завершая создания триггера нажмите кнопку СОЗДАТЬ.
Исходный код
Логика действия пишется на языке JavaScript на вкладке ДЕЙСТВИЕ. При вызове действия со стороны сервера в него передается контекст – объекты, над которыми выполняется действие, и которые могут быть использованы в исходном коде. Эти объекты могут быть вызваны через переменные языка JavaScript.
Переменные контекста
item – объект над которым совершается действие
itemRelation – отношение над которым совершается действие
values – объект – измененные атрибуты
channels – объект – измененные каналы
models – объект-для работы с базой данных
Про концепцию моделей можно подробнее почитать по этой ссылке.
Сейчас поддерживаются следующие для модели следующих типов:
- item
- itemRelation
- lov
- channel
where – объект - результат поиска, результат выполнения триггера типа Кнопка в табличном виде
lov – объект – список значений, которые изменились
changes – объект – список значений, которые изменились
event – объект-событие, которое привело к вызову триггера (пример: AfterCreate, AfterUpdate)
user – имя пользователя, которым авторизовались в систему
roles – список объектов-ролей авторизованного пользователя
system – полезные системные библиотеки (fs, exec, awaitExec, fetch, URLSearchParams, mailer, http, https, http2, moment, XLSX, archiver, stream, pipe, FS, KafkaJS, extractzip)
isImport – флаг равный истине если действие вызвано с помощью API и ложь – если вызов произошел из интерфейса пользователя
Структура переменных контекста
Item это JSON объект, имеющий следующую структуру
{
"id": "23",
"path": "1.2.3.23",
"identifier": "america_standard_16a_germany_socket_with_italian_socket_combination",
"name": {
"en": "America Standard 16A Germany Socket with Italian Socket Combination"
},
"typeId": "4",
"values": {
"moq": "For regular packaging,MOQ500PCS/model",
"oem": true,
"tag": [
1
],
"size": "118mm*72.5mm",
"brand": "",
"color": 1,
"model": "118-KL18 series",
"style": "american style",
"sample": "Free",
"addDesc": {
"de": "",
"en": ""
},
"compAll": 89.47,
"current": "16A",
"voltage": "110V~250V",
"mainComp": 60,
"material": "Panel: golden aluminum",
"packaging": "Regular:1pcs/non-woven bag,10pcs/box,100pcs/carton",
"description": {
"en": "Good Quality One Gang Electrical Wall Switch and Socket"
},
"additionComp": 100,
"logisticComp": 100,
"delivery_time": "15-25days after deposit,according the quantity"
},
"channels": {},
"mimeType": "",
"fileOrigName": "",
"createdBy": "admin",
"createdAt": "2020-09-18T10:35:14.630Z",
"updatedBy": "admin",
"updatedAt": "2023-11-21T08:29:34.663Z"
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
itemRelation это JSON объект, имеющий следующую структуру
{
"id": "5",
"identifier": "rel_america_standard_16a_germany_socket_with_italian_socket_combination",
"relationId": "1",
"createdBy": "admin",
"createdAt": "2020-09-18T10:36:52.351Z",
"updatedBy": "admin",
"updatedAt": "2020-09-18T10:36:52.351Z",
"itemId": "23",
"targetId": "55"
"values": {}
}
2
3
4
5
6
7
8
9
10
11
12
Примеры кода
Приведены несколько примеров кода, которые могут быть полезны при разработке действий
Изменение атрибута (триггер Изменение объекта – перед обновлением)
item.values.CNSiteMVP = true
item.changed('values',true)
2
Изменение атрибута (триггер Изменение объекта – после обновления)
item.values.CNSiteMVP = true
item.changed('values', true)
await item.save()
2
3
Поиск всех подходящий объектов в PIM
const items = await models.item.findAll({ where: { parentIdentifier: { [Op.in]: ids }, values: { EDActive: true } } })
Поиск первого подходящего объекта в PIM
const object = await models.item.findOne({where:{id: ngkId}})
Подробнее с поиском объектов по модели можно ознакомиться по этой ссылке.