<?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)
{
}
}