custom/plugins/MoorlMerchantFinder/src/Core/Content/Merchant/SalesChannel/MerchantDetailRoute.php line 66

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Moorl\MerchantFinder\Core\Content\Merchant\SalesChannel;
  3. use Moorl\MerchantFinder\Core\Content\Merchant\MerchantDefinition;
  4. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\EntityResolverContext;
  5. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  6. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  9. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  10. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. /**
  15.  * @Route(defaults={"_routeScope"={"store-api"}})
  16.  */
  17. class MerchantDetailRoute
  18. {
  19.     private SalesChannelRepositoryInterface $merchantRepository;
  20.     private SalesChannelCmsPageLoaderInterface $cmsPageLoader;
  21.     private MerchantDefinition $merchantDefinition;
  22.     public function __construct(
  23.         SalesChannelRepositoryInterface $merchantRepository,
  24.         SalesChannelCmsPageLoaderInterface $cmsPageLoader,
  25.         MerchantDefinition $merchantDefinition
  26.     ) {
  27.         $this->merchantRepository $merchantRepository;
  28.         $this->cmsPageLoader $cmsPageLoader;
  29.         $this->merchantDefinition $merchantDefinition;
  30.     }
  31.     public function getDecorated()
  32.     {
  33.         throw new DecorationPatternException(self::class);
  34.     }
  35.     /**
  36.      * @throws PageNotFoundException
  37.      */
  38.     public function load(string $merchantIdRequest $requestSalesChannelContext $contextCriteria $criteria): MerchantDetailRouteResponse
  39.     {
  40.         $criteria->setIds([$merchantId]);
  41.         $criteria->addAssociation('country');
  42.         $criteria->addAssociation('countryState');
  43.         $criteria->addAssociation('marker');
  44.         $criteria->addAssociation('salutation');
  45.         $merchant $this->merchantRepository
  46.             ->search($criteria$context)
  47.             ->first();
  48.         $pageId $merchant->getCmsPageId();
  49.         $slotConfig $merchant->getTranslation('slotConfig');
  50.         if (!$pageId) {
  51.             return new MerchantDetailRouteResponse($merchant);
  52.         }
  53.         $resolverContext = new EntityResolverContext($context$request$this->merchantDefinition$merchant);
  54.         $pages $this->cmsPageLoader->load(
  55.             $request,
  56.             $this->createCriteria($pageId$request),
  57.             $context,
  58.             $slotConfig,
  59.             $resolverContext
  60.         );
  61.         if (!$pages->has($pageId)) {
  62.             throw new PageNotFoundException($pageId);
  63.         }
  64.         $merchant->setCmsPage($pages->get($pageId));
  65.         return new MerchantDetailRouteResponse($merchant);
  66.     }
  67.     private function createCriteria(string $pageIdRequest $request): Criteria
  68.     {
  69.         $criteria = new Criteria([$pageId]);
  70.         $criteria->setTitle('merchant_detail::cms-page');
  71.         $slots $request->get('slots');
  72.         if (\is_string($slots)) {
  73.             $slots explode('|'$slots);
  74.         }
  75.         if (!empty($slots) && \is_array($slots)) {
  76.             $criteria
  77.                 ->getAssociation('sections.blocks')
  78.                 ->addFilter(new EqualsAnyFilter('slots.id'$slots));
  79.         }
  80.         return $criteria;
  81.     }
  82. }