src/EventListener/ContactPersonDeleteListener.php line 37

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  5. use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
  6. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
  7. use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityDeletedEvent;
  8. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  9. use Roothirsch\CoreBundle\Controller\ContactPersonCrudController;
  10. use Roothirsch\CoreBundle\Entity\ContactPerson;
  11. use Roothirsch\CoreBundle\Entity\User;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. class ContactPersonDeleteListener implements EventSubscriberInterface
  16. {
  17. private $adminGenerator;
  18. private $requestStack;
  19. private $entityManager;
  20. public function __construct(AdminUrlGenerator $adminGenerator, RequestStack $requestStack, EntityManagerInterface $entityManager)
  21. {
  22. $this->adminGenerator = $adminGenerator;
  23. $this->requestStack = $requestStack;
  24. $this->entityManager = $entityManager;
  25. }
  26. public static function getSubscribedEvents()
  27. {
  28. return [BeforeCrudActionEvent::class => "check"];
  29. }
  30. public function check(BeforeCrudActionEvent $event)
  31. {
  32. $request = $event->getAdminContext()->getRequest();
  33. $action = $request->get(EA::CRUD_ACTION, null);
  34. if($action === null) {
  35. return;
  36. }
  37. if($action !== 'delete' && $action !== 'batchDelete'){
  38. return;
  39. }
  40. $controller = $request->get(EA::CRUD_CONTROLLER_FQCN, null);
  41. if(!$controller || $controller !== ContactPersonCrudController::class) {
  42. return;
  43. }
  44. $url = $this->adminGenerator->setAction(Action::INDEX)->unset(EA::ENTITY_ID)->generateUrl();
  45. if($action === 'delete') {
  46. $entity = $event->getAdminContext()->getEntity()->getInstance();
  47. $users = $entity->getUsers()->count();
  48. if($users === 0) {
  49. return;
  50. }
  51. $this->requestStack->getSession()->getFlashBag()->add('warning', sprintf("Der Ansprechpartner kann nicht gelöscht werden. Bitte entfernen Sie den Ansprechpartner bei den %s vorhanden Nutzern, bevor Sie eine Löschung vornehmen.", $users));
  52. $event->setResponse(new RedirectResponse($url, 302));
  53. }
  54. $entityIds = $request->request->all()[EA::BATCH_ACTION_ENTITY_IDS] ?? [];
  55. if(count($entityIds) === 0) {
  56. return;
  57. }
  58. if($this->hasContacts($entityIds))
  59. {
  60. $this->requestStack->getSession()->getFlashBag()->add('warning', "Die Aktion wurde abgebrochen. In ihrer Auswahl befinden sich Ansprechpartner die noch bei Nutzern hinterlegt worden sind.");
  61. $event->setResponse(new RedirectResponse($url, 302));
  62. }
  63. }
  64. private function hasContacts($entityIds) {
  65. $query = $this->entityManager->createQueryBuilder();
  66. $query->select('COUNT(u)')->from(User::class, 'u');
  67. foreach ($entityIds as $index => $id) {
  68. $parameter = 'param_'.$index;
  69. $query->orWhere($query->expr()->neq('u.contact', ':'.$parameter));
  70. $query->setParameter($parameter, $id);
  71. }
  72. return $query->getQuery()->getSingleScalarResult() > 0;
  73. }
  74. }