<?php
namespace Pimcore\Workflow\MarkingStore;
use Pimcore\Model\DataObject\Concrete;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\Workflow\Exception\LogicException;
use Symfony\Component\Workflow\Marking;
use Symfony\Component\Workflow\MarkingStore\MultipleStateMarkingStore;
class DataObjectMultipleStateMarkingStore extends MultipleStateMarkingStore
{
private $property;
private $propertyAccessor;
/**
* @param string $property
* @param PropertyAccessorInterface|null $propertyAccessor
*/
public function __construct($property = 'marking', PropertyAccessorInterface $propertyAccessor = null)
{
parent::__construct($property, $propertyAccessor);
$this->property = $property;
$this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
}
/**
* @inheritdoc
*
* @throws LogicException
*/
public function getMarking($subject)
{
$this->checkIfSubjectIsValid($subject);
$marking = (array) $this->propertyAccessor->getValue($subject, $this->property);
$_marking = [];
foreach ($marking as $place) {
$_marking[$place] = 1;
}
return new Marking($_marking);
}
/**
* @inheritdoc
*
* @throws LogicException
* @throws \Exception
*/
public function setMarking($subject, Marking $marking)
{
$subject = $this->checkIfSubjectIsValid($subject);
$places = array_keys($marking->getPlaces());
$this->propertyAccessor->setValue($subject, $this->property, $places);
}
/**
* @param object $subject
*
* @return Concrete
*/
private function checkIfSubjectIsValid($subject): Concrete
{
if (!$subject instanceof Concrete) {
throw new LogicException('data_object_multiple_state marking store works for pimcore data objects only.');
}
return $subject;
}
}