custom/plugins/SisiBlog6/src/Storefront/Controller/BlogController.php line 67

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Sisi\Blog6\Storefront\Controller;
  4. use Shopware\Core\Content\Cms\Aggregate\CmsBlock\CmsBlockEntity;
  5. use Shopware\Core\Content\Cms\Aggregate\CmsSection\CmsSectionEntity;
  6. use Shopware\Core\Content\Cms\CmsPageEntity;
  7. use Shopware\Core\Content\Cms\DataResolver\CmsSlotsDataResolver;
  8. use Shopware\Core\Content\Cms\DataResolver\ResolverContext\ResolverContext;
  9. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  10. use Shopware\Core\Framework\Context;
  11. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  14. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  15. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  16. use Shopware\Storefront\Controller\StorefrontController;
  17. use Shopware\Storefront\Page\GenericPageLoader;
  18. use Sisi\Blog6\Core\Content\Post\PostEntity;
  19. use Sisi\Blog6\Storefront\Page\Blog\Products\ProductsLoader;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Shopware\Storefront\Page\Page;
  24. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  25. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  26. /**
  27.  * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  28.  * @RouteScope(scopes={"storefront"})
  29.  */
  30. class BlogController extends StorefrontController
  31. {
  32.     /**
  33.      * @var GenericPageLoader
  34.      */
  35.     private $genericPageLoader;
  36.     /**
  37.      * @var ProductsLoader
  38.      */
  39.     private $productsLoader;
  40.     /**
  41.      * @var CmsSlotsDataResolver
  42.      */
  43.     private $slotDataResolver;
  44.     /**
  45.      * BlogController constructor.
  46.      * @param GenericPageLoader $genericPageLoader
  47.      */
  48.     public function __construct(GenericPageLoader $genericPageLoaderProductsLoader $productsLoaderCmsSlotsDataResolver $slotDataResolver)
  49.     {
  50.         $this->genericPageLoader $genericPageLoader;
  51.         $this->productsLoader $productsLoader;
  52.         $this->slotDataResolver $slotDataResolver;
  53.     }
  54.     /**
  55.      * @Route("/blog/{postId}", name="frontend.blog.detail", methods={"GET"})
  56.      * @param  mixed    $postId
  57.      * @throws PageNotFoundException
  58.      */
  59.     public function index(Request $requestSalesChannelContext $contextContext $criteriaContext$postId): Response
  60.     {
  61.         $page $this->genericPageLoader->load($request$context);
  62.         /** @var EntityRepositoryInterface $blogRepository */
  63.         $blogRepository $this->container->get('sisi_blog6_post.repository');
  64.         $criteria = new Criteria();
  65.         $criteria->addFilter(
  66.             new EqualsFilter('id'$postId)
  67.         );
  68.         $criteria->addFilter(new EqualsFilter('enabled'true));
  69.         // Today date
  70.         $today = new \DateTime();
  71.         $today $today->setTimezone(new \DateTimeZone('UTC'));
  72.         $todayStart $today->format('Y-m-d H:i:s');
  73.         $criteria->addFilter(
  74.             new MultiFilter(
  75.                 MultiFilter::CONNECTION_OR,
  76.                 [
  77.                     new RangeFilter('publishAt', ['lte' => $todayStart]),
  78.                     new EqualsFilter('publishAt'null),
  79.                 ]
  80.             )
  81.         );
  82.         $criteria->addAssociation('user');
  83.         $criteria->addAssociation('categories');
  84.         $criteria->addAssociation('categoriesRo');
  85.         $criteria->addAssociation('cover');
  86.         $criteria->addAssociation('media');
  87.         $criteria->addAssociation('products');
  88.         $criteria->addAssociation('shoppingExperience');
  89.         $criteria->addAssociation('shoppingExperience.sections');
  90.         $criteria->addAssociation('shoppingExperience.sections.blocks.slots');
  91.         $considerInheritanceState $criteriaContext->considerInheritance();
  92.         $criteriaContext->setConsiderInheritance(false);
  93.         $results $blogRepository->search($criteria$criteriaContext)->getEntities();
  94.         /** @var PostEntity|null $post */
  95.         $post $results->first();
  96.         if (!$post) {
  97.             throw new PageNotFoundException($postId);
  98.         }
  99.         $cmsPageResult null;
  100.         if ($post->getShoppingExperienceId()) {
  101.             $cmsPageResult $post->getShoppingExperience();
  102.             $resolverContext = new ResolverContext($context$request);
  103.             $this->loadSlotData($cmsPageResult$resolverContext);
  104.             $cmsPageResult->getSections()->sort(function (CmsSectionEntity $aCmsSectionEntity $b) {
  105.                 return $a->getPosition() <=> $b->getPosition();
  106.             });
  107.             foreach ($cmsPageResult->getSections() as $section) {
  108.                 $section->getBlocks()->sort(function (CmsBlockEntity $aCmsBlockEntity $b) {
  109.                     return $a->getPosition() <=> $b->getPosition();
  110.                 });
  111.             }
  112.         }
  113.         $criteriaContext->setConsiderInheritance($considerInheritanceState);
  114.         // Load products
  115.         $crossSellings $this->productsLoader->load($post->getProducts(), $context);
  116.         // Set metadata
  117.         $this->loadMetaData($page$post);
  118.         // Sort image collection
  119.         $post->getMedia()->sort(function ($one$two) {
  120.             return $one->getPosition() - $two->getPosition();
  121.         });
  122.         return $this->renderStorefront('@Storefront/storefront/page/blog/detail.html.twig', [
  123.             'page' => $page,
  124.             'post' => $post,
  125.             'crossSellings' => $crossSellings,
  126.             "blogCms" => $cmsPageResult
  127.         ]);
  128.     }
  129.     private function loadMetaData(Page $pagePostEntity $post): void
  130.     {
  131.         $metaInformation $page->getMetaInformation();
  132.         if (!$metaInformation) {
  133.             return;
  134.         }
  135.         $metaDescription $post->getTranslation('shortDescription')
  136.             ?? $post->getTranslation('description');
  137.         $metaInformation->setMetaDescription((string) $metaDescription);
  138.         $metaInformation->setMetaKeywords((string) $post->getTranslation('keywords'));
  139.     }
  140.     private function loadSlotData(CmsPageEntity $pageResolverContext $resolverContext): void
  141.     {
  142.         $slots $this->slotDataResolver->resolve($page->getSections()->getBlocks()->getSlots(), $resolverContext);
  143.         $page->getSections()->getBlocks()->setSlots($slots);
  144.     }
  145. }