custom/plugins/SEMKNOX/src/Content/SiteSearchSalesChannelCmsPageLoader.php line 47

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace semknox\search\Content;
  3. use Shopware\Core\Content\Cms\Aggregate\CmsBlock\CmsBlockEntity;
  4. use Shopware\Core\Content\Cms\Aggregate\CmsSection\CmsSectionEntity;
  5. use Shopware\Core\Content\Cms\CmsPageEntity;
  6. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
  7. use Shopware\Core\Content\Cms\Events\CmsPageLoadedEvent;
  8. use Shopware\Core\Content\Cms\Events\CmsPageLoaderCriteriaEvent;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  12. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  13. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  16. use semknox\search\Framework\SemknoxsearchHelper;
  17. class SiteSearchSalesChannelCmsPageLoader implements SalesChannelCmsPageLoaderInterface
  18. {
  19.     private EntityRepositoryInterface $cmsPageRepository;
  20.     private SiteSearchCmsSlotsDataResolver $slotDataResolver;
  21.     private EventDispatcherInterface $eventDispatcher;
  22.     private Criteria $ListingCriteria;
  23.     private Criteria $impCriteria;
  24.     /**
  25.      *
  26.      * @var SalesChannelCmsPageLoaderInterface
  27.      */
  28.     private $decorated;
  29.     /**
  30.      *
  31.      * @var SemknoxsearchHelper
  32.      */
  33.     private $semknoxSearchHelper;
  34.     public function __construct(
  35.         SalesChannelCmsPageLoaderInterface $deco,
  36.         EntityRepositoryInterface $cmsPageRepository,
  37.         SiteSearchCmsSlotsDataResolver $slotDataResolver,
  38.         EventDispatcherInterface $eventDispatcher,
  39.         SemknoxsearchHelper $helper   
  40.     ) {
  41.         $this->decorated $deco;
  42.         $this->cmsPageRepository $cmsPageRepository;
  43.         $this->slotDataResolver $slotDataResolver;
  44.         $this->eventDispatcher $eventDispatcher;
  45.         $this->semknoxSearchHelper $helper;
  46.     }
  47.     public function load(
  48.         Request $request,
  49.         Criteria $criteria,
  50.         SalesChannelContext $context,
  51.         ?array $config null,
  52.         ?ResolverContext $resolverContext null
  53.     ): EntitySearchResult {
  54.         if ($this->semknoxSearchHelper->useSiteSearchInListing($context$request) === false) {
  55.             return $this->decorated->load($request$criteria$context$config$resolverContext);
  56.         }
  57.         $this->impCriteria = clone $criteria;
  58.         $limit $this->semknoxSearchHelper->getLimit($request$context);
  59.         $page $this->semknoxSearchHelper->getPage($request);        
  60.         $offset $limit * ($page 1);
  61.         $this->impCriteria->setOffset($offset);
  62.         $this->impCriteria->setLimit($limit);
  63.         $this->eventDispatcher->dispatch(new CmsPageLoaderCriteriaEvent($request$criteria$context));
  64.         $config $config ?? [];
  65.         $criteria
  66.             ->getAssociation('sections')
  67.             ->addAssociation('backgroundMedia');
  68.         $criteria
  69.             ->getAssociation('sections.blocks')
  70.             ->addAssociation('backgroundMedia')
  71.             ->addAssociation('slots');
  72.         $pages $this->cmsPageRepository->search($criteria$context->getContext());
  73.         foreach ($pages as $page) {
  74.             if ($page->getSections() === null) {
  75.                 continue;
  76.             }
  77.             $page->getSections()->sort(function (CmsSectionEntity $aCmsSectionEntity $b) {
  78.                 return $a->getPosition() <=> $b->getPosition();
  79.             });
  80.             if (!$resolverContext) {
  81.                 $resolverContext = new ResolverContext($context$request);
  82.             }
  83.             foreach ($page->getSections() as $section) {
  84.                 $section->getBlocks()->sort(function (CmsBlockEntity $aCmsBlockEntity $b) {
  85.                     return $a->getPosition() <=> $b->getPosition();
  86.                 });
  87.             }
  88.             $overwrite $config[$page->getId()] ?? $config;
  89.             $this->overwriteSlotConfig($page$overwrite);
  90.             $this->loadSlotData($page$resolverContext);
  91.         }
  92.         $this->eventDispatcher->dispatch(new CmsPageLoadedEvent($request$pages->getEntities(), $context));
  93.         return $pages;
  94.     }
  95.     private function loadSlotData(CmsPageEntity $pageResolverContext $resolverContext): void
  96.     {
  97.         $slots $this->slotDataResolver->resolve($page->getSections()->getBlocks()->getSlots(), $resolverContext$this->impCriteria);
  98.         $page->getSections()->getBlocks()->setSlots($slots);
  99.     }
  100.     private function overwriteSlotConfig(CmsPageEntity $page, array $config): void
  101.     {
  102.         foreach ($page->getSections()->getBlocks()->getSlots() as $slot) {
  103.             if ($slot->getConfig() === null && $slot->getTranslation('config') !== null) {
  104.                 $slot->setConfig($slot->getTranslation('config'));
  105.             }
  106.             if (empty($config)) {
  107.                 continue;
  108.             }
  109.             if (!isset($config[$slot->getId()])) {
  110.                 continue;
  111.             }
  112.             $defaultConfig $slot->getConfig() ?? [];
  113.             $merged array_replace_recursive(
  114.                 $defaultConfig,
  115.                 $config[$slot->getId()]
  116.             );
  117.             $slot->setConfig($merged);
  118.             $slot->addTranslated('config'$merged);
  119.         }
  120.     }
  121. }