vendor/shopware/core/Content/Product/Cms/ProductListingCmsElementResolver.php line 60

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Content\Product\Cms;
  3. use Shopware\Core\Content\Cms\Aggregate\CmsSlot\CmsSlotEntity;
  4. use Shopware\Core\Content\Cms\DataResolver\CriteriaCollection;
  5. use Shopware\Core\Content\Cms\DataResolver\Element\AbstractCmsElementResolver;
  6. use Shopware\Core\Content\Cms\DataResolver\Element\ElementDataCollection;
  7. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
  8. use Shopware\Core\Content\Cms\SalesChannel\Struct\ProductListingStruct;
  9. use Shopware\Core\Content\Product\SalesChannel\Listing\AbstractProductListingRoute;
  10. use Shopware\Core\Content\Product\SalesChannel\Listing\ProductListingFeaturesSubscriber;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  13. use Symfony\Component\HttpFoundation\Request;
  14. class ProductListingCmsElementResolver extends AbstractCmsElementResolver
  15. {
  16.     private AbstractProductListingRoute $listingRoute;
  17.     /**
  18.      * @internal
  19.      */
  20.     public function __construct(AbstractProductListingRoute $listingRoute)
  21.     {
  22.         $this->listingRoute $listingRoute;
  23.     }
  24.     public function getType(): string
  25.     {
  26.         return 'product-listing';
  27.     }
  28.     public function collect(CmsSlotEntity $slotResolverContext $resolverContext): ?CriteriaCollection
  29.     {
  30.         return null;
  31.     }
  32.     public function enrich(CmsSlotEntity $slotResolverContext $resolverContextElementDataCollection $result): void
  33.     {
  34.         $data = new ProductListingStruct();
  35.         $slot->setData($data);
  36.         $request $resolverContext->getRequest();
  37.         $context $resolverContext->getSalesChannelContext();
  38.         $this->restrictFilters($slot$request);
  39.         if ($this->isCustomSorting($slot)) {
  40.             $this->restrictSortings($request$slot);
  41.             $this->addDefaultSorting($request$slot);
  42.         }
  43.         $navigationId $this->getNavigationId($request$context);
  44.         $criteria = new Criteria();
  45.         $criteria->setTitle('cms::product-listing');
  46.         $listing $this->listingRoute
  47.             ->load($navigationId$request$context$criteria)
  48.             ->getResult();
  49.         $data->setListing($listing);
  50.     }
  51.     private function getNavigationId(Request $requestSalesChannelContext $salesChannelContext): string
  52.     {
  53.         if ($navigationId $request->get('navigationId')) {
  54.             return $navigationId;
  55.         }
  56.         $params $request->attributes->get('_route_params');
  57.         if ($params && isset($params['navigationId'])) {
  58.             return $params['navigationId'];
  59.         }
  60.         return $salesChannelContext->getSalesChannel()->getNavigationCategoryId();
  61.     }
  62.     private function isCustomSorting(CmsSlotEntity $slot): bool
  63.     {
  64.         $config $slot->getTranslation('config');
  65.         if ($config && isset($config['useCustomSorting']) && isset($config['useCustomSorting']['value'])) {
  66.             return $config['useCustomSorting']['value'];
  67.         }
  68.         return false;
  69.     }
  70.     private function addDefaultSorting(Request $requestCmsSlotEntity $slot): void
  71.     {
  72.         if ($request->get('order')) {
  73.             return;
  74.         }
  75.         $config $slot->getTranslation('config');
  76.         if ($config && isset($config['defaultSorting']) && isset($config['defaultSorting']['value']) && $config['defaultSorting']['value']) {
  77.             $request->request->set('order'$config['defaultSorting']['value']);
  78.             return;
  79.         }
  80.         // if we have no specific order given at this point, set the order to be the highest's priority available sorting
  81.         if ($request->get('availableSortings')) {
  82.             $availableSortings $request->get('availableSortings');
  83.             arsort($availableSortings, \SORT_DESC | \SORT_NUMERIC);
  84.             $request->request->set('order'array_key_first($availableSortings));
  85.         }
  86.     }
  87.     private function restrictSortings(Request $requestCmsSlotEntity $slot): void
  88.     {
  89.         $config $slot->getTranslation('config');
  90.         if (!$config || !isset($config['availableSortings']) || !isset($config['availableSortings']['value'])) {
  91.             return;
  92.         }
  93.         $request->request->set('availableSortings'$config['availableSortings']['value']);
  94.     }
  95.     private function restrictFilters(CmsSlotEntity $slotRequest $request): void
  96.     {
  97.         // setup the default behavior
  98.         $defaults = ['manufacturer-filter''rating-filter''shipping-free-filter''price-filter''property-filter'];
  99.         $request->request->set(ProductListingFeaturesSubscriber::PROPERTY_GROUP_IDS_REQUEST_PARAMnull);
  100.         $config $slot->get('config');
  101.         if (isset($config['propertyWhitelist']['value']) && \count($config['propertyWhitelist']['value']) > 0) {
  102.             $request->request->set(ProductListingFeaturesSubscriber::PROPERTY_GROUP_IDS_REQUEST_PARAM$config['propertyWhitelist']['value']);
  103.         }
  104.         if (!isset($config['filters']['value'])) {
  105.             return;
  106.         }
  107.         // apply config settings
  108.         $config explode(','$config['filters']['value']);
  109.         foreach ($defaults as $filter) {
  110.             if (\in_array($filter$configtrue)) {
  111.                 continue;
  112.             }
  113.             $request->request->set($filterfalse);
  114.         }
  115.     }
  116. }