pimcore/lib/Pimcore/Bundle/CoreBundle/EventListener/WorkflowManagementListener.php line 84

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Enterprise License (PEL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  * @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  * @license    http://www.pimcore.org/license     GPLv3 and PEL
  13.  */
  14. namespace Pimcore\Bundle\CoreBundle\EventListener;
  15. use Pimcore\Event\AdminEvents;
  16. use Pimcore\Event\AssetEvents;
  17. use Pimcore\Event\DataObjectEvents;
  18. use Pimcore\Event\DocumentEvents;
  19. use Pimcore\Event\Model\ElementEventInterface;
  20. use Pimcore\Model\Asset;
  21. use Pimcore\Model\DataObject;
  22. use Pimcore\Model\DataObject\ClassDefinition;
  23. use Pimcore\Model\DataObject\Concrete as ConcreteObject;
  24. use Pimcore\Model\Document;
  25. use Pimcore\Model\Element\AbstractElement;
  26. use Pimcore\Tool\Admin;
  27. use Pimcore\WorkflowManagement\Workflow;
  28. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  29. use Symfony\Component\EventDispatcher\GenericEvent;
  30. class WorkflowManagementListener implements EventSubscriberInterface
  31. {
  32.     /**
  33.      * @var bool
  34.      */
  35.     protected $enabled true;
  36.     /**
  37.      * @inheritDoc
  38.      */
  39.     public static function getSubscribedEvents()
  40.     {
  41.         return [
  42.             DataObjectEvents::POST_ADD  => 'onElementPostAdd',
  43.             DocumentEvents::POST_ADD  => 'onElementPostAdd',
  44.             AssetEvents::POST_ADD  => 'onElementPostAdd',
  45.             DataObjectEvents::POST_DELETE => 'onElementPostDelete',
  46.             DocumentEvents::POST_DELETE => 'onElementPostDelete',
  47.             AssetEvents::POST_DELETE => 'onElementPostDelete',
  48.             AdminEvents::OBJECT_GET_PRE_SEND_DATA => 'onAdminElementGetPreSendData',
  49.             AdminEvents::ASSET_GET_PRE_SEND_DATA => 'onAdminElementGetPreSendData',
  50.             AdminEvents::DOCUMENT_GET_PRE_SEND_DATA => 'onAdminElementGetPreSendData',
  51.         ];
  52.     }
  53.     /**
  54.      * Ensures that any elements which support workflows are given the correct default state / status
  55.      *
  56.      * @param ElementEventInterface $e
  57.      */
  58.     public function onElementPostAdd(ElementEventInterface $e)
  59.     {
  60.         /**
  61.          * @var Asset|Document|ConcreteObject $element
  62.          */
  63.         $element $e->getElement();
  64.         if ($this->isEnabled() && Workflow\Manager::elementHasWorkflow($element)) {
  65.             $manager Workflow\Manager\Factory::getManager($element);
  66.             $manager->setElementState($manager->getWorkflow()->getDefaultState());
  67.             $manager->setElementStatus($manager->getWorkflow()->getDefaultStatus());
  68.         }
  69.     }
  70.     /**
  71.      * Cleanup status information on element delete
  72.      *
  73.      * @param ElementEventInterface $e
  74.      */
  75.     public function onElementPostDelete(ElementEventInterface $e)
  76.     {
  77.         /**
  78.          * @var Asset|Document|ConcreteObject $element
  79.          */
  80.         $element $e->getElement();
  81.         if (Workflow\Manager::elementHasWorkflow($element)) {
  82.             $manager Workflow\Manager\Factory::getManager($element);
  83.             $workflowState $manager->getWorkflowStateForElement();
  84.             if ($workflowState) {
  85.                 $workflowState->delete();
  86.             }
  87.         }
  88.     }
  89.     /**
  90.      * Fired before information is sent back to the admin UI about an element
  91.      *
  92.      * @param GenericEvent $e
  93.      *
  94.      * @throws \Exception
  95.      */
  96.     public function onAdminElementGetPreSendData(GenericEvent $e)
  97.     {
  98.         $element self::extractElementFromEvent($e);
  99.         $data $e->getArgument('data');
  100.         //create a new namespace for WorkflowManagement
  101.         //set some defaults
  102.         $data['workflowManagement'] = [
  103.             'hasWorkflowManagement' => false,
  104.         ];
  105.         if (Workflow\Manager::elementCanAction($element)) {
  106.             $data['workflowManagement']['hasWorkflowManagement'] = true;
  107.             //see if we can change the layout
  108.             $currentUser Admin::getCurrentUser();
  109.             $manager Workflow\Manager\Factory::getManager($element$currentUser);
  110.             $data['workflowManagement']['workflowName'] = $manager->getWorkflow()->getName();
  111.             //get the state and status
  112.             $state $manager->getElementState();
  113.             $data['workflowManagement']['state'] = $manager->getWorkflow()->getStateConfig($state);
  114.             $status $manager->getElementStatus();
  115.             $data['workflowManagement']['status'] = $manager->getWorkflow()->getStatusConfig($status);
  116.             if ($element instanceof ConcreteObject) {
  117.                 $workflowLayoutId $manager->getObjectLayout();
  118.                 //check for !is_null here as we might want to specify 0 in the workflow config
  119.                 if (!is_null($workflowLayoutId)) {
  120.                     //load the new layout into the object container
  121.                     $validLayouts DataObject\Service::getValidLayouts($element);
  122.                     //check that the layout id is valid before trying to load
  123.                     if (!empty($validLayouts)) {
  124.                         //todo check user permissions again
  125.                         if ($validLayouts && $validLayouts[$workflowLayoutId]) {
  126.                             $customLayout ClassDefinition\CustomLayout::getById($workflowLayoutId);
  127.                             $customLayoutDefinition $customLayout->getLayoutDefinitions();
  128.                             DataObject\Service::enrichLayoutDefinition($customLayoutDefinition$e->getArgument('object'));
  129.                             $data['layout'] = $customLayoutDefinition;
  130.                         }
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         $e->setArgument('data'$data);
  136.     }
  137.     /**
  138.      * @param GenericEvent $e
  139.      *
  140.      * @return AbstractElement
  141.      *
  142.      * @throws \Exception
  143.      */
  144.     private static function extractElementFromEvent(GenericEvent $e)
  145.     {
  146.         $element null;
  147.         foreach (['object''asset''document'] as $type) {
  148.             if ($e->hasArgument($type)) {
  149.                 $element $e->getArgument($type);
  150.             }
  151.         }
  152.         if (empty($element)) {
  153.             throw new \Exception('No element found in event');
  154.         }
  155.         return $element;
  156.     }
  157.     public function enable()
  158.     {
  159.         $this->enabled true;
  160.     }
  161.     public function disable()
  162.     {
  163.         $this->enabled false;
  164.     }
  165.     /**
  166.      * @return bool
  167.      */
  168.     public function isEnabled()
  169.     {
  170.         return $this->enabled;
  171.     }
  172. }