<?php/** * digitvision * * @category digitvision * @package Shopware\Plugins\DvsnTicketSystem * @copyright (c) 2020 digitvision */namespace Dvsn\TicketSystem\Subscriber;use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;use Shopware\Core\Framework\DataAbstractionLayer\EntityWriteResult;use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;use Shopware\Core\Framework\DataAbstractionLayer\Write\EntityExistence;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpFoundation\RequestStack;class TicketFormWrittenSubscriber implements EventSubscriberInterface{ /** * ... * * @var EntityRepositoryInterface */ protected $ticketRepository; /** * ... * * @var EntityRepositoryInterface */ protected $ticketFormRepository; /** * ... * * @var EntityRepositoryInterface */ protected $ticketFormElementRepository; /** * ... * * @var RequestStack */ protected $requestStack; /** * ... * * @param EntityRepositoryInterface $ticketRepository * @param EntityRepositoryInterface $ticketFormRepository * @param EntityRepositoryInterface $ticketFormElementRepository * @param RequestStack $requestStack */ public function __construct( EntityRepositoryInterface $ticketRepository, EntityRepositoryInterface $ticketFormRepository, EntityRepositoryInterface $ticketFormElementRepository, RequestStack $requestStack ) { // set params $this->ticketRepository = $ticketRepository; $this->ticketFormRepository = $ticketFormRepository; $this->ticketFormElementRepository = $ticketFormElementRepository; $this->requestStack = $requestStack; } /** * {@inheritDoc} */ public static function getSubscribedEvents(): array { return [ 'dvsn_ticket_form_element.written' => 'onTicketFormElementWritten', 'dvsn_ticket_form_element.deleted' => 'onTicketFormElementDeleted' ]; } /** * ... * * @param EntityWrittenEvent $event */ public function onTicketFormElementWritten(EntityWrittenEvent $event) { // loop every answer foreach ($event->getWriteResults() as $writeResult) { // has to be valid if (!$writeResult->getExistence() instanceof EntityExistence) { // ignore continue; } // switch if we created or updated an answer switch ($writeResult->getOperation()) { case EntityWriteResult::OPERATION_UPDATE: // get the payload $payload = $writeResult->getPayload(); // get the request $request = $this->requestStack->getCurrentRequest(); // do we even have valid elements in the request? if (!$request->request->has('elements')) { // we dont break; } // get them $elements = (array) $request->request->get('elements'); // the request params for our elements $params = null; // find the request for our element foreach ($elements as $element) { if ($element['id'] === $payload['id']) { $params = $element; break; } } // not found? if (!is_array($params)) { // weird... break; } // if we set form id to null, we want to delete our element $hasFormId = false; $formId = null; // find the id foreach ($params as $key => $value) { if ($key === 'formId') { $hasFormId = true; $formId = $value; } } // are we removing the form id?! this means we want to remove the element if ($hasFormId === true && $formId === null) { // delete it $this->ticketFormElementRepository->delete([ ['id' => $payload['id']] ], $event->getContext()); } // done break; } } } /** * ... * * @param EntityWrittenEvent $event */ public function onTicketFormElementDeleted(EntityWrittenEvent $event) { }}