custom/plugins/NetiNextStoreLocator/src/Storefront/Page/Store/Detail/StoreDetailPageLoader.php line 91

Open in your IDE?
  1. <?php
  2. namespace NetInventors\NetiNextStoreLocator\Storefront\Page\Store\Detail;
  3. use NetInventors\NetiNextStoreLocator\Components\CmsPageRenderer;
  4. use NetInventors\NetiNextStoreLocator\Components\ContactForm\ContactForm;
  5. use NetInventors\NetiNextStoreLocator\Core\Content\Store\StoreEntity;
  6. use NetInventors\NetiNextStoreLocator\Service\PluginConfig;
  7. use NetInventors\NetiNextStoreLocator\Service\PluginConfigFactory;
  8. use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface;
  9. use NetInventors\NetiNextStoreLocator\Service\StoreBusinessHoursService;
  10. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  13. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  14. use Shopware\Core\System\SystemConfig\SystemConfigService;
  15. use Shopware\Storefront\Page\GenericPageLoader;
  16. use Shopware\Storefront\Page\MetaInformation;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  19. class StoreDetailPageLoader
  20. {
  21.     /**
  22.      * @var GenericPageLoader
  23.      */
  24.     private $genericLoader;
  25.     /**
  26.      * @var StoreDetailLoader
  27.      */
  28.     private $storeDetailLoader;
  29.     /**
  30.      * @var SystemConfigService
  31.      */
  32.     private $systemConfig;
  33.     /**
  34.      * @var EntityRepositoryInterface
  35.      */
  36.     private $mediaRepository;
  37.     /**
  38.      * @var ContactForm
  39.      */
  40.     private $contactForm;
  41.     /**
  42.      * @var CmsPageRenderer
  43.      */
  44.     private $cmsPageRenderer;
  45.     /**
  46.      * @var EventDispatcherInterface
  47.      */
  48.     private                                   $eventDispatcher;
  49.     private SeoUrlPlaceholderHandlerInterface $seoUrlReplacer;
  50.     private string                            $shopwareVersion;
  51.     private StoreBusinessHoursService         $businessHoursService;
  52.     public function __construct(
  53.         GenericPageLoader                 $genericLoader,
  54.         StoreDetailLoader                 $storeDetailLoader,
  55.         SystemConfigService               $systemConfig,
  56.         EntityRepositoryInterface         $mediaRepository,
  57.         ContactForm                       $contactForm,
  58.         CmsPageRenderer                   $cmsPageRenderer,
  59.         EventDispatcherInterface          $eventDispatcher,
  60.         SeoUrlPlaceholderHandlerInterface $seoUrlReplacer,
  61.         string                            $shopwareVersion,
  62.         StoreBusinessHoursService         $businessHoursService
  63.     ) {
  64.         $this->genericLoader        $genericLoader;
  65.         $this->storeDetailLoader    $storeDetailLoader;
  66.         $this->systemConfig         $systemConfig;
  67.         $this->mediaRepository      $mediaRepository;
  68.         $this->contactForm          $contactForm;
  69.         $this->cmsPageRenderer      $cmsPageRenderer;
  70.         $this->eventDispatcher      $eventDispatcher;
  71.         $this->seoUrlReplacer       $seoUrlReplacer;
  72.         $this->shopwareVersion      $shopwareVersion;
  73.         $this->businessHoursService $businessHoursService;
  74.     }
  75.     public function load(Request $requestSalesChannelContext $context): StoreDetailPage
  76.     {
  77.         $page $this->genericLoader->load($request$context);
  78.         /** @var StoreDetailPage $page */
  79.         $page StoreDetailPage::createFrom($page);
  80.         /** @var string|null $storeId */
  81.         $storeId $request->attributes->get('id');
  82.         if (!$storeId) {
  83.             throw new MissingRequestParameterException('id''/id');
  84.         }
  85.         /** @var StoreEntity $store */
  86.         $store $this->storeDetailLoader->load($storeId$context);
  87.         $page->setStore($store);
  88.         $config $this->getConfig($context);
  89.         $page->setConfig($config);
  90.         $translated $store->getTranslated();
  91.         $metaInfoInformation $page->getMetaInformation();
  92.         if ($metaInfoInformation instanceof MetaInformation) {
  93.             $metaInfoInformation->setMetaTitle((string) ($translated['seoTitle'] ?? $store->getLabel()));
  94.             if (!\is_string($translated['seoDescription'])) {
  95.                 $translated['seoDescription'] = '';
  96.             }
  97.             $metaInfoInformation->setMetaDescription($translated['seoDescription']);
  98.             $metaInfoInformation->assign(['canonical' => $this->seoUrlReplacer->generate('frontend.store_locator.detail', ['id' => $storeId])]);
  99.         }
  100.         $contactFormFields $this->contactForm->getFields($context);
  101.         $page->setContactFormFields($contactFormFields);
  102.         $contactSubjectOptions $this->getContactSubjectOptions($config);
  103.         $page->setContactSubjectOptions($contactSubjectOptions);
  104.         $page->setStoreBusinessHours($this->businessHoursService->getStoreBusinessHours($storeId$context->getContext()));
  105.         $page->setWeekDays($this->businessHoursService->getBusinessWeekdays($context->getContext()));
  106.         $timeZone $store->getTimezone() ?: $request->cookies->get('timezone');
  107.         if (\is_string($timeZone)) {
  108.             $time = new \DateTime(
  109.                 'now',
  110.                 new \DateTimeZone($timeZone)
  111.             );
  112.             
  113.             $page->setIsStoreOpen($this->businessHoursService->isStoreOpen($time$storeId$context->getContext()));
  114.         }
  115.         if (!\is_string($translated['detailDescription'])) {
  116.             $translated['detailDescription'] = '';
  117.         }
  118.         switch ($store->getDetailContentType()) {
  119.             case StoreEntity::CONTENT_TYPE_HTML:
  120.                 $page->setHtmlContent(
  121.                     $translated['detailDescription']
  122.                 );
  123.                 break;
  124.             case StoreEntity::CONTENT_TYPE_CMS:
  125.                 $page->setHtmlContent(
  126.                     $this->cmsPageRenderer->build(
  127.                         $request,
  128.                         $context,
  129.                         $store->getCmsPage()
  130.                     )
  131.                 );
  132.                 break;
  133.         }
  134.         $this->eventDispatcher->dispatch(new StoreDetailPageLoadedEvent($page$context$request));
  135.         return $page;
  136.     }
  137.     private function getConfig(SalesChannelContext $context): array
  138.     {
  139.         $config = (array)$this->systemConfig->get(PluginConfigFactory::CONFIG_DOMAIN$context->getSalesChannel()->getId());
  140.         foreach ($config as $key => $value) {
  141.             unset ($config[$key]);
  142.             switch ($key) {
  143.                 case 'googleMapIcon':
  144.                     $mediaId = (string) $value;
  145.                     if (!empty($mediaId)) {
  146.                         /**
  147.                          * @psalm-suppress MixedArgumentTypeCoercion
  148.                          *
  149.                          * This is the correct way to search for a specific ID
  150.                          */
  151.                         $criteria = new Criteria([ $mediaId ]);
  152.                         $result   $this->mediaRepository->search($criteria$context->getContext());
  153.                         if ($result->count() > 0) {
  154.                             $value $result->first()->getUrl();
  155.                         } else {
  156.                             throw new \Exception('The given mediaId does not exist.');
  157.                         }
  158.                     }
  159.                     break;
  160.                 case 'googleMapIconSize':
  161.                     if (!empty($value)) {
  162.                         if (!preg_match('/^([0-9]+)x([0-9]+)$/'$value)) {
  163.                             throw new \Exception('The given icon size "' $value '" is invalid.');
  164.                         }
  165.                         [ $width$height ] = array_map('intval'explode('x'$value));
  166.                         $value compact('width''height');
  167.                     }
  168.                     break;
  169.             }
  170.             $config[$key] = $value;
  171.         }
  172.         $config['_cookieConsentEnabled'] = version_compare($this->shopwareVersion'6.4.12.0''<')
  173.             ?: $this->systemConfig->get('core.basicInformation.useDefaultCookieConsent');
  174.         return $config;
  175.     }
  176.     private function getContactSubjectOptions(array $config): array
  177.     {
  178.         $options $config['contactSubjectOptions'] ?? '';
  179.         $options trim($options);
  180.         if (empty($options)) {
  181.             return [];
  182.         }
  183.         return explode(PHP_EOL$options);
  184.     }
  185. }