<?php
namespace App\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Option\EA;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeCrudActionEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityDeletedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Roothirsch\CoreBundle\Controller\ContactPersonCrudController;
use Roothirsch\CoreBundle\Entity\ContactPerson;
use Roothirsch\CoreBundle\Entity\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
class ContactPersonDeleteListener implements EventSubscriberInterface
{
private $adminGenerator;
private $requestStack;
private $entityManager;
public function __construct(AdminUrlGenerator $adminGenerator, RequestStack $requestStack, EntityManagerInterface $entityManager)
{
$this->adminGenerator = $adminGenerator;
$this->requestStack = $requestStack;
$this->entityManager = $entityManager;
}
public static function getSubscribedEvents()
{
return [BeforeCrudActionEvent::class => "check"];
}
public function check(BeforeCrudActionEvent $event)
{
$request = $event->getAdminContext()->getRequest();
$action = $request->get(EA::CRUD_ACTION, null);
if($action === null) {
return;
}
if($action !== 'delete' && $action !== 'batchDelete'){
return;
}
$controller = $request->get(EA::CRUD_CONTROLLER_FQCN, null);
if(!$controller || $controller !== ContactPersonCrudController::class) {
return;
}
$url = $this->adminGenerator->setAction(Action::INDEX)->unset(EA::ENTITY_ID)->generateUrl();
if($action === 'delete') {
$entity = $event->getAdminContext()->getEntity()->getInstance();
$users = $entity->getUsers()->count();
if($users === 0) {
return;
}
$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));
$event->setResponse(new RedirectResponse($url, 302));
}
$entityIds = $request->request->all()[EA::BATCH_ACTION_ENTITY_IDS] ?? [];
if(count($entityIds) === 0) {
return;
}
if($this->hasContacts($entityIds))
{
$this->requestStack->getSession()->getFlashBag()->add('warning', "Die Aktion wurde abgebrochen. In ihrer Auswahl befinden sich Ansprechpartner die noch bei Nutzern hinterlegt worden sind.");
$event->setResponse(new RedirectResponse($url, 302));
}
}
private function hasContacts($entityIds) {
$query = $this->entityManager->createQueryBuilder();
$query->select('COUNT(u)')->from(User::class, 'u');
foreach ($entityIds as $index => $id) {
$parameter = 'param_'.$index;
$query->orWhere($query->expr()->neq('u.contact', ':'.$parameter));
$query->setParameter($parameter, $id);
}
return $query->getQuery()->getSingleScalarResult() > 0;
}
}