src/WebBundle/Controller/SliderController.php line 103

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Controller;
  3. use Exception;
  4. use FlexApp\Service\LastUrlService;
  5. use Import1CBundle\Helper\v3\BiConst;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  11. use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use WebBundle\Enum\CollectionAndFactoryStateEnum;
  14. use WebBundle\Exception\ArticleNotAvailableNowException;
  15. use WebBundle\Filler\MessageFiller;
  16. use WebBundle\Helper\App;
  17. use WebBundle\Helper\LocaleHelper;
  18. use WebBundle\Helper\PathHelper;
  19. use WebBundle\Helper\RedirectHelper;
  20. use WebBundle\Helper\SearchLogHelper;
  21. use WebBundle\Helper\UrlHelper;
  22. use WebBundle\Helper\UserHelper;
  23. use WebBundle\Repository\BuyOrderRepository;
  24. use WebBundle\Repository\CollectionRepository;
  25. use WebBundle\Repository\InteriorRepository;
  26. use WebBundle\Repository\PublicationRepository;
  27. use WebBundle\Service\CollectionService;
  28. use WebBundle\Service\ReviewsService;
  29. use WebBundle\Service\SampleService;
  30. use WebBundle\Service\SliderService;
  31. /**
  32.  * Работа слайдера
  33.  * коллекция опубликована,
  34.  * вызов из коллекции, вызывается 5 слайдов - 0, -2, +2, для крайних уменьшается до 0, игнорируются снятые слайды
  35.  * вызов из би - вызывается 5 слайдов аналогично, снятые игнорируются
  36.  * прямой вызов - вызвается 5 слайдов, снятые игнорируются
  37.  * прямой вызов снятого - вызвается 1 слайд
  38.  * при перелистываении подгружается крайний +-1 слайд
  39.  *
  40.  * коллекция неопубликована - слайдер заблокирован для всех случаев
  41.  *
  42.  * коллекция снята -
  43.  * только прямой вызов по одному слайду
  44.  *
  45.  * коллекция импортирована
  46.  * вызвается 5 слайдов аналогично
  47.  * прямой вызов - 5 слайдов
  48.  *
  49.  * Коллекция на проверке
  50.  * вызывается 5 слайдов аналогично
  51.  * collection controller.
  52.  */
  53. class SliderController extends ExtendedController
  54. {
  55.     /** @required */
  56.     public BuyOrderRepository $buyOrderRepository;
  57.     /** @required */
  58.     public PublicationRepository $publicationRepository;
  59.     /** @required */
  60.     public CollectionRepository $collectionRepository;
  61.     /** @required */
  62.     public InteriorRepository $interiorRepository;
  63.     /** @required */
  64.     public CollectionService $collectionService;
  65.     /** @required */
  66.     public ReviewsService $reviewsService;
  67.     /** @required */
  68.     public SampleService $sampleService;
  69.     /** @required */
  70.     public SliderService $sliderService;
  71.     /** @required */
  72.     public MessageFiller $messageFiller;
  73.     /** @required */
  74.     public LastUrlService $lastUrlService;
  75.     private AuthorizationChecker $authorizationChecker;
  76.     private TranslatorInterface $translator;
  77.     public function __construct(
  78.         AuthorizationChecker $authorizationChecker,
  79.         TranslatorInterface $translator
  80.     ) {
  81.         parent::__construct();
  82.         $this->authorizationChecker $authorizationChecker;
  83.         $this->translator $translator;
  84.     }
  85.     /**
  86.      * @param Request $request
  87.      * @param $factoryUrl
  88.      * @param $collectionUrl
  89.      * @param $type
  90.      * @param $elementId
  91.      * @return Response
  92.      * @throws Exception|\Doctrine\DBAL\Driver\Exception
  93.      */
  94.     public function indexAction(Request $request$factoryUrl$collectionUrl$type$elementId)
  95.     {
  96.         // проверка переноса фабрики
  97.         if ($iNeedRedirect RedirectHelper::checkRedirect($factoryUrl$collectionUrl$type$elementId)) {
  98.             return $this->redirect(
  99.                 $this->generateUrl(
  100.                     'app_collection',
  101.                     $iNeedRedirect->getArrayForRedirect()
  102.                 )
  103.             );
  104.         }
  105.         $token UserHelper::getInstance()->getToken();
  106.         $collection $this->collectionRepository->getSlideCollection($factoryUrl$collectionUrl);
  107.         // проверка на сменный URL коллекции
  108.         if (!$collection) {
  109.             $redirect $this->lastUrlService->getSliderRedirectUrl($collectionUrl$factoryUrl$type$elementId);
  110.             if ($redirect) {
  111.                 return new RedirectResponse($redirect);
  112.             }
  113.         }
  114.         if (!$collection) {
  115.             throw $this->createNotFoundException('Element not found');
  116.         }
  117.         $isCollectionStatus in_array(
  118.             $collection['status'],
  119.             [CollectionAndFactoryStateEnum::STATE_DISCONTINUEDCollectionAndFactoryStateEnum::STATE_WORK_CONTINUED]
  120.         );
  121.         // Закрываем доступ для еще не опубликованных коллекций
  122.         if (
  123.             !in_array(
  124.                 $collection['status'],
  125.                 [CollectionAndFactoryStateEnum::STATE_PUBLISHEDCollectionAndFactoryStateEnum::STATE_DISCONTINUEDCollectionAndFactoryStateEnum::STATE_WORK_CONTINUED]
  126.             )
  127.             && !$this->authorizationChecker->isGranted('ROLE_ADMIN')
  128.         ) {
  129.             throw $this->createNotFoundException('Slide not found');
  130.         }
  131.         $msg $this->collectionService->getAlertMessageIfCollectionInDiscontinuedState($collection);
  132.         if ($msg !== null) {
  133.             return $this->crushBecauseItsNotAvailableNow($msg$elementId$type$request);
  134.         }
  135.         $isBiFreezed $request->get('is_freezed');
  136.         $isFactoryStatus in_array(
  137.             $collection['factory']['status'],
  138.             [CollectionAndFactoryStateEnum::STATE_DISCONTINUEDCollectionAndFactoryStateEnum::STATE_WORK_CONTINUED]
  139.         );
  140.         $isFreezed = ($isBiFreezed !== null) ? (bool) $isBiFreezed $isCollectionStatus || $isFactoryStatus;
  141.         $suspended $isCollectionStatus || $isFactoryStatus;
  142.         $pathData = [
  143.             'factoryUrl' => $collection['factory']['url'],
  144.             'collectionUrl' => $collection['url'],
  145.             'file' => '%img%',
  146.         ];
  147.         try {
  148.             $data $this->sliderService->getData($request$token$type$collection$elementId);
  149.         } catch (ArticleNotAvailableNowException $_) {
  150.             $url $this->generateUrl('app_catalog', ['key' => $collection['url']]);
  151.             $msg $this->messageFiller->getMessageForDiscontinuedArticle($collection['name'], $url);
  152.             return $this->crushBecauseItsNotAvailableNow($msg$elementId$type$request);
  153.         }
  154.         if (!empty($data['redirect'])) {
  155.             return new RedirectResponse($data['redirect'], 301);
  156.         }
  157.         if (
  158.             (count($data['elements']) === && $type !== 'i')
  159.             || $data['elementId'] === null
  160.         ) {
  161.             throw new NotFoundHttpException('The element is not found or it has the column "file" is null');
  162.         }
  163.         $countryUrl $this->sliderService->getCountryUrl($collection);
  164.         // Специальная ссылка на блог
  165.         $blog $this->publicationRepository->find(PublicationController::BLOG_ABOUT_SAMPLE_ID);
  166.         $qr $this->sampleService->getQr($request$type$data$collection$isFreezed);
  167.         $reviews $this->reviewsService->getReviewByCollection($collection['code']);
  168.         $output = [
  169.             'windowSizes' => json_decode($request->cookies->get('windowSizes''{}'), true),
  170.             'filters' => $this->getGoogleRefererInfo(),
  171.             'qr' => $qr,
  172.             'msg' => null,
  173.             'elements' => $data['elements'],
  174.             'elementsCount' => $data['elementsCount'],
  175.             'elementId' => $data['elementId'],
  176.             'number' => $data['numberElement'],
  177.             'type' => $type,
  178.             'suspended' => $suspended,
  179.             'dataNoRegular' => $collection['factory']['suspended'],
  180.             'buyOrderArticles' => $this->buyOrderRepository->getInfoBuyOrderArticle($token),
  181.             'userCountry' => App::getCurCountry(),
  182.             'userLocale' => App::getCurLocale(),
  183.             'currency' => LocaleHelper::getCurrency(LocaleHelper::getCur()),
  184.             'measureGb' => LocaleHelper::measureGb(),
  185.             'vatPercent' => LocaleHelper::includeVATAlways(),
  186.             'urls' => [
  187.                 'settings' => App::generateUrl('app_article_settings', ['id' => 0]),
  188.                 'collection' => App::generateUrl(
  189.                     'app_collection',
  190.                     ['factoryUrl' => '%factory%''collectionUrl' => '%collection%']
  191.                 ),
  192.                 'factory' => App::generateUrl('app_catalog', ['key' => '%factory%']),
  193.                 'country' => $countryUrl,
  194.                 'ideas' => App::generateUrl('app_ideas_list', ['id' => '%id%']),
  195.                 'pathImg' => [
  196.                     'item' => PathHelper::pathGenerate('article'$pathData),
  197.                     'interior' => PathHelper::pathGenerate('interior'$pathData),
  198.                 ],
  199.                 'fastDeliverySamplesUrl' => UrlHelper::genUrlBlogSingle($blog),
  200.                 'mainPic' => PathHelper::pathGenerate('main'$collection),
  201.             ],
  202.             'stateNotTime' => CollectionAndFactoryStateEnum::STATE_NOT_TIME,
  203.             'statePublished' => CollectionAndFactoryStateEnum::STATE_PUBLISHED,
  204.             'stateDiscontinued' => CollectionAndFactoryStateEnum::STATE_DISCONTINUED,
  205.             'stateProcessing' => CollectionAndFactoryStateEnum::STATE_PROCESSING,
  206.             'isWithoutVATPrice' => LocaleHelper::isWithoutVATPrice(10) !== false,
  207.             'isFreezed' => $isFreezed,
  208.             'closed' => ($collection['status'] == CollectionAndFactoryStateEnum::STATE_DISCONTINUED
  209.                 $this->translator->trans('collection_unavailable_freezed_desc')
  210.                 : ($collection['status'] == CollectionAndFactoryStateEnum::STATE_PROCESSING
  211.                     $this->translator->trans('collection_unavailable')
  212.                     : ''
  213.                 )),
  214.             'closedHelp' => $collection['status'] == CollectionAndFactoryStateEnum::STATE_PROCESSING
  215.                 $this->translator->trans('collection_unavailable_manufacture_desc')
  216.                 : '',
  217.             'trans' => [
  218.                 'orderHelp' => $this->translator->trans('buyOrder.help'),
  219.                 'collectionCeilToPallet' => $this->translator->trans('collection_ceil_to_pallet'),
  220.                 'popupAutoChangeCountArts' => $this->translator->trans('popup_auto_change_count_arts'),
  221.                 'collectionAtentionPallet' => $this->translator->trans('collection_atention_pallet'),
  222.                 'articleTypeSample' => $this->translator->trans('article.type.sample'),
  223.                 'collection_Article' => $this->translator->trans('collection_article'),
  224.                 'collection_Interior' => $this->translator->trans('collection_interior'),
  225.                 'collectionName' => $this->translator->trans('collection_name'),
  226.                 'catalogFactory' => $this->translator->trans('catalog_factory'),
  227.                 'articleCharacteristics' => $this->translator->trans('article_characteristics'),
  228.                 'articleItemFormats' => $this->translator->trans('article_item_formats'),
  229.                 'itemDifferentPatterns' => $this->translator->trans('item_different_patterns'),
  230.                 'itemVariationsOfGraphics' => $this->translator->trans('item_variations_of_graphics'),
  231.                 'vatLabel' => $this->translator->trans('vat.label'),
  232.                 'vatIncluded' => $this->translator->trans('vat.included'),
  233.                 'catalogPrice' => $this->translator->trans('catalog_price'),
  234.                 'articleDiscountinued' => $this->translator->trans('article.discountinued'),
  235.                 'collectionBack' => $this->translator->trans('collection_back'),
  236.                 'commentAddQuestion' => $this->translator->trans('comment_add_question'),
  237.                 'articleInStock' => $this->translator->trans('article_in_stock'),
  238.                 'item' => [
  239.                     'collection' => $this->translator->trans('collection_name'),
  240.                     'factory' => $this->translator->trans('catalog_factory'),
  241.                     'characteristics' => $this->translator->trans('article_characteristics'),
  242.                     'header' => $this->translator->trans('collection_articles_d'),
  243.                     'formats' => $this->translator->trans('article_item_formats'),
  244.                     'cm' => $this->translator->trans('left_menu_cm'),
  245.                     'translated_by_google' => $this->translator->trans('translated_by_google'),
  246.                     'show_translate' => $this->translator->trans('show_translate'),
  247.                     'show_original' => $this->translator->trans('show_original'),
  248.                     'all_specifications' => $this->translator->trans('all_specifications'),
  249.                     'inch' => '″',
  250.                     'diameter' => $this->translator->trans('article_item_diameter'),
  251.                     'pcs' => $this->translator->trans('measure_unit'),
  252.                     'pcsPlural' => $this->translator->trans('measure_units'),
  253.                     'set' => $this->translator->trans('measure_set'),
  254.                     'sets' => $this->translator->trans('measure_sets'),
  255.                     'settings' => $this->translator->trans('collection_marks'),
  256.                     'someSettings' => $this->translator->trans('article_characteristics'),
  257.                     'allSettings' => $this->translator->trans('all'),
  258.                     'price' => $this->translator->trans('catalog_price'),
  259.                     'vat' => [
  260.                         'label' => $this->translator->trans('vat.label'),
  261.                         'included' => $this->translator->trans('vat.included'),
  262.                         'excluded' => $this->translator->trans('vat.excluded'),
  263.                     ],
  264.                     'info' => $this->translator->trans('article_item_more_info'),
  265.                     'infoLess' => $this->translator->trans('article_item_less_info'),
  266.                     'order' => [
  267.                         'help' => $this->translator->trans('buyOrder.help'),
  268.                         'ceilToPallet' => $this->translator->trans('collection_ceil_to_pallet'),
  269.                         'atentionPallet' => $this->translator->trans('collection_atention_pallet'),
  270.                         'popupAutoChangeCountArts' => $this->translator->trans('popup_auto_change_count_arts'),
  271.                     ],
  272.                     'up' => $this->translator->trans('article.price.up'),
  273.                     'down' => $this->translator->trans('article.price.down'),
  274.                     'readMore' => $this->translator->trans('read_more'),
  275.                     'titleAddedArticle' => $this->translator->trans('buyOrder.titleAddedArticle'),
  276.                     'addIntoOrder' => $this->translator->trans('buy_order.add_into_order'),
  277.                     'headerOrderAdd' => $this->translator->trans('header_order_add'),
  278.                     'draft' => $this->translator->trans('order.status.draft'),
  279.                     'typeMain' => $this->translator->trans('article.type.main'),
  280.                     'typeSample' => $this->translator->trans('article.type.sample'),
  281.                     'sampleText' => $this->translator->trans('article.type.sampleText'),
  282.                     'typeCompare' => $this->translator->trans('article.type.compare'),
  283.                     'compareText' => $this->translator->trans('article.type.compareText'),
  284.                     'type3d' => $this->translator->trans('article.type.3d'),
  285.                     'text3d' => $this->translator->trans('article.type.3dText'),
  286.                     'articleOrderOver' => $this->translator->trans('article.order.over'),
  287.                     'articlePricePerPallet' => $this->translator->trans('article.price.perPallet'),
  288.                     'articlePriceNoLessPallet' => $this->translator->trans('article.price.noLessPallet'),
  289.                     'articlePricePalleteFrom' => $this->translator->trans('article.pricePallete.from'),
  290.                     'articlePriceFrom' => $this->translator->trans('article.price.from'),
  291.                     'articlePricePalleteUnder' => $this->translator->trans('article.pricePallete.under'),
  292.                     'articlePriceFromTo' => $this->translator->trans('article.price.from_to'),
  293.                     'articleOrderMultiplies' => $this->translator->trans('article.order.multiplies'),
  294.                     'highResolutionImageDownload' => $this->translator->trans('image_download_high_resolution'),
  295.                     'boxArticleSingle' => $this->translator->trans('box_article_single'),
  296.                     'boxArticlePlural' => $this->translator->trans('box_article_plural'),
  297.                     'articleNoImgTitle' => $this->translator->trans('article.no_img'),
  298.                     'collectionAddOrder' => $this->translator->trans('collection_add_order'),
  299.                     'tempNoUKShippingMsg' => $this->translator->trans('msg.uk'),
  300.                     'discountinued' => $this->translator->trans('article.discountinued'),
  301.                     'tempUnavailable' => $this->translator->trans('article.temp_unavailable'),
  302.                 ],
  303.                 'sample' => [
  304.                     'folder' => $this->translator->trans('sample.folder.text'),
  305.                     'original' => $this->translator->trans('sample.original.text'),
  306.                     'piece' => $this->translator->trans('sample.piece.text'),
  307.                     'title' => $this->translator->trans('samplePopup.title'),
  308.                     'noMoreShow' => $this->translator->trans('samplePopup.noMoreShow'),
  309.                     'withDecl' => $this->translator->trans('article.type.sampleWithDecl'),
  310.                     'alreadyAdded' => $this->translator->trans('sample_already_added.header'),
  311.                     'fitsForItems' => $this->translator->trans('fits_for_items'),
  312.                 ],
  313.                 'reviews' => [
  314.                     'heading' => $this->translator->trans('collection_customer_reviews'),
  315.                     'validUser' => $this->translator->trans('product_validUser'),
  316.                     'reply' => $this->translator->trans('reply_comment'),
  317.                     'edit' => $this->translator->trans('edit'),
  318.                     'save' => $this->translator->trans('save'),
  319.                     'cancel' => $this->translator->trans('cancel'),
  320.                     'stars' => $this->translator->trans('reviews.stars.many'),
  321.                     'pluralForms' => $this->translator->trans('review.plural_forms'),
  322.                 ],
  323.                 'box' => $this->translator->trans('measure_box'),
  324.                 'boxes' => $this->translator->trans('boxes'),
  325.                 'collectionNotRegular' => $this->translator->trans('collection.notRegular'),
  326.                 'collectionBy' => $this->translator->trans('collection_by'),
  327.                 'ideaDelInteriorMsg' => $this->translator->trans('idea_del_interior_msg'),
  328.                 'ideaYes' => $this->translator->trans('idea_yes'),
  329.                 'ideaNo' => $this->translator->trans('idea_no'),
  330.                 'ideaMsgAdded' => $this->translator->trans('idea_msg_added'),
  331.                 'ideaMsgNormal' => $this->translator->trans('idea_msg_normal'),
  332.                 'ideaMsgNormalMany' => $this->translator->trans('idea_msg_normal_many'),
  333.                 'ideaMsgNormalZero' => $this->translator->trans('idea_msg_normal_zero'),
  334.                 'articleItemDiameter' => $this->translator->trans('article_item_diameter'),
  335.                 'leftMenuCm' => $this->translator->trans('left_menu_cm'),
  336.                 'leftMenuInch' => '″',
  337.                 'sampleFolderText' => $this->translator->trans('sample.folder.text'),
  338.                 'sampleOriginalText' => $this->translator->trans('sample.original.text'),
  339.                 'samplePieceText' => $this->translator->trans('sample.piece.text'),
  340.                 'unavailableFreezedDescArticle' => $this->translator->trans('collection_unavailable_freezed_desc_article'),
  341.                 'discountinued' => $this->translator->trans('article.discountinued'),
  342.                 'articleInInterior' => $this->translator->trans('article_in_interior'),
  343.                 'factoryCountry' => $this->translator->trans($collection['factory']['country']['alias']),
  344.                 'collectionIdeasShort' => $this->translator->trans('collection_ideas_short'),
  345.             ],
  346.             'reviews' => [
  347.                 'data' => $reviews,
  348.                 'urls' => [
  349.                     'preDataCollectionReviewsUrl' => App::generateUrl(
  350.                         'pre_data_collection_reviews',
  351.                         ['id' => $collection['id']]
  352.                     ),
  353.                     'collectionReviewsUrl' => App::generateUrl('collection_reviews', ['id' => $collection['id']]),
  354.                 ],
  355.             ],
  356.         ];
  357.         $imagePreload null;
  358.         if (!empty($output['elements'][$output['elementId']]['pathImg'])) {
  359.             $imagePreload $output['elements'][$output['elementId']]['pathImg'];
  360.         }
  361.         SearchLogHelper::save([
  362.             'url' => $request->getUri(),
  363.             'title' => $data['elements'][$data['elementId']]['title'] ?? 'empty interior',
  364.         ]);
  365.         if ($request->get('only-slider')) {
  366.             return new JsonResponse(['slider' => $output]);
  367.         } else {
  368.             $art $data['elements'][$data['elementId']];
  369.             if ($type == 'i') {
  370.                 $art = !empty($art['articles'][0]) ? $art['articles'][0] : null;
  371.             }
  372.             $isShowReview $collection['status'] == BiConst::STATE_PUBLISHED && LocaleHelper::getPrMin($collection) > 0;
  373.             return $this->renderReact('@Web/Slider/index.html.twig', [
  374.                 'imagePreload' => $imagePreload,
  375.                 'metaData' => [
  376.                     'title' => $data['elements'][$data['elementId']]['title'],
  377.                     'description' => $data['elements'][$data['elementId']]['description'],
  378.                     'keyword' => '',
  379.                 ],
  380.                 //для динамического ремаркетинга
  381.                 'ecommProdid' => $data['elementId'],
  382.                 'ecommTotalvalue' => $art LocaleHelper::getPrice($art) : 0,
  383.                 'initialState' => ['slider' => $output'reviews' => $isShowReview $reviews : []],
  384.             ]);
  385.         }
  386.     }
  387.     /**
  388.      * @param Request $request
  389.      * @param string $factoryUrl
  390.      * @param string $collectionUrl
  391.      * @param string $type
  392.      * @param string|int $elementId
  393.      * @param ?string $load
  394.      * @return Response
  395.      * @throws Exception|\Doctrine\DBAL\Driver\Exception
  396.      */
  397.     public function slideAction(
  398.         Request $request,
  399.         string $factoryUrl,
  400.         string $collectionUrl,
  401.         string $type,
  402.         $elementId,
  403.         ?string $load 'all'
  404.     ) {
  405.         $token UserHelper::getInstance()->getToken();
  406.         $collection $this->collectionRepository->getSlideCollection($factoryUrl$collectionUrl);
  407.         if (!$collection) {
  408.             throw $this->createNotFoundException('The collection is not found');
  409.         }
  410.         $data $this->sliderService->getData($request$token$type$collection$elementId$load);
  411.         return new JsonResponse(['elements' => $data['elements']]);
  412.     }
  413.     private function getGoogleRefererInfo(): bool
  414.     {
  415.         if (
  416.             stripos($_SERVER['HTTP_REFERER'] ?? '''google.') !== false
  417.             && stripos($_SERVER['HTTP_REFERER'] ?? '''mail.google.') === false
  418.         ) {
  419.             return true;
  420.         }
  421.         if (
  422.             !empty($_GET['utm_source'])
  423.         ) {
  424.             return true;
  425.         }
  426.         // https://te2.remote.team/discus/DA0E211E-CD52-A435-805A-0039E39A2954
  427.         if (stripos($_SERVER['HTTP_REFERER'] ?? '''googleadservices.') !== false) {
  428.             return true;
  429.         }
  430.         // https://te2.remote.team/discus/D058F322-78AA-AEBE-9D88-B2B9B077677C
  431.         if (empty($_SERVER['HTTP_REFERER'])) {
  432.             return true;
  433.         }
  434.         return false;
  435.     }
  436.     /**
  437.      * @param array $msg
  438.      * @param $elementId
  439.      * @param $type
  440.      * @param Request $request
  441.      * @return JsonResponse|Response
  442.      * @throws Exception
  443.      */
  444.     private function crushBecauseItsNotAvailableNow(array $msg, ?string $elementId, ?string $typeRequest $request)
  445.     {
  446.         $slider = ['msg' => $msg'elementId' => $elementId'elements' => [$elementId => ['artImgSrc' => null]], 'type' => $type];
  447.         if ($request->get('only-slider')) {
  448.             return new JsonResponse(['slider' => $slider]);
  449.         }
  450.         $state = [
  451.             'metaData' => [
  452.                 'title' => $msg['header'],
  453.                 'description' => $msg['body'],
  454.                 'keyword' => '',
  455.             ],
  456.             'initialState' => ['slider' => $slider],
  457.         ];
  458.         return $this->renderReact('@Web/Slider/index.html.twig'$state);
  459.     }
  460. }