custom/plugins/AcrisCmsPreviewCS/src/Subscriber/SalesChannelProductCriteriaSubscriber.php line 30

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\CmsPreview\Subscriber;
  3. use Acris\CmsPreview\Components\Struct\CmsPreviewPageStruct;
  4. use Shopware\Core\Content\Product\SalesChannel\ProductAvailableFilter;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  8. use Shopware\Core\System\SalesChannel\Event\SalesChannelProcessCriteriaEvent;
  9. use Shopware\Core\System\SystemConfig\SystemConfigService;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class SalesChannelProductCriteriaSubscriber implements EventSubscriberInterface
  12. {
  13.     private SystemConfigService $systemConfigService;
  14.     public function __construct(SystemConfigService $systemConfigService)
  15.     {
  16.         $this->systemConfigService $systemConfigService;
  17.     }
  18.     public static function getSubscribedEvents(): array
  19.     {
  20.         return [
  21.             'sales_channel.product.process.criteria' => 'onProductCriteriaLoaded'
  22.         ];
  23.     }
  24.     public function onProductCriteriaLoaded(SalesChannelProcessCriteriaEvent $event): void
  25.     {
  26.         $salesChannelContext $event->getSalesChannelContext();
  27.         if($salesChannelContext->hasExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE) === true && $salesChannelContext->getExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE) instanceof CmsPreviewPageStruct) {
  28.             /** @var CmsPreviewPageStruct $cmsPagePreviewStruct */
  29.             $cmsPagePreviewStruct $salesChannelContext->getExtension(CmsPreviewPageStruct::EXTENSION_CMS_PREVIEW_PAGE);
  30.             $criteria $event->getCriteria();
  31.             $showInactiveProducts $this->systemConfigService->get('AcrisCmsPreviewCS.config.showInactiveProductsInCategory'$salesChannelContext->getSalesChannelId());
  32.             // plugin config: show inactive products for category preview
  33.             if ($showInactiveProducts === true && empty($cmsPagePreviewStruct->getProductId()) === true) {
  34.                 if ($this->hasAvailableFilter($criteria) === true) {
  35.                     $newCriteriaFilters = [];
  36.                     foreach ($criteria->getFilters() as $filter) {
  37.                         if (!$filter instanceof ProductAvailableFilter) {
  38.                             array_push($newCriteriaFilters$filter);
  39.                         }
  40.                         if ($filter instanceof ProductAvailableFilter) {
  41.                             foreach ($filter->getQueries() as $query) {
  42.                                 if (!empty($query->getField()) && $query->getField() !== 'product.active') {
  43.                                     array_push($newCriteriaFilters$query);
  44.                                 }
  45.                             }
  46.                         }
  47.                     }
  48.                     if (!empty($newCriteriaFilters)) {
  49.                         $criteria->resetFilters();
  50.                         $criteria->addFilter(new MultiFilter(
  51.                             MultiFilter::CONNECTION_OR,
  52.                             [
  53.                                 new EqualsFilter('product.active'true),
  54.                                 new EqualsFilter('product.active'false)
  55.                             ]
  56.                         ));
  57.                         foreach ($newCriteriaFilters as $key => $filter) {
  58.                             if ($filter instanceof EqualsFilter) {
  59.                                 $criteria->addFilter(new EqualsFilter($filter->getField(), $filter->getValue()));
  60.                             }
  61.                         }
  62.                     }
  63.                 }
  64.                 $originalLimit $criteria->getLimit();
  65.                 $modifiedLimit $originalLimit ?? 20;
  66.                 $criteria->setLimit($modifiedLimit);
  67.             }
  68.             // always show inactive products (and variant) in previews
  69.             if (!empty($cmsPagePreviewStruct->getProductId())) {
  70.                 if (empty($criteria->getTitle()) === true || strpos($criteria->getTitle(), 'product-detail-route') === true || $criteria->getTitle() === 'product-detail-route') {
  71.                     $criteria->resetFilters();
  72.                 }
  73.             }
  74.         }
  75.     }
  76.     private function hasAvailableFilter(Criteria $criteria): bool
  77.     {
  78.         foreach ($criteria->getFilters() as $filter) {
  79.             if ($filter instanceof ProductAvailableFilter) {
  80.                 return true;
  81.             }
  82.         }
  83.         return false;
  84.     }
  85. }