Перейти к основному содержимому

Работа с 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.preGlobalAction
  • pimcore.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"];;

// делать что-то со значением
}
}


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.