custom/plugins/FourtwosixThemeCustomization/src/Subscriber/StorefrontRenderSubscriber.php line 67

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace FourtwosixThemeCustomization\Subscriber;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Shopware\Core\System\SystemConfig\SystemConfigService;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\Context;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  11. use Shopware\Core\Content\Product\ProductEvents;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  13. use Shopware\Storefront\Pagelet\Header\HeaderPageletLoadedEvent;
  14. use Doctrine\DBAL\Connection;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. class StorefrontRenderSubscriber implements EventSubscriberInterface
  17. {
  18.     private SystemConfigService $systemConfigService;
  19.     private EntityRepositoryInterface $mediaRepository;
  20.     private EntityRepositoryInterface $productManufacturerRepository;
  21.     private EntityRepositoryInterface $deliveryTimeRepository;
  22.     private RequestStack $requestStack;
  23.     private Connection $connection;
  24.     public const MEDIA_SETTINGS_TO_LOAD = [
  25.         "googlerating",
  26.         "whatsappMedia",
  27.         "paymentMedia",
  28.         "shippingMedia"
  29.     ];
  30.     public function __construct(
  31.         SystemConfigService $systemConfigService,
  32.         EntityRepositoryInterface $mediaRepository,
  33.         EntityRepositoryInterface $productManufacturerRepository,
  34.         EntityRepositoryInterface $deliveryTimeRepository,
  35.         Connection $connection,
  36.         RequestStack $requestStack
  37.     )
  38.     {
  39.         $this->systemConfigService $systemConfigService;
  40.         $this->mediaRepository $mediaRepository;
  41.         $this->productManufacturerRepository $productManufacturerRepository;
  42.         $this->deliveryTimeRepository $deliveryTimeRepository;
  43.         $this->connection $connection;
  44.         $this->requestStack $requestStack;
  45.     }
  46.     public static function getSubscribedEvents(): array
  47.     {
  48.         return [
  49.             'sales_channel.' ProductEvents::PRODUCT_LOADED_EVENT => 'onProductLoaded',
  50.             HeaderPageletLoadedEvent::class => 'onHeaderPageletLoaded',
  51.         ];
  52.     }
  53.     public function onHeaderPageletLoaded(HeaderPageletLoadedEvent $event) {
  54.         $page $event->getPagelet();
  55.         $context $event->getContext();
  56.         $mediaRepositoryResults $this->getMediaUrls($context);
  57.         $extensions $page->getExtensions();
  58.         $extensions['mediaUrls'] = $mediaRepositoryResults;
  59.         $page->setExtensions($extensions);
  60.     }
  61.     // Add here new media urls
  62.     private function getMediaUrls(Context $context)
  63.     {
  64.         $mediaIds = [];
  65.         foreach (self::MEDIA_SETTINGS_TO_LOAD as $setting) {
  66.             $mediaIds[$setting] = $this->systemConfigService->get("FourtwosixThemeCustomization.config.$setting");
  67.         }
  68.         $mediaIds array_filter($mediaIds);
  69.         $criteria = new Criteria();
  70.         $criteria->addFilter(
  71.             new EqualsAnyFilter('id'$mediaIds)
  72.         );
  73.         $media $this->mediaRepository->search($criteria$context);
  74.         foreach ($media as $mediaElement) {
  75.             $keysToEnrich \array_keys($mediaIds$mediaElement->getId());
  76.             foreach ($keysToEnrich as $key) {
  77.                 $mediaIds[$key] = $mediaElement->getUrl();
  78.             }
  79.         }
  80.         return $mediaIds;
  81.     }
  82.     public function onProductLoaded(EntityLoadedEvent $event)
  83.     {
  84.         $products $event->getEntities();
  85.         if(empty($this->requestStack->getCurrentRequest()) || empty($this->requestStack->getCurrentRequest()->attributes)) {
  86.             return;
  87.         }
  88.         $route $this->requestStack->getCurrentRequest()->attributes->get('_route');
  89.         $detailPageProductId '';
  90.         if($route === 'frontend.detail.page'){
  91.             $detailPageProductId $this->requestStack->getCurrentRequest()->attributes->get('productId');
  92.         }
  93.         foreach ($products as $product) {
  94.             if($route === 'frontend.detail.page' && $product->getId() === $detailPageProductId){
  95.                 if($product->getAvailableStock() > 0){
  96.                     $deliveryTimeId $this->systemConfigService->get('FourtwosixThemeCustomization.config.defaultDeliveryTime'$event->getSalesChannelContext()->getSalesChannel()->getId());
  97.     
  98.                     if(empty($deliveryTimeId)) continue;
  99.     
  100.                     $product->setDeliveryTimeId($deliveryTimeId);
  101.                     $deliveryTime $this->deliveryTimeRepository->search(new Criteria([$deliveryTimeId]), $event->getContext())->first();
  102.     
  103.                     if (empty($deliveryTime)) continue;
  104.                     $product->setDeliveryTime($deliveryTime);
  105.                     continue;
  106.                 }
  107.             } else {
  108.                 if(!empty($product->getChildCount()) || $product->getChildCount() > 0){
  109.                     $sqlQuery "SELECT COUNT(*) FROM `product` AS `p` WHERE `p`.`parent_id` = UNHEX(:parent_id) AND `p`.`available_stock` < 1 GROUP BY `p`.`parent_id`";
  110.     
  111.                     $result $this->connection->executeQuery($sqlQuery, ['parent_id' => $product->getId()])->fetchOne();
  112.     
  113.                     if((int)$result == 0){
  114.                         $deliveryTimeId $this->systemConfigService->get('FourtwosixThemeCustomization.config.defaultDeliveryTime'$event->getSalesChannelContext()->getSalesChannel()->getId());
  115.                         if(!empty($deliveryTimeId)){
  116.                             $deliveryTime $this->deliveryTimeRepository->search(new Criteria([$deliveryTimeId]), $event->getContext())->first();
  117.     
  118.                             if (!empty($deliveryTime)) {
  119.                                 $product->setDeliveryTimeId($deliveryTimeId);
  120.                                 $product->setDeliveryTime($deliveryTime);
  121.                                 continue;
  122.                             }
  123.                         }
  124.                     }
  125.                 } elseif(!empty($product->getParentId())){
  126.                     $parentProductId $product->getParentId();
  127.     
  128.                     $sqlQuery "SELECT COUNT(*) FROM `product` AS `p` WHERE `p`.`parent_id` = UNHEX(:parent_id) AND `p`.`available_stock` < 1 GROUP BY `p`.`parent_id`";
  129.     
  130.                     $result $this->connection->executeQuery($sqlQuery, ['parent_id' => $parentProductId])->fetchOne();
  131.     
  132.                     if((int)$result == 0){
  133.                         $deliveryTimeId $this->systemConfigService->get('FourtwosixThemeCustomization.config.defaultDeliveryTime'$event->getSalesChannelContext()->getSalesChannel()->getId());
  134.                         if(!empty($deliveryTimeId)){
  135.                             $deliveryTime $this->deliveryTimeRepository->search(new Criteria([$deliveryTimeId]), $event->getContext())->first();
  136.     
  137.                             if (!empty($deliveryTime)) {
  138.                                 $product->setDeliveryTimeId($deliveryTimeId);
  139.                                 $product->setDeliveryTime($deliveryTime);
  140.                                 continue;
  141.                             }
  142.                         }
  143.                     }
  144.                 }
  145.             }
  146.             $manufacturer $this->productManufacturerRepository->search(new Criteria([$product->getManufacturerId()]), $event->getContext())->first();
  147.             if (empty($manufacturer) || empty($manufacturer->getTranslated()['customFields']['custom_product_manufacturer_delivery_time'])) continue;
  148.             if (empty($product->getDeliveryTimeId())) {
  149.                 $manufacturerDeliveryTimeId $manufacturer->getTranslated()['customFields']['custom_product_manufacturer_delivery_time'];
  150.                 if (empty($manufacturerDeliveryTimeId)) continue;
  151.                 $product->setDeliveryTimeId($manufacturerDeliveryTimeId);
  152.                 $deliveryTime $this->deliveryTimeRepository->search(new Criteria([$manufacturerDeliveryTimeId]), $event->getContext())->first();
  153.                 if (empty($deliveryTime)) continue;
  154.                 $product->setDeliveryTime($deliveryTime);
  155.             } else {
  156.                 if(!empty($manufacturer->getTranslated()['customFields']['custom_product_manufacturer_override_deliverytime']) && $manufacturer->getTranslated()['customFields']['custom_product_manufacturer_override_deliverytime']){
  157.                     $manufacturerDeliveryTimeId $manufacturer->getTranslated()['customFields']['custom_product_manufacturer_delivery_time'];
  158.                     if (empty($manufacturerDeliveryTimeId)) continue;
  159.                     $product->setDeliveryTimeId($manufacturerDeliveryTimeId);
  160.                     $deliveryTime $this->deliveryTimeRepository->search(new Criteria([$manufacturerDeliveryTimeId]), $event->getContext())->first();
  161.                     if (empty($deliveryTime)) continue;
  162.                     $product->setDeliveryTime($deliveryTime);
  163.                 }
  164.             }
  165.         }
  166.     }
  167. }