src/Controller/DefaultController.php line 112

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Maileon\MaileonService;
  4. use App\Website\LinkGenerator\ProspexEventLinkGenerator;
  5. use Doctrine\Common\Collections\Criteria;
  6. use Exception;
  7. use Carbon\Carbon;
  8. use App\Traits\SiteAware;
  9. use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
  10. use Pimcore\Model\DataObject;
  11. use App\Form\Type\ContactType;
  12. use App\Service\MailerService;
  13. use Pimcore\Model\Document\Snippet;
  14. use Pimcore\Model\Element\Tag;
  15. use App\Helpers\HelperFunctions;
  16. use App\Service\WishListService;
  17. use Pimcore\Model\Document\Page;
  18. use Pimcore\Model\DataObject\News;
  19. use App\Traits\VerifyPreviewRequest;
  20. use App\Traits\BreadcrumbForDocument;
  21. use Doctrine\DBAL\Query\QueryBuilder;
  22. use Pimcore\Model\DataObject\Contact;
  23. use Pimcore\Controller\FrontendController;
  24. use Pimcore\Model\DataObject\CoreShopUser;
  25. use Pimcore\Model\DataObject\NewsCategory;
  26. use Knp\Component\Pager\PaginatorInterface;
  27. use Pimcore\Model\DataObject\CoreShopProduct;
  28. use Psr\Container\NotFoundExceptionInterface;
  29. use Symfony\Component\HttpFoundation\Request;
  30. use Pimcore\Model\Search;
  31. use Pimcore\Model\Search\Backend\Data\Listing;
  32. use Psr\Container\ContainerExceptionInterface;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Pimcore\Twig\Extension\Templating\HeadMeta;
  35. use Symfony\Component\Routing\Annotation\Route;
  36. use Pimcore\Twig\Extension\Templating\Placeholder;
  37. use Pimcore\Http\Request\Resolver\DocumentResolver;
  38. use Symfony\Contracts\Translation\TranslatorInterface;
  39. use App\Website\LinkGenerator\NewsCategoryLinkGenerator;
  40. use Pimcore\Bundle\AdminBundle\HttpFoundation\JsonResponse;
  41. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  42. class DefaultController extends FrontendController
  43. {
  44.     use VerifyPreviewRequest;
  45.     use BreadcrumbForDocument;
  46.     use SiteAware;
  47.     protected $specifications;
  48.     protected $properties;
  49.     protected $maxNumberOfComparedProducts;
  50.     private string $googleApiKey;
  51.     /**
  52.      * @param Request $request
  53.      * @return Response
  54.      * @Route("/coreshop_index", name="coreshop_index")
  55.      * coreshop defautl route overwrite
  56.      */
  57.     public function coreshopIndexAction(Request $request): Response
  58.     {
  59.         return $this->redirectToRoute('profil');
  60.     }
  61.     /**
  62.      * @param Request $request
  63.      * @return void
  64.      * @Route("/t", name="teszt_action")
  65.      */
  66.     public function tesztAction(Request $request)
  67.     {
  68.         $list = new \Pimcore\Model\DataObject\News\Listing();
  69.         $list->onCreateQueryBuilder(
  70.             function (\Doctrine\DBAL\Query\QueryBuilder $queryBuilder) use ($list) {
  71. //                $queryBuilder->andWhere('title IN (\':val\')');
  72. //                $queryBuilder->setParameter('1', ['asdas', 'asdas', 'asdasd'], \Doctrine\DBAL\Connection::PARAM_STR_ARRAY );
  73.                 $queryBuilder->andWhere('title IN (\':val\')');
  74.                 $queryBuilder->setParameter('val', ['asdas''asdas''asdasd']);
  75.             }
  76.         );
  77.         $list->load();
  78.         return new Response();
  79.         $folder DataObject::getById(1);
  80.         $folder->getDao();
  81.         $qb = new QueryBuilder($folder->getDao()->db);
  82.         $qb->select('p')
  83.             ->from('object_cs_product''p');
  84. //        $qb->andWhere('typeofwatch = ?1');
  85.         $qb->andWhere(
  86.             $qb->expr()->in('typeofwatch', array(':asd'))
  87.         );
  88.         $qb->setParameter(':asd', ['asd''asdasd''asddas''asasd'], \Doctrine\DBAL\Types\Types::STRING);
  89.         $sql $qb->getSQL();
  90. //        $a = $qb->
  91.         return new Response();
  92.     }
  93.     /**
  94.      * checks the site requires login
  95.      * function call: if($this->needLoginCheck()) return $this->needLoginCheck();
  96.      */
  97.     function needLoginCheck()
  98.     {
  99.         if (!$this->editmode && $this->document->getProperty("needLogin")) {
  100.             if (!$this->getUser()) {
  101.                 $this->addFlash('warning'$this->document->getProperty("needLoginMessage"));
  102.                 return $this->forward('CoreShop\Bundle\FrontendBundle\Controller\RegisterController::registerAction');
  103.             }
  104.         }
  105.     }
  106.     /**
  107.      * @param Request $request
  108.      * @return Response
  109.      */
  110.     public function defaultAction(Request $requestPlaceholder $placeholder): Response
  111.     {
  112.         if (!$this->document instanceof Snippet && $this->needLoginCheck()) {
  113.             return $this->needLoginCheck();
  114.         }
  115.         if ($this->document instanceof Page && $this->document->getFullPath() != '/') {
  116.             $bc[] = [
  117.                 'title' => 'Főoldal',
  118.                 'path' => '/'
  119.             ];
  120.             $bc[] = [
  121.                 'title' => $this->document->getTitle(),
  122.                 'path' => null
  123.             ];
  124.             $placeholder('breadcrumbNews')->set($bc);
  125.         }
  126.         $response $this->render($this->document->getTemplate() ?? 'default/home.html.twig', [
  127.             'site' => $this->site,
  128.             'mainpage' => true,
  129.             'sclub' => $request->get('sclub'),
  130.             'clubsite' => $this->isSite('club'),
  131.             'boutiqueHost' => $this->getBoutiqueHost()
  132.         ]);
  133.         return $response->getStatusCode() !== 200 && $request->get('ignore_errors') === true ? new Response() : $response;
  134.     }
  135.     /**
  136.      * @return Response
  137.      * @Route("/compare_table", name="compare_table", methods={"GET"})
  138.      */
  139.     public function compareTableAction(Request $requestTranslatorInterface $translator): Response
  140.     {
  141.         if (!$request->isXMLHttpRequest()) {
  142.             return $this->redirect("/");
  143.         }
  144.         $session $request->getSession();
  145.         if ($session->has('compareProduct')) {
  146.             $compareProductItems $session->get('compareProduct');
  147.         } else {
  148.             $compareProductItems = [];
  149.         }
  150.         if (empty($compareProductItems) || count($compareProductItems) === 0) {
  151.             $compareProductItems = [];
  152.         }
  153.         $entries = new DataObject\CoreShopProduct\Listing();
  154.         $entries->setCondition("oo_id IN (?)", [array_keys($compareProductItems)]);
  155.         $compareProductItems = [];
  156.         foreach ($entries as $entry) { //session data refresh
  157.             $compareProductItems[$entry->getId()] = $entry;
  158.         }
  159.         $returnData = [];
  160.         foreach ($compareProductItems as $key => $item) {
  161.             $properties = [];
  162.             foreach ($this->properties as $key => $value) {
  163.                 if ($key == 'caliberNumber') {
  164.                     $caliber $item->getCalibernumber();
  165.                     $properties[$translator->trans('coreshop.details.' $key)] = $caliber->getName();
  166.                 } else if ($key == 'accuracy') {
  167.                     $interval $item->getAccuracyinterval();
  168.                     switch ($interval) {
  169.                         case 'nap':
  170.                             $intervalName 'naponta';
  171.                             break;
  172.                         case 'hónap':
  173.                             $intervalName 'havonta';
  174.                             break;
  175.                         case 'év':
  176.                             $intervalName 'évente';
  177.                             break;
  178.                     }
  179.                     $properties[$translator->trans('coreshop.details.' $key)] = '- ' $item->get('accuracy2') . ' / +' $item->get('accuracy') . ' másodperc ' $intervalName;
  180.                 } else {
  181.                     $properties[$translator->trans('coreshop.details.' $key)] = $item->get($key);
  182.                 }
  183.             }
  184.             foreach ($this->specifications as $key => $value) {
  185.                 $_value $item->get($key);
  186.                 if ($_value) {
  187.                     $properties[$translator->trans('coreshop.details.' $key)] = $_value;
  188.                     if (is_array($value)) {
  189.                         if (isset($value['append'])) {
  190.                             $properties[$translator->trans('coreshop.details.' $key)] .= " " $value['append'];
  191.                         }
  192.                     }
  193.                 } else {
  194.                     $properties[$translator->trans('coreshop.details.' $key)] = null;
  195.                 }
  196.             }
  197.             $returnData[] = $properties;
  198.         }
  199.         $session->set('compareProduct'$compareProductItems);
  200.         return $this->render('seikoboutique/templates/bundles/CoreShopFrontendBundle/Product/_compare_window.html.twig', [
  201.             'returnData' => $returnData
  202.         ]);
  203.     }
  204.     /**
  205.      * @Route("/update_compare_bar", name="update_compare_bar", methods={"POST"})
  206.      */
  207.     public function updateCompareBar(Request $request): Response
  208.     {
  209.         if ($request->isXMLHttpRequest()) { // only ajax request allow
  210.             $session $request->getSession();
  211.             if ($session->has('compareProduct')) {
  212.                 $compareProductItems $session->get('compareProduct');
  213.             } else {
  214.                 $compareProductItems = [];
  215.             }
  216.             $newProductId $request->get('newProductId');
  217.             $clearCompareItems $request->get('clearCompareItems');
  218.             if (json_decode($clearCompareItemstrue)) {
  219.                 $compareProductItems = [];
  220.                 $session->set('compareProduct'$compareProductItems);
  221.                 return $this->render('seikoboutique/templates/bundles/CoreShopFrontendBundle/Product/_compare_window.html.twig');
  222.             }
  223.             if (!empty($newProductId)) {
  224.                 if (isset($compareProductItems[$newProductId])) {
  225.                     unset($compareProductItems[$newProductId]);
  226.                 } else {
  227.                     $product CoreShopProduct::getById($newProductId);
  228.                     if ($product instanceof CoreShopProduct) {
  229.                         $compareProductItems[$newProductId] = $product;
  230.                     }
  231.                 }
  232.             }
  233.             if (isset($compareProductItems[$newProductId]) && count($compareProductItems) > $this->maxNumberOfComparedProducts) {
  234.                 $n count($compareProductItems) - $this->maxNumberOfComparedProducts;
  235.                 array_splice($compareProductItems, -$n);
  236.                 return new JsonResponse(['error' => "errorTooManyProducts"]);
  237.             }
  238.             $session->set('compareProduct'$compareProductItems);
  239.             return $this->render('seikoboutique/templates/bundles/CoreShopFrontendBundle/Product/_compare_window.html.twig');
  240.         }
  241.         return $this->redirect("/");
  242.     }
  243. //    /**
  244. //     * @return void
  245. //     * @Route("/oauthanswer", name="get_oauth_answer")
  246. //     */
  247. //    public function dumpOauthAnswerAction(Request $request): Response
  248. //    {
  249. //        // FB és Google esetén
  250. //        echo sprintf("<a href='http://localhost/api/user/login/social?code=%s&resourceOwner=google'>API LOGIN</a>",
  251. //            $request->get('code')
  252. //        );
  253. //
  254. //        return new Response();
  255. //    }
  256.     protected function sanitizeUrlParams(Request $request, array $necessary): \Symfony\Component\HttpFoundation\RedirectResponse
  257.     {
  258.         $params $request->query->all();
  259.         foreach ($params as $key => $param) {
  260.             if (!in_array($key$necessary)) {
  261.                 unset($params[$key]);
  262.             }
  263.         }
  264.         $newQuery http_build_query($params);
  265.         $newUrl $request->getSchemeAndHttpHost() . $request->getPathInfo() . '?' $newQuery;
  266.         return $this->redirect($newUrl);
  267.     }
  268.     protected function urlParamsCheck(Request $request, array $necessary): bool
  269.     {
  270.         $params $request->query->all();
  271.         foreach ($params as $key => $param) {
  272.             if (!in_array($key$necessary)) {
  273.                 return false;
  274.             }
  275.         }
  276.         return true;
  277.     }
  278.     /**
  279.      * @param Request $request
  280.      * @param PaginatorInterface $paginator
  281.      * @param Placeholder $placeholder
  282.      * @param WishListService $wishListService
  283.      * @return Response
  284.      * @Route("/kereso/{term}", name="news_search", requirements={"term"=".*"}, methods={"GET"})
  285.      */
  286.     public function searchAction(Request $requestPaginatorInterface $paginatorPlaceholder $placeholderWishListService $wishListService): Response
  287.     {
  288.         if (!$this->urlParamsCheck($request, ['q''page'])) {
  289.             return $this->sanitizeUrlParams($request, ['q''page']);
  290.         }
  291.         $data = [];
  292.         $s htmlspecialchars($request->get('q'));
  293.         $max_iterations 10;
  294.         $iteration_count 0;
  295.         while ((str_contains($s'&quot;') || str_contains($s'&amp;')) && $iteration_count $max_iterations) {
  296.             $s html_entity_decode($sENT_QUOTES ENT_HTML5'UTF-8');
  297.             $iteration_count++;
  298.         }
  299.         if ($s && strlen($s) > 2) {
  300.             $backend HelperFunctions::searchBackendCondition($s, ['News''CoreShopProduct']);
  301.         }
  302.         if (isset($backend['condition']) && isset($backend['order'])) {
  303.             $perPageAllowed = [152535];
  304.             $defaultPerPage $perPageAllowed[0];
  305.             $page = (int)$request->get('page'1);
  306.             $session $request->getSession();
  307.             if (!$session->has('searchPerPage')) {
  308.                 $session->set('searchPerPage'$defaultPerPage);
  309.             }
  310.             try {
  311.                 $maxResults $this->getParameter('app.search.max_results');
  312.             } catch (Exception $e) {
  313.                 $maxResults 1000;
  314.             }
  315.             $list = new DataObject\Listing();
  316.             $list->onCreateQueryBuilder(function (QueryBuilder $queryBuilder) use ($backend$maxResults) {
  317.                 $queryBuilder
  318.                     ->select('objects.o_id')
  319.                     ->innerJoin(
  320.                         "objects",
  321.                         "search_backend_data",
  322.                         "search_backend_data",
  323.                         "`objects`.`o_id` = `search_backend_data`.`id`"
  324.                     )
  325.                     ->leftJoin(
  326.                         "objects",
  327.                         "object_3",
  328.                         "news",
  329.                         "`objects`.`o_id` = `news`.`oo_id`"
  330.                     )
  331.                     ->andWhere($backend['condition'])
  332.                     ->andWhere($queryBuilder->expr()->or("`subtype` != 'News'"sprintf("news.category__id IN (%s)"implode(','HelperFunctions::getCategoryIds()))));
  333.             });
  334.             $list->setOrder(['ASC''DESC']);
  335.             $list->setOrderKey(['search_backend_data.subtype''search_backend_data.modificationDate']);
  336.             $paginatedList $paginator->paginate(
  337.                 $list,
  338.                 max($page1),
  339.                 $session->get('searchPerPage'),
  340.             );
  341.             $wishlist = [];
  342.             foreach ($paginatedList->getItems() as $item) {
  343.                 if ($item instanceof CoreShopProduct) {
  344.                     $wishlist[$item->getId()] = $wishListService->hasItem($item);
  345.                 }
  346.             }
  347.             $returnData = [
  348.                 'list' => $paginatedList->getItems(),
  349.                 'paginator' => $paginatedList,
  350.                 'wishlist' => $wishlist
  351.             ];
  352.         }
  353.         $bc = [];
  354.         $bc[] = [
  355.             'title' => 'Főoldal',
  356.             'path' => '/'
  357.         ];
  358.         $bc[] = [
  359.             'title' => sprintf('Találatok a következőre: "%s" '$s),
  360.             'path' => null
  361.         ];
  362.         $placeholder('breadcrumbNews')->set($bc);
  363.         $returnData['qs'] = $s;
  364.         return $this->renderTemplate('default/search.html.twig'$returnData);
  365.     }
  366.     /**
  367.      * @param Request $request
  368.      * @return Response
  369.      * @Route("{path}/{slug}", name="news_details", priority="-100", requirements={"path"="^(aktualitasok|hirek|videok|galeria).*$"})
  370.      */
  371.     public function newsdetailsAction(Request $requestPlaceholder $placeholderDocumentResolver $documentResolverNewsCategoryLinkGenerator $linkGeneratorHeadMeta $headMeta): Response
  372.     {
  373.         $news News::getBySlug($request->get('slug'), ['limit' => 1'unpublished' => true]);
  374.         if (!($news instanceof News && ($news->isPublished() || $this->verifyPreviewRequest($request$news)))) {
  375.             throw new NotFoundHttpException('news not found');
  376.         }
  377.         $isProspex $this->isSite('prospex');
  378.         $isProspexNews str_contains(strtolower($news->getCategory()?->getName()), 'prospex');
  379.         if (($isProspexNews && !$isProspex) || (!$isProspexNews && $isProspex)) {
  380.             throw new NotFoundHttpException('news not found');
  381.         }
  382.         $headMeta->setProperty('og:type''article');
  383.         $headMeta->setProperty('og:title'$news->getTitle() . ($isProspex ' - Prospex Team' ' - Seiko Boutique'));
  384.         $headMeta->setProperty('og:description'$news->getDescription());
  385.         $ogImage $news->getImage() ?? null;
  386.         if ($ogImage instanceof DataObject\Data\Hotspotimage) {
  387.             if ($ogImage->getImage() instanceof \Pimcore\Model\Asset\Image) {
  388.                 $headMeta->setProperty('og:image'$request->getSchemeAndHttpHost() . $ogImage->getImage()->getFullPath());
  389.                 $headMeta->setProperty('og:image:width'$ogImage->getImage()->getWidth());
  390.                 $headMeta->setProperty('og:image:height'$ogImage->getImage()->getHeight());
  391.             }
  392.         }
  393.         $bc = [];
  394.         $bc[] = [
  395.             'title' => $news->getTitle(),
  396.             'path' => null
  397.         ];
  398.         if ($news->getCategory()) {
  399.             $bc[] = [
  400.                 'title' => $news->getCategory()->getName(),
  401.                 'path' => $linkGenerator->generate($news->getCategory())
  402.             ];
  403.         }
  404.         $bc array_merge($bc$this->getNewsBreadcrumb($documentResolver->getDocument($request)));
  405.         $bc array_reverse($bc);
  406.         $placeholder('breadcrumbNews')->set($bc);
  407.         $_template $this->isSite('prospex') ? 'prospexteam/newsdetails.html.twig' 'default/newsdetails.html.twig';
  408.         return $this->renderTemplate($_template, [
  409.             'news' => $news,
  410.             'moreNews' => $this->getSimilarNews($news)
  411.         ]);
  412.     }
  413.     /**
  414.      * @param Request $request
  415.      * @param NewsCategoryLinkGenerator $generator
  416.      * @return Response
  417.      * @Route("{path}~n{category}", name="newscategory_list_redirect", requirements={"category"="\d+", "path"=".*?"})
  418.      */
  419.     public function newslistRedirectAction(Request $requestNewsCategoryLinkGenerator $generator): Response
  420.     {
  421.         $category NewsCategory::getById($request->get('category'));
  422.         if ($category) {
  423.             return $this->redirect($generator->generate($category), 301);
  424.         }
  425.         return $this->redirect("/");
  426.     }
  427.     /**
  428.      * @param Request $request
  429.      * @param PaginatorInterface $paginator
  430.      * @param Placeholder $placeholder
  431.      * @param DocumentResolver $documentResolver
  432.      * @return Response
  433.      * @Route("{path}-n{category}", name="newscategory_list", requirements={"category"="\d+", "path"=".*?"})
  434.      */
  435.     public function newslistAction(Request $requestPaginatorInterface $paginatorPlaceholder $placeholderDocumentResolver $documentResolver): Response
  436.     {
  437.         $perPageAllowed = [152535];
  438.         $defaultPerPage $perPageAllowed[0];
  439.         $defaultOrder 'desc';
  440.         $forceProspex false;
  441.         if ($this->editmode && str_contains($this->document->getTemplate(), 'prospexteam')) {
  442.             $forceProspex true;
  443.         }
  444.         $session $request->getSession();
  445.         if (!$session->has('newsPerPage')) {
  446.             $session->set('newsPerPage'$defaultPerPage);
  447.         }
  448.         if (!$session->has('newsOrder')) {
  449.             $session->set('newsOrder'$defaultOrder);
  450.         }
  451.         if (!$session->has('newsTag')) {
  452.             $session->set('newsTag'null);
  453.         }
  454.         if (!$this->isSite('prospex')) {
  455.             $tagList = new Tag\Listing();
  456.             $tagList->setCondition("ISNULL(parentId) OR parentId = 0");
  457.             $tagList->setOrderKey("name");
  458.             $tag $request->get('tag-filter');
  459.             if ($tag) {
  460.                 foreach ($tagList->load() as $item) {
  461.                     if ($item->getName() == $tag) {
  462.                         $session->set('newsTag'$item);
  463.                         $request->attributes->set('page'1);
  464.                         break;
  465.                     }
  466.                 }
  467.             } else if ($tag === '') {
  468.                 $session->set('newsTag'null);
  469.             }
  470.         } else {
  471.             $session->set('newsTag'null);
  472.         }
  473.         $perPage = (int)$request->get('perPage');
  474.         if ($perPage) {
  475.             if (in_array($perPage$perPageAllowed)) {
  476.                 $session->set('newsPerPage'$perPage);
  477.                 $request->attributes->set('page'1);
  478.             }
  479.         }
  480.         $order $request->get('order');
  481.         if ($order) {
  482.             if (in_array($order, array('asc''desc'))) {
  483.                 $session->set('newsOrder'$order);
  484.             }
  485.         }
  486.         $page = (int)$request->get('page'1);
  487.         $newslist = new News\Listing();
  488.         $newslist->setCondition("hiddenFromList IS NOT TRUE");
  489.         $newslist->setOrderKey(['highlighted''date']);
  490.         $newslist->setOrder(['desc'$session->get('newsOrder')]);
  491.         if ($session->get('newsTag')) {
  492.             $newslist->addConditionParam(sprintf("o_id IN (SELECT cId FROM tags_assignment WHERE ctype = 'object' AND tagid = %s)"$session->get('newsTag')->getId()));
  493.         }
  494.         $bc = [];
  495.         if (!$this->isSite('prospex')) {
  496.             $category NewsCategory::getById($request->get('category'));
  497.             if ($category) {
  498.                 if ($category->getHidden() === true) {
  499.                     return $this->redirect($documentResolver->getDocument()->getFullPath(), 301);
  500.                 }
  501.                 $newslist->filterByCategory($category);
  502.                 $bc[] = [
  503.                     'title' => $category->getName(),
  504.                     'path' => null
  505.                 ];
  506.             }
  507.         }
  508.         $bc array_merge($bc$this->getNewsBreadcrumb($documentResolver->getDocument($request)));
  509.         $bc array_reverse($bc);
  510.         $placeholder('breadcrumbNews')->set($bc);
  511.         $categoryList = new NewsCategory\Listing();
  512.         $categoryList->setOrder('asc');
  513.         $categoryList->setOrderKey('name');
  514.         if ($this->isSite('prospex') || $forceProspex) {
  515.             $_prospexFilter $this->document->getProperty('prospexListType') ?? 'prospex_news';
  516.             $_category NewsCategory::getByApiIdentifier($_prospexFilter, ['limit' => 1]);
  517.             if ($_category) {
  518.                 $newslist->filterByCategory($_category);
  519.             } else {
  520.                 $newslist = [];
  521.             }
  522.         } else {
  523.             $_category NewsCategory::getBySite('boutique');
  524.             $_filter = [0];
  525.             foreach ($_category as $cat) {
  526.                 $_filter[] = $cat->getId();
  527.             }
  528.             $newslist->addConditionParam(sprintf('category__id IN (%s)'implode(','$_filter)));
  529.             $categoryList->filterBySite('boutique');
  530.         }
  531.         $list $paginator->paginate(
  532.             $newslist,
  533.             max($page1),
  534.             $session->get('newsPerPage')
  535.         );
  536.         $_template $this->document->getTemplate() ?? 'default/newslist.html.twig';
  537.         return $this->renderTemplate($_template, [
  538.             'order' => $session->get('newsOrder'),
  539.             'news' => $list->getItems(),
  540.             'paginator' => $list,
  541.             'perPageAllowed' => $perPageAllowed,
  542.             'perPage' => $session->get('newsPerPage'),
  543.             'categoryList' => $categoryList,
  544.             'selectedCategory' => $category ?? null,
  545.             'tagList' => isset($tagList) ? $tagList->load() : null,
  546.             'selectedTag' => $session->get('newsTag'),
  547.             'clubsite' => $this->isSite('club')
  548.         ]);
  549.     }
  550.     /**
  551.      * @param Request $request
  552.      * @param ProspexEventLinkGenerator $generator
  553.      * @return Response
  554.      * @Route("{path}/{slug}~pe{id}", name="prospex_event_details_redirect", requirements={"path"=".*", "slug"=".*", "id"="\d+"})
  555.      */
  556.     public function prospexEventRedirectAction(Request $requestProspexEventLinkGenerator $generator): Response
  557.     {
  558.         $event DataObject\ProspexEvent::getById($request->get('id'));
  559.         if ($event instanceof DataObject\ProspexEvent && ($event->isPublished() || $this->verifyPreviewRequest($request$event))) {
  560.             return $this->redirect($generator->generate($event), 301);
  561.         }
  562.         throw new NotFoundHttpException('Event not found');
  563.     }
  564.     /**
  565.      * @param Request $request
  566.      * @param HeadMeta $headMeta
  567.      * @return Response
  568.      * @Route("{path}/{slug}-pe{id}", name="prospex_event_details", requirements={"path"=".*", "slug"=".*", "id"="\d+"})
  569.      */
  570.     public function prospexEventAction(Request $requestHeadMeta $headMeta): Response
  571.     {
  572.         if (!$this->isSite('prospex')) {
  573.             throw new NotFoundHttpException();
  574.         }
  575.         $event DataObject\ProspexEvent::getById($request->get('id'));
  576.         if (!($event instanceof DataObject\ProspexEvent && ($event->isPublished() || $this->verifyPreviewRequest($request$event)))) {
  577.             throw new NotFoundHttpException('Event not found');
  578.         }
  579.         $headMeta->setProperty('og:type''article');
  580.         $headMeta->setProperty('og:title'$event->getTitle() . ' - Seiko Boutique');
  581.         $headMeta->setProperty('og:description'$event->getText());
  582.         $ogImage $event->getImage() ?? null;
  583.         if ($ogImage instanceof DataObject\Data\Hotspotimage) { // TODO
  584.             if ($ogImage->getImage() instanceof \Pimcore\Model\Asset\Image) {
  585.                 $headMeta->setProperty('og:image'$request->getSchemeAndHttpHost() . $ogImage->getImage()->getFullPath());
  586.                 $headMeta->setProperty('og:image:width'$ogImage->getImage()->getWidth());
  587.                 $headMeta->setProperty('og:image:height'$ogImage->getImage()->getHeight());
  588.             }
  589.         }
  590.         return $this->renderTemplate('prospexteam/eventdetails.html.twig', [
  591.             'event' => $event
  592.         ]);
  593.     }
  594.     /**
  595.      * @Route("/esemenyek", name="prospex_event_list")
  596.      */
  597.     public function prospexEventlistAction(Request $requestPaginatorInterface $paginatorHeadMeta $headMeta): Response
  598.     {
  599.         if (!$this->isSite('prospex')) {
  600.             throw new NotFoundHttpException();
  601.         }
  602.         $eventList = new DataObject\ProspexEvent\Listing();
  603.         $eventList->setOrder(Criteria::ASC);
  604.         $eventList->setOrderKey('dateFrom');
  605.         $list $paginator->paginate(
  606.             $eventList,
  607.             max($request->get('page'1), 1),
  608.             10
  609.         );
  610.         $nextProspexEvent null;
  611.         $nextListing = new DataObject\ProspexEvent\Listing();
  612.         $nextListing->setOrder(Criteria::ASC);
  613.         $nextListing->setOrderKey('dateFrom');
  614.         $nextListing->setCondition(sprintf('dateFrom > %s'Carbon::now()->getTimestamp()));
  615.         $nextListing->setLimit(1);
  616.         if ($nextListing->count()) {
  617.             $nextProspexEvent $nextListing->getData()[0]->getId();
  618.         }
  619.         return $this->renderTemplate('prospexteam/eventlist.html.twig', [
  620.             'events' => $list->getItems(),
  621.             'paginator' => $list,
  622.             'nextProspexEvent' => $nextProspexEvent
  623.         ]);
  624.     }
  625.     protected function getNewsBreadcrumb($document)
  626.     {
  627.         $bc = [];
  628.         if ($document instanceof Page) {
  629.             $bc[] = [
  630.                 'title' => $document->getTitle(),
  631.                 'path' => $document->getFullPath()
  632.             ];
  633.             $doc $document;
  634.             while ($parent $doc->getParent()) {
  635.                 if ($parent instanceof Page && !empty($parent->getTitle())) {
  636.                     $bc[] = [
  637.                         'title' => $parent->getTitle(),
  638.                         'path' => $parent->getPath()
  639.                     ];
  640.                 }
  641.                 $doc $parent;
  642.             }
  643.         }
  644.         return $bc;
  645.     }
  646.     protected function getSimilarNews(News $news$limit 5)
  647.     {
  648.         $newsList = new News\Listing();
  649.         $newsList->setOrderKey(['highlighted''date']);
  650.         $newsList->setOrder(['desc''desc']);
  651.         if ($news->getCategory()) {
  652.             $newsList->filterByCategory($news->getCategory());
  653.         }
  654.         $newsList->addConditionParam('o_id != ?'$news->getId(), 'AND');
  655.         $newsList->setLimit($limit);
  656.         return $newsList->load();
  657.     }
  658.     public function articleAction(Request $requestPlaceholder $placeholderDocumentResolver $documentResolver): Response
  659.     {
  660.         $placeholder('breadcrumbNews')->set($this->getBreadCrumbForDucument($documentResolver->getDocument()));
  661.         return $this->render('default/article.html.twig', [
  662.             'clubsite' => $this->isSite('club')
  663.         ]);
  664.     }
  665.     public function watchLandingAction(Request $requestPlaceholder $placeholderDocumentResolver $documentResolver): Response
  666.     {
  667.         $placeholder('breadcrumbNews')->set($this->getBreadCrumbForDucument($documentResolver->getDocument()));
  668.         return $this->render('default/watch-landing.html.twig', [
  669.             'clubsite' => $this->isSite('club'),
  670.         ]);
  671.     }
  672.     public function setGoogleApiKey(string $googleApiKey)
  673.     {
  674.         $this->googleApiKey $googleApiKey;
  675.     }
  676.     public function setSpecifications(array $specifications): void
  677.     {
  678.         $this->specifications $specifications;
  679.     }
  680.     public function setProperties(array $properties): void
  681.     {
  682.         $this->properties $properties;
  683.     }
  684.     public function setMaxNumberOfComparedProducts(int $maxNumberOfComparedProducts): void
  685.     {
  686.         $this->maxNumberOfComparedProducts $maxNumberOfComparedProducts;
  687.     }
  688.     public function kapcsolatAction(Request $requestRecaptcha3Validator $recaptcha3ValidatorPlaceholder $placeholderDocumentResolver $documentResolverMailerService $mailerService): Response
  689.     {
  690.         $user $this->getUser();
  691.         $contact = new Contact();
  692.         $document $documentResolver->getDocument();
  693.         if ($user instanceof CoreShopUser) {
  694.             $customer $user->getCustomer();
  695.             $contact->setLastname($customer->getLastname() ?: '');
  696.             $contact->setFirstname($customer->getFirstname() ?: '');
  697.             $contact->setEmail($customer->getEmail() ?: '');
  698.             $contact->setMobile($customer->getPhoneNumber() ?: '');
  699.         }
  700.         $form $this->container->get('form.factory')->createNamed(
  701.             'contact'ContactType::class, $contact, ['document' => $document]
  702.         );
  703.         $form->handleRequest($request);
  704.         //$score = $recaptcha3Validator->getLastResponse();
  705.         if ($form->isSubmitted() && $form->isValid()) {
  706.             $contact $form->getData();
  707.             if ($contact instanceof Contact) {
  708.                 try {
  709.                     $contact->setPlatform('web');
  710.                     $contact->save();
  711.                     $this->addFlash('success''Sikeresen elküldve!');
  712. //                    $mailerService->sendContactMail($contact);
  713.                     $mailerService->sendMailWithMaileon('contact_success'$this->isSite('club') ? 'Contactform' 'Contactform_boutique'$contact->getMaileonData(), [$contact->getEmail()]);
  714.                 } catch (NotFoundExceptionInterface|ContainerExceptionInterface|Exception $e) {
  715.                     $this->addFlash('danger''Hiba történt!');
  716.                 }
  717.             }
  718.             return $this->redirect($request->getUri());
  719.         }
  720.         $placeholder('breadcrumbNews')->set($this->getBreadCrumbForDucument($document));
  721.         return $this->renderTemplate('default/kapcsolat.html.twig', [
  722.             'form' => $form->createView(),
  723.             'apiKey' => $this->googleApiKey
  724.         ]);
  725.     }
  726.     public function boutiqueAction(Request $requestPlaceholder $placeholderDocumentResolver $documentResolver): Response
  727.     {
  728.         $placeholder('breadcrumbNews')->set($this->getBreadCrumbForDucument($documentResolver->getDocument()));
  729.         return $this->renderTemplate('default/boutique.html.twig', [
  730.             'apiKey' => $this->googleApiKey
  731.         ]);
  732.     }
  733. }