Browse Source

Refactory listener para asignar workflow a las entidades que no tienen

Guillermo Espinoza 7 years ago
parent
commit
3d0fac4569
2 changed files with 74 additions and 11 deletions
  1. 66 6
      EventListener/WorkflowInterfaceListener.php
  2. 8 5
      Resources/config/services.yml

+ 66 - 6
EventListener/WorkflowInterfaceListener.php

@@ -8,20 +8,44 @@ use Doctrine\ORM\EntityManager;
 
 class WorkflowInterfaceListener
 {
+
+    /**
+     * @var ContainerInterface
+     */
     private $container;
 
+
+    /**
+     * @param ContainerInterface $container
+     */
     public function __construct($container)
     {
         $this->container = $container;
     }
-    
+
     /**
      * @param LifecycleEventArgs $event
      */
     public function prePersist(LifecycleEventArgs $event)
+    {
+        $this->executePre($event);
+    }
+
+    /**
+     * @param LifecycleEventArgs $event
+     */
+    public function preUpdate(LifecycleEventArgs $event)
+    {
+        $this->executePre($event);
+    }
+
+    /**
+     * @param LifecycleEventArgs $event
+     */
+    public function executePre(LifecycleEventArgs $event)
     {
         $em = $event->getEntityManager();
-        $entity = $event->getEntity();
+        $entity = $event->getObject();
         if ($entity instanceof WorkflowInterface) {
             $workflow = $entity->getWorkflow();
             // La entidad no tiene workflow, busco por la clase y le asigno el primero
@@ -32,14 +56,50 @@ class WorkflowInterfaceListener
                     $entity->setWorkflow($workflow);
                 }
             }
-            if (!is_null($workflow)) {
+            if (!is_null($workflow) && is_null($entity->getCurrentState())) {
                 $entity->setCurrentState($workflow->getInitialPlace($entity));
             }
         }
 
-        $object = $event->getObject();
-        if ($object instanceof \WorkflowBundle\Entity\Workflow) {
-            $object->setContainer($this->container);
+        if ($entity instanceof \WorkflowBundle\Entity\Workflow) {
+            $entity->setContainer($this->container);
+        }
+    }
+
+    /**
+     * @param LifecycleEventArgs $event
+     */
+    public function postPersist(LifecycleEventArgs $event)
+    {
+        $this->executePost($event);
+    }
+
+    /**
+     * @param LifecycleEventArgs $event
+     */
+    public function postUpdate(LifecycleEventArgs $event)
+    {
+        $this->executePost($event);
+    }
+
+    /**
+     * @param LifecycleEventArgs $event
+     */
+    public function executePost(LifecycleEventArgs $event)
+    {
+        $em = $event->getEntityManager();
+        $entity = $event->getObject();
+        if ($entity instanceof \WorkflowBundle\Entity\Workflow) {
+            // Asigno el workflow a las entidades que soporta que no tengan uno asignado
+            $supports = $entity->getSupport();
+            foreach ($supports as $class) {
+                $entities = $em->getRepository($class)->findBy(['workflow' => null]);
+                foreach ($entities as $object) {
+                    $object->setWorkflow($entity);
+                    $object->setCurrentState($entity->getInitialPlace($object));
+                    $em->flush($object);
+                }
+            }
         }
     }
 

+ 8 - 5
Resources/config/services.yml

@@ -1,23 +1,23 @@
 imports:
     - { resource: rabbit_mq/config.yml }
     - { resource: rabbit_mq/services.yml }
-    
+
 services:
     workflow.admin.workflow:
         class: WorkflowBundle\Admin\WorkflowAdmin
         arguments: [~, WorkflowBundle\Entity\Workflow, BaseAdminBundle:CRUD]
         tags:
             - { name: sonata.admin, manager_type: orm, group: Workflow, label: Workflow, label_catalogue: WorkflowBundle, label_translator_strategy: sonata.admin.label.strategy.underscore }
-        calls:    
+        calls:
             - [setTranslationDomain, [WorkflowBundle]]
     workflow.admin.action:
         class: WorkflowBundle\Admin\ActionAdmin
         arguments: [~, WorkflowBundle\Entity\Action, SonataAdminBundle:CRUD]
         tags:
             - { name: sonata.admin, manager_type: orm, group: Workflow, label: Action, label_catalogue: WorkflowBundle, label_translator_strategy: sonata.admin.label.strategy.underscore }
-        calls:    
+        calls:
             - [setTranslationDomain, [WorkflowBundle]]
-            
+
     workflow.doctrine_event.subscriber:
         class: WorkflowBundle\EventListener\DoctrineEventSubscriber
         arguments: ['@workflow.producer_service']
@@ -36,7 +36,7 @@ services:
     workflow.action_event.subscriber:
         class: WorkflowBundle\EventListener\ActionEventSubscriber
         tags:
-            - { name: doctrine.event_subscriber, connection: default }       
+            - { name: doctrine.event_subscriber, connection: default }
     # Lo que se pase en arguments se setea en el campo twigParams de la entity Action
 #        arguments: ['@service_container']
 
@@ -44,6 +44,9 @@ services:
         class: WorkflowBundle\EventListener\WorkflowInterfaceListener
         tags:
             - { name: doctrine.event_listener, event: prePersist }
+            - { name: doctrine.event_listener, event: preUpdate }
+            - { name: doctrine.event_listener, event: postPersist }
+            - { name: doctrine.event_listener, event: postUpdate }
         arguments: ['@service_container']
 
     workflow.event.listener: