Работа с PHP API
Управление рабочими процессами Pimcore также может быть использовано через PHP API.
Использование Workflow API для изменения мест (Places) элементов
Поскольку управление рабочими процессами в Pimcore основано на компоненте Symfony Workflow, его API также можно использовать таким же образом. ля подробностей см. документацию Symfony.
Дополнительно Pimcore предоставляет \Pimcore\Workflow\Manager, который предоставляет дополнительную функциональность для работы с управлением рабочими процессами — например дополнительные методы для применения переходов с дополнительными данными (applyWithAdditionalData()) и применения глобальных действий (applyGlobalAction()).
Ниже приведён пример того, как взаимодействовать с рабочими процессами через PHP API.
/**
* $object ... ваш элемент, напр. объект данных Pimcore
* $workflowRegistry Symfony\Component\Workflow\Registry из контейнера Symfony
*/
$workflow = $workflowRegistry->get($object, 'workflow');
if($workflow->can($object, 'content_ready')) {
//изменить рабочий процесс через Symfony API без сохранения дополнительных данных
$workflow->apply($object, 'content_ready');
//убедитесь, что вы сохраняете субъект рабочего процесса после перехода,
//если какие-либо данные были изменены во время перехода
//например, хранилищем отметок (marking store)
$object->save();
}
if($workflow->can($object, 'publish')) {
//изменить рабочий процесс с помощью Pimcore Workflow Manager — заметки записываются с дополнительными данными
$additionalData = [
NotesSubscriber::ADDITIONAL_DATA_NOTES_COMMENT => 'this is some additional note',
NotesSubscriber::ADDITIONAL_DATA_NOTES_ADDITIONAL_FIELDS => [
'timeWorked' => 20
]
];
/**
* $workflowManager Pimcore\Workflow\Manager from Symfony container
*/
//последний параметр определяет, должен ли субъект рабочего процесса быть сохранён после перехода
$workflowManager->applyWithAdditionalData($workflow, $object, 'publish', $additionalData, true);
}
Использование событий для дополнительной функциональности
Модуль workflow в Symfony поставляется с множеством событий, которые можно использовать для кастомизации и расширения стандартной функциональности рабочего процесса. См. документацию Symfony для подробностей.
В дополнение к событиям Symfony, Pimcore предоставляет два дополнительных события для глобальных действий:
pimcore.workflow.preGlobalActionpimcore.workflow.postGlobalActionСм. WorkflowEvents для подробностей.
Использование дополнительных данных в событиях
Если в конфигурации перехода определены поля дополнительных данных, эти данные можно получить в обработчиках событий (event listener).
Ниже приведён пример того, как взаимодействовать с дополнительными данными при событиях перехода.
Сначала определим дополнительное поле в конфигурации рабочего процесса.
transitions:
close_product:
from: open
to: closed
options:
label: close product
notes:
commentEnabled: 1
commentRequired: 1
additionalFields:
-
name: mySelect
title: please select a type
fieldType: select
fieldTypeSettings:
options:
-
key: Option A
value: a
-
key: Option B
value: b
-
key: Option C
value: c
Затем мы должны определить событие перехода в services.yaml.
services:
App\EventListener\WorkflowsEventListener:
tags:
- { name: kernel.event_listener, event: workflow.projectWorkflow.transition.close_product, method: onCloseProduct }
Дополнительные данные затем будут доступны в событии перехода
<?php
namespace App\EventListener;
use Symfony\Component\Workflow\Event\TransitionEvent;
class WorkflowsEventListener
{
public function onCloseProduct(TransitionEvent $event): void
{
$context = $event->getContext();
$additionalData = $context["additional"];
$mySelectValue = $additionalData["mySelect"];;
// делать что-то со значением
}
}
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.