vendor/store.shopware.com/huebertseofaq/src/Storefront/Controller/SeoFaqController.php line 94

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Huebert\SeoFaq\Storefront\Controller;
  3. use Huebert\SeoFaq\Core\Content\SeoFaqGroup\SeoFaqGroupCollection;
  4. use Huebert\SeoFaq\Core\Content\SeoFaqQuestions\SeoFaqQuestionsCollection;
  5. use Huebert\SeoFaq\Core\Content\SeoFaqQuestions\SeoFaqQuestionsEntity;
  6. use Shopware\Core\Framework\Context;
  7. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  10. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  11. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  12. use Shopware\Storefront\Controller\StorefrontController;
  13. use Shopware\Storefront\Page\GenericPageLoader;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. /**
  18.  * @RouteScope(scopes={"storefront"})
  19.  */
  20. class SeoFaqController extends StorefrontController
  21. {
  22.     private EntityRepositoryInterface $questionsRepository;
  23.     private EntityRepositoryInterface $groupRepository;
  24.     private GenericPageLoader $genericPageLoader;
  25.     public function __construct(
  26.         GenericPageLoader $genericPageLoader,
  27.         EntityRepositoryInterface $questionsRepository,
  28.         EntityRepositoryInterface $groupRepository
  29.     )
  30.     {
  31.         $this->genericPageLoader $genericPageLoader;
  32.         $this->questionsRepository $questionsRepository;
  33.         $this->groupRepository $groupRepository;
  34.     }
  35.     /**
  36.      * @Route("/faq", name="frontend.seoFaq", options={"seo"="false"}, methods={"GET"})
  37.      */
  38.     public function seoFaqRaw(Request $requestSalesChannelContext $context): Response
  39.     {
  40.         $page $this->genericPageLoader->load($request$context);
  41.         [$questionResult$groupResult] = $this->assignVariables($context->getContext());
  42.         $page->assign([
  43.             'group' => $groupResult,
  44.             'question' => $questionResult,
  45.         ]);
  46.         return $this->renderStorefront("@HuebertSeoFaq/storefront/seoFaq/seoFaq.html.twig", [
  47.             'page' => $page,
  48.         ]);
  49.     }
  50.     /**
  51.      * @Route("/faq/{question}", name="frontend.seoFaq.question", options={"seo"="false"}, methods={"GET"})
  52.      */
  53.     public function seoFaq(Request $requestSalesChannelContext $contextstring $question): Response
  54.     {
  55.         $page $this->genericPageLoader->load($request$context);
  56.         [$questionResult$groupResult] = $this->assignVariables($context->getContext());
  57.         $currentQuestion $questionResult
  58.             ->filter(function (SeoFaqQuestionsEntity $seoQuestion) use ($question) {
  59.                 return $this->encodeURLString($seoQuestion->getQuestion()) === $question;
  60.             })
  61.             ->first();
  62.         $page->assign([
  63.             'group' => $groupResult,
  64.             'question' => $questionResult,
  65.             'questionSpecific' => $currentQuestion,
  66.         ]);
  67.         return $this->renderStorefront("@HuebertSeoFaq/storefront/seoFaq/seoFaq.html.twig", [
  68.             'page' => $page,
  69.         ]);
  70.     }
  71.     private function assignVariables(Context $context): array
  72.     {
  73.         // Update 28.12.21 Added sorting by group and question position
  74.         $questionCriteria = new Criteria();
  75.         $questionCriteria->addSorting(new FieldSorting('questionPosition'FieldSorting::ASCENDING));
  76.         /** @var SeoFaqQuestionsCollection $questionResult */
  77.         $questionResult $this->questionsRepository->search($questionCriteria$context)->getEntities();
  78.         foreach ($questionResult as $entity) {
  79.             $entity->setExtensions(['questionUrl' => $this->encodeURLString($entity->getTranslation('question'))]);
  80.         }
  81.         $groupCriteria = new Criteria();
  82.         $groupCriteria->addSorting(new FieldSorting('position'FieldSorting::ASCENDING));
  83.         /** @var SeoFaqGroupCollection $groupResult */
  84.         $groupResult $this->groupRepository->search($groupCriteria$context)->getEntities();
  85.         return [$questionResult$groupResult];
  86.     }
  87.     private function encodeURLString(string $string): string
  88.     {
  89.         $encodedUrl str_replace("_",
  90.             "-",
  91.             strtolower(preg_replace(
  92.                 ['/ä/''/ö/''/ü/''/Ä/''/Ö/''/Ü/''/ẞ/''/ß/',],
  93.                 ['ae''oe''ue''ae''oe''ue''ss''ss',],
  94.                 $string
  95.             )));
  96.         $encodedUrl preg_replace('/[^\da-z ]/i'''$encodedUrl);
  97.         return str_replace(' ''-'$encodedUrl);
  98.     }
  99. }