custom/static-plugins/Shopware-6-Blog-Plugin/src/Controller/BlogController.php line 98

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Sas\BlogModule\Controller;
  3. use Sas\BlogModule\Content\Blog\BlogEntriesEntity;
  4. use Sas\BlogModule\Page\Search\BlogSearchPageLoader;
  5. use Shopware\Core\Content\Category\Tree\TreeItem;
  6. use Shopware\Core\Content\Cms\Exception\PageNotFoundException;
  7. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\OrFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  16. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  17. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  18. use Shopware\Core\System\SystemConfig\SystemConfigService;
  19. use Shopware\Storefront\Controller\StorefrontController;
  20. use Shopware\Storefront\Framework\Cache\Annotation\HttpCache;
  21. use Shopware\Storefront\Page\GenericPageLoaderInterface;
  22. use Shopware\Storefront\Page\Navigation\NavigationPage;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. /**
  27.  * @RouteScope(scopes={"storefront"})
  28.  */
  29. class BlogController extends StorefrontController
  30. {
  31.     private GenericPageLoaderInterface $genericPageLoader;
  32.     private SalesChannelCmsPageLoaderInterface $cmsPageLoader;
  33.     private SystemConfigService $systemConfigService;
  34.     private EntityRepositoryInterface $blogRepository;
  35.     private BlogSearchPageLoader $blogSearchPageLoader;
  36.     private EntityRepositoryInterface $categoryRepository;
  37.     public function __construct(
  38.         SystemConfigService $systemConfigService,
  39.         GenericPageLoaderInterface $genericPageLoader,
  40.         SalesChannelCmsPageLoaderInterface $cmsPageLoader,
  41.         EntityRepositoryInterface $blogRepository,
  42.         EntityRepositoryInterface $categoryRepository,
  43.         BlogSearchPageLoader $blogSearchPageLoader
  44.     ) {
  45.         $this->systemConfigService $systemConfigService;
  46.         $this->genericPageLoader $genericPageLoader;
  47.         $this->cmsPageLoader $cmsPageLoader;
  48.         $this->blogRepository $blogRepository;
  49.         $this->blogSearchPageLoader $blogSearchPageLoader;
  50.         $this->categoryRepository $categoryRepository;
  51.     }
  52.     /**
  53.      * @HttpCache()
  54.      * @Route("/sas_blog/search", name="sas.frontend.blog.search", methods={"GET"})
  55.      */
  56.     public function search(Request $requestSalesChannelContext $context): Response
  57.     {
  58.         try {
  59.             $page $this->blogSearchPageLoader->load($request$context);
  60.         } catch (MissingRequestParameterException $missingRequestParameterException) {
  61.             return $this->forwardToRoute('frontend.home.page');
  62.         }
  63.         return $this->renderStorefront('@Storefront/storefront/page/blog-search/index.html.twig', ['page' => $page]);
  64.     }
  65.     /**
  66.      * @HttpCache()
  67.      * @Route("/widgets/blog-search", name="widgets.blog.search.pagelet", methods={"GET", "POST"}, defaults={"XmlHttpRequest"=true})
  68.      *
  69.      * @throws MissingRequestParameterException
  70.      */
  71.     public function ajax(Request $requestSalesChannelContext $context): Response
  72.     {
  73.         $request->request->set('no-aggregations'true);
  74.         $page $this->blogSearchPageLoader->load($request$context);
  75.         $response $this->renderStorefront('@Storefront/storefront/page/blog-search/search-pagelet.html.twig', ['page' => $page]);
  76.         $response->headers->set('x-robots-tag''noindex');
  77.         return $response;
  78.     }
  79.     /**
  80.      * @HttpCache()
  81.      * @Route("/sas_blog/{articleId}", name="sas.frontend.blog.detail", methods={"GET"})
  82.      */
  83.     public function detailAction(string $articleIdRequest $requestSalesChannelContext $context): Response
  84.     {
  85.         $page $this->genericPageLoader->load($request$context);
  86.         $page NavigationPage::createFrom($page);
  87.         $criteria = new Criteria([$articleId]);
  88.         $criteria->addAssociations(['blogAuthor.salutation''blogCategories']);
  89.         $results $this->blogRepository->search($criteria$context->getContext())->getEntities();
  90.         /** @var BlogEntriesEntity $entry */
  91.         $entry $results->first();
  92.         $recommendedCriteria = new Criteria();
  93.         $recommendedCriteria->addAssociation("blogCategories");
  94.         $recommendedCriteria->addAssociation("media");
  95.         $recommendedCriteria->addFilter(new NotFilter(NotFilter::CONNECTION_AND, [new EqualsFilter("id"$entry->getId())]));
  96.         $recommendedCriteria->addSorting(new FieldSorting("createdAt"FieldSorting::DESCENDING));
  97.         $recommendedCriteria->setLimit(3);
  98.         $recommended $this->blogRepository->search($recommendedCriteria$context->getContext())->getEntities();
  99.         if (!$entry) {
  100.             throw new PageNotFoundException($articleId);
  101.         }
  102.         $cmsPageId $entry->getCustomFields()["cmsPageId"] ?? $this->systemConfigService->get('SasBlogModule.config.cmsBlogDetailPage');
  103.         $pages $this->cmsPageLoader->load(
  104.             $request,
  105.             new Criteria([$cmsPageId]),
  106.             $context
  107.         );
  108.         $page->setCmsPage($pages->first());
  109.         if ($metaInformation $page->getMetaInformation()) {
  110.             $metaTitle $entry->getMetaTitle() ?? $entry->getTitle();
  111.             $metaDescription $entry->getMetaDescription() ?? $entry->getTeaser();
  112.             $metaAuthor $entry->getBlogAuthor()->getTranslated()['name'];
  113.             $metaInformation->setMetaTitle($metaTitle ?? '');
  114.             $metaInformation->setMetaDescription($metaDescription ?? '');
  115.             $metaInformation->setAuthor($metaAuthor ?? '');
  116.             $page->setMetaInformation($metaInformation);
  117.         }
  118.         $page->setNavigationId($page->getHeader()->getNavigation()->getActive()->getId());
  119.         $newsCategoryId $this->systemConfigService->get('SasBlogModule.config.newsCategoryBreadcrumb');
  120.         $newsCategory $this->categoryRepository->search(new Criteria([$newsCategoryId]), $context->getContext());
  121.         return $this->renderStorefront('@SasBlogModule/storefront/page/content/blog-index.html.twig', [
  122.             'page' => $page,
  123.             'entry' => $entry,
  124.             'blog' => true,
  125.             'recommended' => $recommended,
  126.             'newsCategory' =>  $newsCategory->first()
  127.         ]);
  128.     }
  129.     /**
  130.      * @HttpCache()
  131.      * @Route("/blog/rss", name="frontend.sas.blog.rss", methods={"GET"})
  132.      */
  133.     public function rss(Request $requestSalesChannelContext $context): Response
  134.     {
  135.         $criteria = new Criteria();
  136.         $dateTime = new \DateTime();
  137.         $criteria->addAssociations(['blogAuthor.salutation']);
  138.         $criteria->addFilter(
  139.             new EqualsFilter('active'true),
  140.             new RangeFilter('publishedAt', [RangeFilter::LTE => $dateTime->format(\DATE_ATOM)])
  141.         );
  142.         $results $this->blogRepository->search($criteria$context->getContext())->getEntities();
  143.         $page $this->genericPageLoader->load($request$context);
  144.         $page NavigationPage::createFrom($page);
  145.         $response $this->renderStorefront('@SasBlogModule/storefront/page/rss.html.twig', [
  146.             'results' => $results,
  147.             'page' => $page,
  148.         ]);
  149.         $response->headers->set('Content-Type''application/xml; charset=utf-8');
  150.         return $response;
  151.     }
  152. }