WorkflowController.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. namespace WorkflowBundle\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  4. use Symfony\Component\Workflow\Exception\ExceptionInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Sonata\AdminBundle\Admin\Pool;
  8. class WorkflowController extends Controller
  9. {
  10. var $class;
  11. var $object;
  12. var $admin;
  13. public function applyTransitionAction($id, $transition, $workflow = null, Request $request)
  14. {
  15. $class = $request->get('class');
  16. $em = $this->get('doctrine')->getManager();
  17. if(!$this->validate($class,$id)) {
  18. return $this->redirect($this->generateUrl("sonata_admin_dashboard"));
  19. }
  20. $object = $this->object;
  21. $admin = $this->admin;
  22. $back_route = $admin->getBaseRouteName()."_list";
  23. if(is_null($workflow)) {$workflow = "{$object->getWorkflowType()}.{$object->getWorkflowName()}";}
  24. try {
  25. $this->get("{$workflow}")->apply($object, $transition);
  26. $em->persist($object);
  27. $em->flush();
  28. } catch (ExceptionInterface $e) {
  29. $this->get('session')->getFlashBag()->add('danger', $e->getMessage());
  30. }
  31. return $this->redirect($this->generateUrl($back_route));
  32. }
  33. public function showWorkflowAction($id, Request $request)
  34. {
  35. $class = $request->get('class');
  36. if(!$this->validate($class,$id)) {
  37. return $this->redirect($this->generateUrl("sonata_admin_dashboard"));
  38. }
  39. $object = $this->object;
  40. $admin = $this->admin;
  41. $back_route = $admin->getBaseRouteName()."_list";
  42. return $this->render('WorkflowBundle:Workflow:show_workflow.html.twig', ['object' => $object,'back_route' => $back_route]);
  43. }
  44. public function resetStateAction($id, Request $request)
  45. {
  46. $class = $request->get('class');
  47. $em = $this->get('doctrine')->getManager();
  48. if(!$this->validate($class,$id)) {
  49. return $this->redirect($this->generateUrl("sonata_admin_dashboard"));
  50. }
  51. $object = $this->object;
  52. $admin = $this->admin;
  53. $back_route = $admin->getBaseRouteName()."_list";
  54. if(is_null($object->getWorkflow())) {
  55. $object->setCurrentState(null);
  56. $em->persist($object);
  57. $em->flush();
  58. return $this->redirect($this->generateUrl($back_route));
  59. }
  60. $workflow = $object->getServiceWorkflow();
  61. if($workflow) {
  62. $definition = $workflow->getDefinition();
  63. if($definition) {
  64. $object->setCurrentState($definition->getInitialPlace($object));
  65. } else {
  66. $object->setCurrentState(null);
  67. }
  68. } else {
  69. $object->setCurrentState(null);
  70. }
  71. $em->persist($object);
  72. $em->flush();
  73. return $this->redirect($this->generateUrl($back_route));
  74. }
  75. public function validate($class, $id) {
  76. if(!class_exists($class)) {
  77. $this->get('session')->getFlashBag()->add('danger', $this->get('translator')->trans('Class not found',array(),'WorkflowBundle'));
  78. return false;
  79. }
  80. /* @var $adminPool \Sonata\AdminBundle\Admin\Pool */
  81. $adminPool = $this->get('sonata.admin.pool');
  82. $em = $this->get('doctrine')->getManager();
  83. try {
  84. $object = $em->getRepository($class)->findOneById($id);
  85. $admin = $adminPool->getAdminByClass($class);
  86. } catch (ExceptionInterface $e) {
  87. $this->get('session')->getFlashBag()->add('danger', $e->getMessage());
  88. return false;
  89. }
  90. if(is_null($object) || is_null($admin)) {
  91. $this->get('session')->getFlashBag()->add('danger', $this->get('translator')->trans('Object not found',array(),'WorkflowBundle'));
  92. return false;
  93. }
  94. $this->object = $object;
  95. $this->class = $class;
  96. $this->admin = $admin;
  97. return true;
  98. }
  99. }