custom/plugins/CrswCleverReachOfficial/src/Subscriber/SalesChannels/SalesChannelSubscriber.php line 88

Open in your IDE?
  1. <?php
  2. namespace Crsw\CleverReachOfficial\Subscriber\SalesChannels;
  3. use Crsw\CleverReachOfficial\Components\EventHandlers\TagHandler;
  4. use Crsw\CleverReachOfficial\Components\Utility\Bootstrap;
  5. use Crsw\CleverReachOfficial\Components\Utility\Initializer;
  6. use Crsw\CleverReachOfficial\Core\Infrastructure\Logger\Logger;
  7. use Crsw\CleverReachOfficial\Core\Infrastructure\ORM\Exceptions\RepositoryClassException;
  8. use Crsw\CleverReachOfficial\Entity\SalesChannel\Repositories\SalesChannelRepository;
  9. use Shopware\Core\Framework\Context;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  12. use Shopware\Core\PlatformRequest;
  13. use Shopware\Core\System\SalesChannel\SalesChannelEvents;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  17. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. /**
  20.  * Class SalesChannelSubscriber
  21.  *
  22.  * @package Crsw\CleverReachOfficial\Subscriber\SalesChannels
  23.  */
  24. class SalesChannelSubscriber implements EventSubscriberInterface
  25. {
  26.     /**
  27.      * @var array
  28.      */
  29.     private static $salesChannelForDelete = [];
  30.     /**
  31.      * @var TagHandler
  32.      */
  33.     private $tagHandler;
  34.     /**
  35.      * @var SalesChannelRepository
  36.      */
  37.     private $salesChannelRepository;
  38.     /**
  39.      * SalesChannelSubscriber constructor.
  40.      *
  41.      * @param TagHandler $tagHandler
  42.      * @param SalesChannelRepository $salesChannelRepository
  43.      * @param Initializer $initializer
  44.      */
  45.     public function __construct(
  46.         TagHandler $tagHandler,
  47.         SalesChannelRepository $salesChannelRepository,
  48.         Initializer $initializer
  49.     ) {
  50.         Bootstrap::register();
  51.         $initializer->registerServices();
  52.         $this->tagHandler $tagHandler;
  53.         $this->salesChannelRepository $salesChannelRepository;
  54.     }
  55.     /**
  56.      * @inheritDoc
  57.      */
  58.     public static function getSubscribedEvents(): array
  59.     {
  60.         return [
  61.             SalesChannelEvents::SALES_CHANNEL_DELETED => 'onSalesChannelDelete',
  62.             SalesChannelEvents::SALES_CHANNEL_WRITTEN => 'onSalesChannelSave',
  63.             KernelEvents::CONTROLLER => 'saveDataForDelete',
  64.             KernelEvents::RESPONSE => ['onIframeResponse', -1]
  65.         ];
  66.     }
  67.     /**
  68.      * @param ResponseEvent $event
  69.      */
  70.     public function onIframeResponse(ResponseEvent $event): void
  71.     {
  72.         $event->getResponse()->headers->set(PlatformRequest::HEADER_FRAME_OPTIONS'allowall');
  73.     }
  74.     /**
  75.      * Sales channel deleted.
  76.      *
  77.      * @param EntityDeletedEvent $event
  78.      */
  79.     public function onSalesChannelDelete(EntityDeletedEvent $event): void
  80.     {
  81.         if (!$this->tagHandler->canHandle()) {
  82.             return;
  83.         }
  84.         $ids $event->getIds();
  85.         foreach ($ids as $id) {
  86.             $salesChannel $this->salesChannelRepository->getSalesChannelById($id$event->getContext());
  87.             if (!$salesChannel) {
  88.                 continue;
  89.             }
  90.             $this->tagHandler->salesChannelDeleted($salesChannel->getName());
  91.         }
  92.     }
  93.     /**
  94.      * Sales channel created or modified.
  95.      *
  96.      * @param EntityWrittenEvent $event
  97.      */
  98.     public function onSalesChannelSave(EntityWrittenEvent $event): void
  99.     {
  100.         if (!$this->tagHandler->canHandle()) {
  101.             return;
  102.         }
  103.         $this->tagHandler->tagCreated();
  104.         foreach ($event->getIds() as $id) {
  105.             if (!empty(static::$salesChannelForDelete[$id])) {
  106.                 $this->tagHandler->salesChannelDeleted(static::$salesChannelForDelete[$id]);
  107.                 unset(static::$salesChannelForDelete[$id]);
  108.             }
  109.         }
  110.     }
  111.     /**
  112.      * @param ControllerEvent $controllerEvent
  113.      */
  114.     public function saveDataForDelete(ControllerEvent $controllerEvent): void
  115.     {
  116.         $request $controllerEvent->getRequest();
  117.         $routeName $request->get('_route');
  118.         if (in_array($routeName, ['api.sales_channel.update''api.sales_channel.delete'], true)) {
  119.             $salesChannelId $request->get('path');
  120.             // check if route contains subpaths
  121.             if (!strpos($salesChannelId'/')) {
  122.                 $this->saveSalesChannelName($request);
  123.             }
  124.         }
  125.     }
  126.     private function saveSalesChannelName(Request $request): void
  127.     {
  128.         $salesChannel $this->salesChannelRepository->getSalesChannelById(
  129.             $request->get('path'),
  130.             $request->get('sw-context') ?: Context::createDefaultContext()
  131.         );
  132.         if ($salesChannel) {
  133.             static::$salesChannelForDelete[$salesChannel->getId()] = $salesChannel->getName();
  134.         }
  135.     }
  136. }