custom/plugins/PixelLexikonSW6/src/Controller/FrontendController.php line 258

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Pixel\LexikonSW6\Controller;
  3. use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\Uuid\Uuid;
  6. use Doctrine\DBAL\Connection;
  7. use Shopware\Core\Framework\Context;
  8. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  9. use Shopware\Storefront\Controller\StorefrontController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  14. use Pixel\LexikonSW6\Component\FrontHelpers;
  15. use Pixel\LexikonSW6\Component\CoreFunctions;
  16. use Shopware\Storefront\Page\GenericPageLoader;
  17. use Shopware\Core\PlatformRequest;
  18. use Shopware\Storefront\Framework\Routing\RequestTransformer;
  19. use Shopware\Storefront\Framework\Cache\Annotation\HttpCache;
  20. use Shopware\Core\Content\Category\Exception\CategoryNotFoundException;
  21. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
  22. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  23. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  24. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  25. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  26. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  27. use Shopware\Core\System\SystemConfig\SystemConfigService;
  28. use Shopware\Core\Content\Cms\SalesChannel\SalesChannelCmsPageLoaderInterface;
  29. use Pixel\LexikonSW6\Entities\LexikonPage;
  30. use Shopware\Storefront\Page\MetaInformation;
  31. /**
  32.  * @RouteScope(scopes={"storefront"})
  33.  */
  34. class FrontendController extends StorefrontController
  35. {
  36.     /**
  37.      * @var SystemConfigService
  38.      */
  39.     private $systemConfigService;
  40.     private $config;
  41.     /**
  42.      * @var FrontHelpers
  43.      */
  44.     private $FrontHelpers;
  45.     /**
  46.      * @var EntityRepositoryInterface
  47.      */
  48.     private $lexikonRepository;
  49.     /**
  50.      * @var GenericPageLoader
  51.      */
  52.     private $genericLoader;
  53.     /**
  54.      * @var CoreFunctions
  55.      */
  56.     private $lexikonRewriter;
  57.     /**
  58.      * @var Connection
  59.      */
  60.     private $connection;
  61.     /**
  62.      * @var SeoUrlPlaceholderHandlerInterface
  63.      */
  64.     private $seoUrlRewriter;
  65.     private $lexikonCatRepository;
  66.     private $cmsLoader;
  67.     public function __construct(
  68.         SeoUrlPlaceholderHandlerInterface $seoUrlRewriter,
  69.         SystemConfigService $systemConfigService,
  70.         FrontHelpers $FrontHelpers,
  71.         CoreFunctions $lexikonRewriter,
  72.         EntityRepositoryInterface $lexikonRepository,
  73.         EntityRepositoryInterface $lexikonCatRepository,
  74.         GenericPageLoader $genericLoader,
  75.         Connection $connection,
  76.         SalesChannelCmsPageLoaderInterface $cmsLoader
  77.     ) {
  78.         $this->systemConfigService $systemConfigService;
  79.         $this->FrontHelpers $FrontHelpers;
  80.         $this->lexikonRewriter $lexikonRewriter;
  81.         $this->lexikonRepository $lexikonRepository;
  82.         $this->lexikonCatRepository $lexikonCatRepository;
  83.         $this->genericLoader $genericLoader;
  84.         $this->seoUrlRewriter $seoUrlRewriter;
  85.         $this->connection $connection;
  86.         $this->cmsLoader $cmsLoader;
  87.     }
  88.     /**
  89.      * @HttpCache()
  90.      * @Route("/lexikon", name="frontend.lexikon.index",  options={"seo"=false}, methods={"GET"})
  91.      * @param Request $request
  92.      * @param SalesChannelContext $salesChannelContext
  93.      * @param Context $criteriaContext
  94.      * @return Response
  95.      * @throws CategoryNotFoundException
  96.      * @throws InconsistentCriteriaIdsException
  97.      * @throws MissingRequestParameterException
  98.      */
  99.     public function index(Request $requestSalesChannelContext $salesChannelContextContext $context): Response
  100.     {
  101.         $systemConfig $this->systemConfigService->get('PixelLexikonSW6.config'$salesChannelContext->getSalesChannel()->getId());
  102.         if ( $systemConfig['active'] !== true) {
  103.             return $this->forwardToRoute('frontend.home.page');
  104.         }
  105.         $sales_channel_id $salesChannelContext->getSalesChannel()->getId();
  106.         $page $this->genericLoader->load($request$salesChannelContext);
  107.         $categoryId $request->get('categoryId');
  108.         $navigation $this->FrontHelpers->getAllLexikon($context$sales_channel_id$categoryId$systemConfig);
  109.         $pixelLexikon = array(
  110.             //'Categories' => $this->FrontHelpers->getCategories($context),
  111.             'Navigation' => $navigation,
  112.             'page' => 'index'
  113.         );
  114.         $breadcrumbLinkName $this->container->get('translator')->trans('pixelLexikon.page.breadcrumb.name');
  115.         $breadcrumb[] = array(
  116.             'link' => $this->seoUrlRewriter->generate('frontend.lexikon.index'),
  117.             'name' => $breadcrumbLinkName,
  118.             'active' => true,
  119.             'translated' => array(
  120.                 'name' => $breadcrumbLinkName
  121.             )
  122.         );
  123.         if (array_key_exists('cmspage'$systemConfig) && ($systemConfig['cmspage'] !== '' || $systemConfig['cmspage'] != null)) {
  124.             $cmsLexikonPage $this->cmsLoader->load($request, new Criteria([$systemConfig['cmspage']]), $salesChannelContext)->first();
  125.             $page LexikonPage::createFrom($this->genericLoader->load($request$salesChannelContext));
  126.             $page->setCmsPage($cmsLexikonPage);
  127.             $template '@Storefront/storefront/page/content/index.html.twig';
  128.             return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
  129.                 'pixelLexikon' => $pixelLexikon,
  130.                 'page' => $page,
  131.                 'breadcrumbList' => $breadcrumb
  132.             ]);
  133.         } else {
  134.             return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
  135.                 'pixelLexikon' => $pixelLexikon,
  136.                 'page' => $page,
  137.                 'breadcrumbList' => $breadcrumb
  138.             ]);
  139.         }
  140.     }
  141.     /**
  142.      * @HttpCache()
  143.      * @Route("/lexikon/listing/{categoryId}", name="frontend.lexikon.listing",  options={"seo"=true}, methods={"GET"})
  144.      * @param Request $request
  145.      * @param SalesChannelContext $salesChannelContext
  146.      * @param Context $criteriaContext
  147.      * @param $categoryId
  148.      * @return Response
  149.      * @throws CategoryNotFoundException
  150.      * @throws InconsistentCriteriaIdsException
  151.      * @throws MissingRequestParameterException
  152.      */
  153.     public function listing(
  154.         Request $request,
  155.         SalesChannelContext $salesChannelContext,
  156.         Context $context,
  157.         $categoryId
  158.     ): Response {
  159.         $systemConfig $this->systemConfigService->get('PixelLexikonSW6.config'$salesChannelContext->getSalesChannel()->getId());
  160.         if ($systemConfig['active'] !== true) {
  161.             return $this->forwardToRoute('frontend.home.page');
  162.         }
  163.         $limit intval($request->get('limit',  $systemConfig['LEXIKONLIMIT']));
  164.         $offset intval($request->get('p'1));
  165.         if($offset <= 0)
  166.             $offset 1;
  167.         $sales_channel_id $salesChannelContext->getSalesChannel()->getId();
  168.         $page $this->genericLoader->load($request$salesChannelContext);
  169.         $pixelLexikon['Category'] = $this->FrontHelpers->getCategory($context$categoryId$systemConfig);
  170.         $pixelLexikon['Navigation'] = $this->FrontHelpers->getAllLexikon($context$sales_channel_id$categoryId,  $systemConfig$limit,  $offset);
  171.         $pixelLexikon['categoryId'] = $categoryId;
  172.         $pixelLexikon['entries'] =  $this->FrontHelpers->getEntries($context$sales_channel_id$categoryId$systemConfig$limit$offset);
  173.         if(! $pixelLexikon['entries']) {
  174.             return $this->redirectToRoute('frontend.lexikon.index');
  175.         }
  176.         $pixelLexikon['page'] = 'listing';
  177.         $pixelLexikon['limit'] = $limit;
  178.         $pixelLexikon['offset'] = $offset;
  179.         $breadcrumbLinkName $this->container->get('translator')->trans('pixelLexikon.page.breadcrumb.name');
  180.         $breadcrumb[] = array(
  181.             'link' => $this->seoUrlRewriter->generate('frontend.lexikon.index'),
  182.             'name' => $breadcrumbLinkName,
  183.             'translated' => array(
  184.                 'name' => $breadcrumbLinkName
  185.             )
  186.         );
  187.         $breadcrumb[] = array(
  188.             'link' => $this->seoUrlRewriter->generate('frontend.lexikon.listing', ['categoryId' => $categoryId]),
  189.             'name' => $pixelLexikon['Category']->getTranslated()['title'],
  190.             'active' => true,
  191.             'translated' => array(
  192.                 'name' => $pixelLexikon['Category']->getTranslated()['title']
  193.             )
  194.         );
  195.         return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
  196.             'pixelLexikon' => $pixelLexikon,
  197.             'page' => $page,
  198.             'breadcrumbList' => $breadcrumb
  199.         ]);
  200.     }
  201.     /**
  202.      * @HttpCache()
  203.      * @Route("/lexikon/detail/{id?}", name="frontend.lexikon.detail",  options={"seo"=true}, methods={"GET"})
  204.      * @param Request $request
  205.      * @param SalesChannelContext $salesChannelContext
  206.      * @param Context $criteriaContext
  207.      * @param $id
  208.      * @return Response
  209.      * @throws CategoryNotFoundException
  210.      * @throws InconsistentCriteriaIdsException
  211.      * @throws MissingRequestParameterException
  212.      */
  213.     public function detail(Request $requestSalesChannelContext $salesChannelContextContext $context$id): Response
  214.     {
  215.         $systemConfig $this->systemConfigService->get('PixelLexikonSW6.config'$salesChannelContext->getSalesChannel()->getId());
  216.         if ($systemConfig['active'] !== true) {
  217.             return $this->forwardToRoute('frontend.home.page');
  218.         }
  219.         $sales_channel_id $salesChannelContext->getSalesChannel()->getId();
  220.         $page $this->genericLoader->load($request$salesChannelContext);
  221.         $lexikonentry $this->FrontHelpers->getLexikonById($context$id);
  222.         $categoryId $lexikonentry->get('categoryid');
  223.         $this->lexikonRepository->update(
  224.             [
  225.                 ['id' => $id'shows' => $lexikonentry->get('shows') + 1],
  226.             ],
  227.             $context
  228.         );
  229.         $pixelLexikon['Navigation'] = $this->FrontHelpers->getAllLexikon($context$sales_channel_id$categoryId$systemConfig);
  230.         $pixelLexikon['categoryId'] = $categoryId;
  231.         $pixelLexikon['entry'] = $lexikonentry;
  232.         $pixelLexikon['page'] = 'detail';
  233.         $cmsLexikonPage $this->cmsLoader->load($request, new Criteria([$lexikonentry->get('cmspageid')]), $salesChannelContext)->first();
  234.         $page LexikonPage::createFrom($this->genericLoader->load($request$salesChannelContext));
  235.         $page->setCmsPage($cmsLexikonPage);
  236.         $breadcrumbLinkName $this->container->get('translator')->trans('pixelLexikon.page.breadcrumb.name');
  237.         $breadcrumb[] = array(
  238.             'link' => $this->seoUrlRewriter->generate('frontend.lexikon.index'),
  239.             'name' => $breadcrumbLinkName,
  240.             'translated' => array(
  241.                 'name' => $breadcrumbLinkName
  242.             )
  243.         );
  244.         $breadcrumb[] = array(
  245.             'link' => $this->seoUrlRewriter->generate('frontend.lexikon.listing', ['categoryId' => $categoryId]),
  246.             'name' => $lexikonentry->get('category')->getTranslated()['title'],
  247.             'translated' => array(
  248.                 'name' => $lexikonentry->get('category')->getTranslated()['title']
  249.             )
  250.         );
  251.         $breadcrumb[] = array(
  252.             'link' => $this->seoUrlRewriter->generate('frontend.lexikon.detail', ['id' => $id]),
  253.             'name' => $lexikonentry->getTranslated()['title'],
  254.             'active' => true,
  255.             'translated' => array(
  256.                 'name' => $lexikonentry->getTranslated()['title']
  257.             )
  258.         );
  259.         return $this->renderStorefront('@Storefront/storefront/base.html.twig', [
  260.             'pixelLexikon' => $pixelLexikon,
  261.             'page' => $page,
  262.             'breadcrumbList' => $breadcrumb
  263.         ]);
  264.     }
  265.     /**
  266.      * @HttpCache()
  267.      * @Route("/lexikon/ajax/{id?}", name="frontend.lexikon.ajax",  options={"seo"=false}, methods={"GET"}, defaults={"XmlHttpRequest"=true})
  268.      * @param Request $request
  269.      * @param SalesChannelContext $salesChannelContext
  270.      * @param Context $criteriaContext
  271.      * @param $id
  272.      * @return Response
  273.      * @throws CategoryNotFoundException
  274.      * @throws InconsistentCriteriaIdsException
  275.      * @throws MissingRequestParameterException
  276.      */
  277.     public function ajax(Request $requestSalesChannelContext $salesChannelContextContext $context$id): Response
  278.     {
  279.         $systemConfig $this->systemConfigService->get('PixelLexikonSW6.config'$salesChannelContext->getSalesChannel()->getId());
  280.         if ($systemConfig['active'] !== true) {
  281.             return $this->forwardToRoute('frontend.home.page');
  282.         }
  283.         if (!$request->isXmlHttpRequest()) {
  284.             return $this->forwardToRoute('frontend.lexikon.detail', array('id' => $id));
  285.         }
  286.         $pixelLexikon['entry'] = $this->FrontHelpers->getLexikonItem($context$id);
  287.         $lexikon_id $pixelLexikon['entry']->get('id');
  288.         $this->lexikonRepository->update(
  289.             [
  290.                 ['id' => $lexikon_id'shows' => $pixelLexikon['entry']->get('shows') + 1],
  291.             ],
  292.             $context
  293.         );
  294.         return $this->renderStorefront('@Storefront/storefront/pixel-lexikon/page/ajax/ajax.html.twig', [
  295.             'pixelLexikon' => $pixelLexikon
  296.         ]);
  297.     }
  298.     /**
  299.      *
  300.      *
  301.      * @param LexikonPage $page
  302.      */
  303.     private function loadMeta(LexikonPage $page): void
  304.     {
  305.         $lexikonEntry $page->getLexikonEntry();
  306.         $metaInformation = new MetaInformation();
  307.         $metaTitle $lexikonEntry->getTranslation('metaTitle') ?? $lexikonEntry->getTranslation('title');
  308.         $metaInformation->setMetaTitle($metaTitle);
  309.         $metaDescription $lexikonEntry->getTranslation('metaDescription') ?? $lexikonEntry->getTranslation('description');
  310.         $metaInformation->setMetaDescription((string) $metaDescription);
  311.         $keywords $lexikonEntry->getTranslation('keywords');
  312.         $metaInformation->setMetaKeywords((string) $keywords);
  313.         $page->setMetaInformation($metaInformation);
  314.     }
  315. }