vendor/store.shopware.com/moorlmagazine/src/Core/Content/MagazineArticle/SalesChannel/Detail/MagazineArticleDetailRoute.php line 84

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\Detail;
  3. use MoorlMagazine\Core\Content\MagazineArticle\MagazineArticleDefinition;
  4. use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\MagazineArticleAvailableFilter;
  5. use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\SalesChannelMagazineArticleDefinition;
  6. use MoorlMagazine\Core\Content\MagazineArticle\SalesChannel\SalesChannelMagazineArticleEntity;
  7. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\EntityResolverContext;
  8. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  9. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Core\Framework\Plugin\Exception\DecorationPatternException;
  16. use Shopware\Core\System\SalesChannel\Entity\SalesChannelRepositoryInterface;
  17. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. /**
  21.  * @Route(defaults={"_routeScope"={"store-api"}})
  22.  */
  23. class MagazineArticleDetailRoute extends AbstractMagazineArticleDetailRoute
  24. {
  25.     private SalesChannelRepositoryInterface $magazineArticleRepository;
  26.     private SalesChannelCmsPageLoaderInterface $cmsPageLoader;
  27.     private MagazineArticleDefinition $magazineArticleDefinition;
  28.     public function __construct(
  29.         SalesChannelRepositoryInterface $magazineArticleRepository,
  30.         SalesChannelCmsPageLoaderInterface $cmsPageLoader,
  31.         SalesChannelMagazineArticleDefinition $magazineArticleDefinition
  32.     ) {
  33.         $this->magazineArticleRepository $magazineArticleRepository;
  34.         $this->cmsPageLoader $cmsPageLoader;
  35.         $this->magazineArticleDefinition $magazineArticleDefinition;
  36.     }
  37.     public function getDecorated(): AbstractMagazineArticleDetailRoute
  38.     {
  39.         throw new DecorationPatternException(self::class);
  40.     }
  41.     /**
  42.      * @throws PageNotFoundException
  43.      */
  44.     public function reload(
  45.         Request $request,
  46.         SalesChannelContext $context,
  47.         SalesChannelMagazineArticleEntity $magazineArticle
  48.     ): MagazineArticleDetailRouteResponse
  49.     {
  50.         $pageId $magazineArticle->getCmsPageId();
  51.         if (!$pageId) {
  52.             return new MagazineArticleDetailRouteResponse($magazineArticle);
  53.         }
  54.         $slotConfig $magazineArticle->getTranslation('slotConfig');
  55.         $resolverContext = new EntityResolverContext($context$request$this->magazineArticleDefinition$magazineArticle);
  56.         $pages $this->cmsPageLoader->load(
  57.             $request,
  58.             $this->createCriteria($pageId$request),
  59.             $context,
  60.             $slotConfig,
  61.             $resolverContext
  62.         );
  63.         if (!$pages->has($pageId)) {
  64.             throw new PageNotFoundException($pageId);
  65.         }
  66.         $magazineArticle->setCmsPage($pages->get($pageId));
  67.         return new MagazineArticleDetailRouteResponse($magazineArticle);
  68.     }
  69.     /**
  70.      * @throws PageNotFoundException
  71.      */
  72.     public function load(
  73.         string $magazineArticleId,
  74.         Request $request,
  75.         SalesChannelContext $context,
  76.         Criteria $criteria
  77.     ): MagazineArticleDetailRouteResponse
  78.     {
  79.         $this->addFilters($context$criteria);
  80.         $criteria->setIds([$magazineArticleId]);
  81.         /** @var SalesChannelMagazineArticleEntity $magazineArticle */
  82.         $magazineArticle $this->magazineArticleRepository
  83.             ->search($criteria$context)
  84.             ->first();
  85.         if (!$magazineArticle) {
  86.             throw new PageNotFoundException($magazineArticleId);
  87.         }
  88.         $this->enrichNextArticle($context$criteria$magazineArticle);
  89.         $this->enrichPreviousArticle($context$criteria$magazineArticle);
  90.         /* If a CMS page for content is defined */
  91.         $contentPageId $magazineArticle->getContentCmsPageId();
  92.         if ($contentPageId) {
  93.             $pages $this->cmsPageLoader->load(
  94.                 $request,
  95.                 $this->createCriteria($contentPageId$request),
  96.                 $context
  97.             );
  98.             if (!$pages->has($contentPageId)) {
  99.                 throw new PageNotFoundException($contentPageId);
  100.             }
  101.             $magazineArticle->addExtension('contentCmsPage'$pages->get($contentPageId));
  102.             /* Do not process the page, first the new content need to be processed */
  103.             return new MagazineArticleDetailRouteResponse($magazineArticle);
  104.         }
  105.         $pageId $magazineArticle->getCmsPageId();
  106.         if (!$pageId) {
  107.             return new MagazineArticleDetailRouteResponse($magazineArticle);
  108.         }
  109.         $slotConfig $magazineArticle->getTranslation('slotConfig');
  110.         $resolverContext = new EntityResolverContext($context$request$this->magazineArticleDefinition$magazineArticle);
  111.         $pages $this->cmsPageLoader->load(
  112.             $request,
  113.             $this->createCriteria($pageId$request),
  114.             $context,
  115.             $slotConfig,
  116.             $resolverContext
  117.         );
  118.         if (!$pages->has($pageId)) {
  119.             throw new PageNotFoundException($pageId);
  120.         }
  121.         $magazineArticle->setCmsPage($pages->get($pageId));
  122.         return new MagazineArticleDetailRouteResponse($magazineArticle);
  123.     }
  124.     private function addFilters(SalesChannelContext $contextCriteria $criteria): void
  125.     {
  126.         $criteria->addFilter(
  127.             new MagazineArticleAvailableFilter($context)
  128.         );
  129.         $criteria->addAssociation('swCategories');
  130.         $criteria->addAssociation('comments');
  131.         $commentsCriteria $criteria->getAssociation('comments');
  132.         $commentsCriteria->addSorting(new FieldSorting('createdAt'FieldSorting::ASCENDING));
  133.         $commentsCriteria->addFilter(new EqualsFilter('active'true));
  134.     }
  135.     private function createCriteria(string $pageIdRequest $request): Criteria
  136.     {
  137.         $criteria = new Criteria([$pageId]);
  138.         $criteria->setTitle('magazine_article_detail::cms-page');
  139.         $slots $request->get('slots');
  140.         if (\is_string($slots)) {
  141.             $slots explode('|'$slots);
  142.         }
  143.         if (!empty($slots) && \is_array($slots)) {
  144.             $criteria
  145.                 ->getAssociation('sections.blocks')
  146.                 ->addFilter(new EqualsAnyFilter('slots.id'$slots));
  147.         }
  148.         return $criteria;
  149.     }
  150.     public function enrichNextArticle(SalesChannelContext $contextCriteria $criteriaSalesChannelMagazineArticleEntity $magazineArticle): void
  151.     {
  152.         $criteria->setIds([]);
  153.         $criteria->resetSorting();
  154.         $criteria->resetFilters();
  155.         $criteria->addSorting(new FieldSorting('autoIncrement'FieldSorting::DESCENDING));
  156.         $criteria->addFilter(new RangeFilter('autoIncrement', ['lt' => $magazineArticle->getAutoIncrement()]));
  157.         $criteria->setLimit(1);
  158.         $magazineArticle->setNextMagazineArticle(
  159.             $this->magazineArticleRepository->search($criteria$context)->first()
  160.         );
  161.     }
  162.     public function enrichPreviousArticle(SalesChannelContext $contextCriteria $criteriaSalesChannelMagazineArticleEntity $magazineArticle): void
  163.     {
  164.         $criteria->setIds([]);
  165.         $criteria->resetSorting();
  166.         $criteria->resetFilters();
  167.         $criteria->addSorting(new FieldSorting('autoIncrement'FieldSorting::ASCENDING));
  168.         $criteria->addFilter(new RangeFilter('autoIncrement', ['gt' => $magazineArticle->getAutoIncrement()]));
  169.         $criteria->setLimit(1);
  170.         $magazineArticle->setPreviousMagazineArticle(
  171.             $this->magazineArticleRepository->search($criteria$context)->first()
  172.         );
  173.     }
  174. }