src/AtechNet/CoreBundle/Controller/PageController.php line 227

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Controller;
  3. use App\AtechNet\CoreBundle\Entity\BlogPage;
  4. use App\AtechNet\CoreBundle\Entity\CategoryPage;
  5. use App\AtechNet\CoreBundle\Entity\Domain;
  6. use App\AtechNet\CoreBundle\Entity\Language;
  7. use App\AtechNet\CoreBundle\Entity\PageMeta;
  8. use App\AtechNet\CoreBundle\Entity\Product;
  9. use App\AtechNet\CoreBundle\Entity\ProductType;
  10. use App\AtechNet\CoreBundle\Entity\Review;
  11. use App\AtechNet\CoreBundle\Entity\ReviewSurveyMedia;
  12. use App\AtechNet\CoreBundle\Entity\SeoUrl;
  13. use App\AtechNet\CoreBundle\Entity\StaticPage;
  14. use App\AtechNet\CoreBundle\Form\ReviewType;
  15. use App\AtechNet\CoreBundle\Form\ServiceType;
  16. use App\AtechNet\CoreBundle\Helper\Furbify\Heureka;
  17. use App\AtechNet\CoreBundle\Helper\Furbify\Image;
  18. use App\AtechNet\CoreBundle\Helper\Furbify\MultiStore;
  19. use App\AtechNet\CoreBundle\Helper\Furbify\ProductHelper;
  20. use App\AtechNet\CoreBundle\Helper\Furbify\ResizeImage;
  21. use Doctrine\ORM\Exception\NotSupported;
  22. use Doctrine\ORM\NonUniqueResultException;
  23. use Doctrine\ORM\NoResultException;
  24. use Doctrine\ORM\Tools\Pagination\Paginator;
  25. use Psr\SimpleCache\InvalidArgumentException;
  26. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  27. use Symfony\Component\Filesystem\Filesystem;
  28. use Symfony\Component\HttpFoundation\Request;
  29. use Symfony\Component\HttpFoundation\Response;
  30. use Symfony\Component\Routing\Annotation\Route;
  31. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  32. class PageController extends AbstractController
  33. {
  34.     /**
  35.      * @Route("/page/{pageId}", name="page_show", defaults={"_locale":""})
  36.      * @Route("/{_locale<%supported_locales%>?}/page/{pageId}", name="page_show_locale", defaults={"_locale":""})
  37.      * @param int $pageId
  38.      * @param Request $request
  39.      * @return Response
  40.      * @throws \Exception
  41.      */
  42.     public function showAction($pageId, Request $request): Response
  43.     {
  44.         $multiStore = $this->getMultiStoreHelper($request);
  45.         $domain = $multiStore->getDomain();
  46.         //Product categories
  47.         if (in_array($domain->getId(), MultiStore::getRetailDomainIDs())
  48.             && in_array($pageId, [11, 27, 60, 100]))
  49.         {
  50.             $pageId = match ($domain->getId()) {
  51.                 Domain::DOMAIN_ID_RT_SK => 182,
  52.                 Domain::DOMAIN_ID_RT_HU => 183,
  53.                 Domain::DOMAIN_ID_RT_CZ => 184,
  54.                 Domain::DOMAIN_ID_RT_EU => 185
  55.             };
  56.         }
  57.         //Return policy
  58.         if ($domain->getId() == Domain::DOMAIN_ID_WS_HU && $pageId == 31) {
  59.             $pageId = 187;
  60.         }
  61.         //Frequently Asked Questions
  62.         if ($domain->getId() == Domain::DOMAIN_ID_WS_EU && $pageId == 99) {
  63.             $pageId = 186;
  64.         }
  65.         $data = [
  66.             'pageId' => $pageId,
  67.         ];
  68.         $page = $this->getEntityManager()->getRepository(StaticPage::class)->findOneById($pageId);
  69.         if ($page && $page->isPublished()) {
  70.             $data['pageId'] = $pageId;
  71.             $meta = $page->getMetaByLanguage($multiStore->getDefaultLanguage());
  72.             if (!$meta) {
  73.                 return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
  74.             }
  75.             $this->getStaticPageData($request, $page, $meta, $data);
  76.             return $this->render('AtechNetCoreBundle/Page/static.html.twig', $data);
  77.         } else {
  78.             return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
  79.         }
  80.     }
  81.     /**
  82.      * @Route("/static-preview/{pageId}", name="page_preview")
  83.      * @param int|string $pageId
  84.      * @param Request $request
  85.      * @return Response
  86.      * @throws InvalidArgumentException
  87.      */
  88.     public function previewPageAction($pageId, Request $request): Response
  89.     {
  90.         $data = [];
  91.         $data['canonical_link'] = '';
  92.         $data['preview'] = true;
  93.         $staticPage = $this->getEntityManager()->getRepository(StaticPage::class)->findOneById($pageId);
  94.         if ($staticPage) {
  95.             $data['pageId'] = $pageId;
  96.             $multiStore = $this->getMultiStoreHelper($request);
  97.             $meta = $staticPage->getMetaByLanguage($multiStore->getDefaultLanguage());
  98.             if (!$meta) {
  99.                 return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
  100.             }
  101.             $this->getStaticPageData($request, $staticPage, $meta, $data);
  102.             return $this->render('AtechNetCoreBundle/Page/static.html.twig', $data);
  103.         } else {
  104.             return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
  105.         }
  106.     }
  107.     /**
  108.      * @param Request $request
  109.      * @param StaticPage $staticPage
  110.      * @param PageMeta $meta
  111.      * @param array &$data
  112.      */
  113.     private function getStaticPageData(Request $request, StaticPage $staticPage, PageMeta $meta, array &$data)
  114.     {
  115.         $multiStore = $this->getMultiStoreHelper($request);
  116.         $translator = $this->getTranslator($request);
  117.         $data['breadcrumbs'] = [];
  118.         $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  119.         $data['breadcrumbs'][] = [
  120.             'text' => $meta->getTitle(),
  121.             'href' => $this->url($request)->link('page', [
  122.                 'static_id' => $staticPage->getId(),
  123.             ]),
  124.         ];
  125.         $data['seoTitle'] = $meta->getSeoTitle();
  126.         $data['indexable'] = $staticPage->isIndexable();
  127.         if (empty($data['seoTitle'])) {
  128.             $data['seoTitle'] = $meta->getTitle();
  129.         }
  130.         $data['seoDescription'] = $meta->getSeoDesc();
  131.         $data['title'] = $meta->getTitle();
  132.         $data['content'] = $meta->getContent();
  133.         if (strpos($data['content'], '[PICKUP_POINT_LIST]') !== false) {
  134.             $pickupPoints = $this->getEntityManager()->createQuery("SELECT pp.title,pp.street,pp.city,pp.zip,pp.glsId,pp.type,pp.locker
  135.                     FROM AtechNetCoreBundle:PickupPoint pp
  136.                     WHERE pp.active = 1 AND pp.country = :country
  137.                     ORDER BY pp.city ASC")
  138.                 ->setParameter('country', $multiStore->getDomain()->getLanguage()->getCode())
  139.                 ->getResult();
  140.             if (count($pickupPoints) > 0) {
  141.                 $pickupPointsHtml = '<ul>';
  142.                 foreach ($pickupPoints as $pp) {
  143.                     $pickupPointsHtml .= '<li>' . mb_strtoupper($pp['city']) . ', ' . $pp['street'] . ' - ' . $pp['title'] . '</li>';
  144.                 }
  145.                 $pickupPointsHtml .= '</ul>';
  146.                 $data['content'] = str_replace('[PICKUP_POINT_LIST]', $pickupPointsHtml, $data['content']);
  147.             } else {
  148.                 $pickupPointsHtml = $translator->trans('No Pick-up points are available');
  149.             }
  150.             $data['content'] = str_replace('[PICKUP_POINT_LIST]', $pickupPointsHtml, $data['content']);
  151.         }
  152.         if (strpos($data['content'], '[PACKETA_BRANCH_LIST]') !== false) {
  153.             $packetaBranchesCacheKey = 'packeta.branches.array';
  154.             $cacheItem = $this->cache->getItem($packetaBranchesCacheKey);
  155.             if (!$cacheItem->isHit()) {
  156.                 $packeta = $this->getPacketa();
  157.                 $branches = $packeta->getBrancheListForCountry($multiStore->getDomain()->getLanguage()->getCode(), $this->getKernel()->getRootDir());
  158.                 $cacheItem->set($branches);
  159.                 $cacheItem->expiresAfter(self::CACHE_LIFETIME_7_DAYS);
  160.                 $this->cache->save($cacheItem);
  161.             } else {
  162.                 $branches = $cacheItem->get();
  163.             }
  164.             if (count($branches) > 0) {
  165.                 $branchesHtml = '<ul>';
  166.                 foreach ($branches as $pp) {
  167.                     $branchesHtml .= '<li>' . $pp['address'] . ' - <a href="' . $pp['url'] . '" target="_blank">' . $pp['url'] . '</a></li>';
  168.                 }
  169.                 $branchesHtml .= '</ul>';
  170.                 $data['content'] = str_replace('[PACKETA_BRANCH_LIST]', $branchesHtml, $data['content']);
  171.             } else {
  172.                 $branchesHtml = $this->getTranslator($request)->trans('No Pick-up points are available');
  173.             }
  174.             $data['content'] = str_replace('[PACKETA_BRANCH_LIST]', $branchesHtml, $data['content']);
  175.         }
  176.         $data['header'] = $this->getHeader($request);
  177.         $data['footer'] = $this->getFooter($request);
  178.         $data['contentBottom'] = $this->getContentBottom($request);
  179.         $data['socialShareImage'] = $this->getSocialShareImageHelper()->getImageUrl($staticPage->getSocialShareImage(), 'static');
  180.         $data['showAdminLoginPanel'] = $request->getSession()->get('isAdminLogin');
  181.     }
  182.     /**
  183.      * @Route("/blog/{blogCategoryId}/{blogId}", name="blog_show", defaults={"_locale":""})
  184.      * @Route("/{_locale<%supported_locales%>?}/blog/{blogCategoryId}/{blogId}", name="blog_show_locale", defaults={"_locale":""})
  185.      * @param Request $request
  186.      * @param null $blogCategoryId
  187.      * @param int|string $blogId
  188.      * @return Response
  189.      * @throws InvalidArgumentException
  190.      * @throws NotSupported
  191.      */
  192.     public function showBlogAction(Request $request, $blogId, $blogCategoryId = null): Response
  193.     {
  194.         // Entity Manager
  195.         $entityManager = $this->getEntityManager();
  196.         // Multi-Store
  197.         $multiStore = $this->getMultiStoreHelper($request);
  198.         // Data
  199.         $data = [];
  200.         $data['hideChat'] = true;
  201.         $data['canonical_link'] = '';
  202.         if (!is_numeric($blogId)) {
  203.             $seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  204.                 'keyword' => $blogId,
  205.                 'language' => $multiStore->getDefaultLanguage(),
  206.             ]);
  207.             if ($seoUrl) {
  208.                 $query = explode('=', $seoUrl->getQuery());
  209.                 $blogId = $query[1];
  210.             } else {
  211.                 $blogId = 0;
  212.             }
  213.         } else {
  214.             $seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  215.                 'query' => 'blog_id=' . $blogId,
  216.                 'language' => $multiStore->getDefaultLanguage(),
  217.             ]);
  218.             if ($seoUrl) {
  219.                 $data['canonical_link'] = 'https://' . $request->getHost() . '/blog/' . $seoUrl->getKeyWord();
  220.             }
  221.         }
  222.         $data['blogId'] = $blogId;
  223.         $blog = $entityManager->getRepository(BlogPage::class)->findOneById($blogId);
  224.         $customerTypeId = $this->getCustomerTypeId($request);
  225.         if ($blog) {
  226.             if ($customerTypeId != 2 && in_array($blog->getDomain()->getId(), [Domain::DOMAIN_ID_WS_SK, DOMAIN::DOMAIN_ID_WS_HU, Domain::DOMAIN_ID_WS_CZ])) {
  227.                 return $this->redirectToRoute('homepage');
  228.             }
  229.             $productHelper = $this->getProductHelper($request);
  230.             // Redirect to current blog page if blogCategoryId not set or not currenty set
  231.             $meta = $blog->getMetaByLanguage($multiStore->getDefaultLanguage());
  232.             $currentCategorySeoUrl = null;
  233.             if ($blog->getCategoryPage()) {
  234.                 $currentCategorySeoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  235.                     'query' => 'category_id=' . $blog->getCategoryPage()->getId(),
  236.                     'language' => $multiStore->getDefaultLanguage(),
  237.                 ]);
  238.             }
  239.             // Redirect to current blog page if blogCategoryId not set or not currenty set
  240.             if (is_null($blogCategoryId) || (!is_null($currentCategorySeoUrl) && $currentCategorySeoUrl->getKeyword() != $blogCategoryId)) {
  241.                 $seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  242.                     'query' => 'blog_id=' . $blogId,
  243.                     'language' => $multiStore->getDefaultLanguage(),
  244.                 ]);
  245.                 if ($seoUrl) {
  246.                     $seoUrl->getKeyWord();
  247.                     $url = 'https://' . $request->getHost() . '/blog/' . $currentCategorySeoUrl->getKeyWord() . '/' . $seoUrl->getKeyword();
  248.                     return $this->redirect($url, 301);
  249.                 }
  250.             }
  251.             if ($meta) {
  252.                 $translator = $this->getTranslator();
  253.                 $data['breadcrumbs'] = [];
  254.                 $title = in_array($multiStore->getDomain()->getId(), [1, 3]) ? $translator->trans('Blog') : $translator->trans('News');
  255.                 $data['breadcrumbs'][] = [
  256.                     'text' => $title,
  257.                     'href' => $this->generateUrl('blog_main'),
  258.                 ];
  259.                 $data['breadcrumbs'][] = [
  260.                     'text' => $meta->getTitle(),
  261.                     'href' => $this->url($request)->link('blog', [
  262.                         'blog_id' => $blog->getId(),
  263.                     ]),
  264.                 ];
  265.                 $data['seoTitle'] = $meta->getSeoTitle();
  266.                 $data['indexable'] = $blog->isIndexable();
  267.                 if (empty($data['seoTitle'])) {
  268.                     $data['seoTitle'] = $meta->getTitle();
  269.                 }
  270.                 $data['seoDescription'] = $meta->getSeoDesc();
  271.                 $data['title'] = $meta->getTitle();
  272.                 $data['created'] = $blog->getCreated()->format($translator->trans('datetime.format'));
  273.                 $data['createdSchema'] = $blog->getCreated()->format('Y-m-d H:i:s');
  274.                 $data['modifiedSchema'] = $blog->getUpdated()->format('Y-m-d H:i:s');
  275.                 $data['createdBy'] = $blog->getCreatedBy()->getFirstName();
  276.                 $data['content'] = $meta->getContent();
  277.                 $data['tags'] = $blog->getTags();
  278.                 //-> Embeddings
  279.                 $data['embeddings'] = [];
  280.                 if (preg_match_all('/\[\[(.*)\]\]/', $data['content'], $embeddings) !== false) {
  281.                     if (!empty($embeddings[0])) {
  282.                         foreach ($embeddings[0] as $embedding) {
  283.                             // Remove brackets & trim
  284.                             $_embedding = trim(str_replace(['[', ']'], '', $embedding));
  285.                             // Arguments
  286.                             $start = strpos($_embedding, '(') + 1;
  287.                             $end = strrpos($_embedding, ')');
  288.                             $arguments = explode(',', trim(substr($_embedding, $start, ($end - $start))));
  289.                             // Get Function Name
  290.                             $function = strtoupper(substr($_embedding, 0, strpos($_embedding, '(')));
  291.                             // Flash Sale Box
  292.                             if (strpos($function, 'FLASHSALEBOX') !== false) {
  293.                                 $product = $entityManager->getRepository(Product::class)->findOneByCode($arguments[0]);
  294.                                 if ($product) {
  295.                                     $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  296.                                     $result = $productHelper->getStructuredDataForProduct($product, 'list');
  297.                                     $image = $placeholder;
  298.                                     if (is_object($result['images'])) {
  299.                                         $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  300.                                     }
  301.                                     if ($result['timedSalesStartDate'] === false) {
  302.                                         $timedSalesStartDate = [
  303.                                             'year' => (new \DateTime())->format('Y'),
  304.                                             'month' => (new \DateTime())->format('M'),
  305.                                             'day' => (new \DateTime())->format('d'),
  306.                                             'hour' => (new \DateTime())->format('H'),
  307.                                         ];
  308.                                     } else {
  309.                                         $timedSalesStartDate = $result['timedSalesStartDate'];
  310.                                     }
  311.                                     if ($result['timedSalesEndDate'] === false) {
  312.                                         $timedSalesEndDate = [
  313.                                             'year' => (new \DateTime())->format('Y'),
  314.                                             'month' => (new \DateTime())->format('M'),
  315.                                             'day' => (new \DateTime())->format('d'),
  316.                                             'hour' => (new \DateTime())->format('H'),
  317.                                         ];
  318.                                     } else {
  319.                                         $timedSalesEndDate = $result['timedSalesEndDate'];
  320.                                     }
  321.                                     $flashSaleProduct = [
  322.                                         'id' => $result['id'],
  323.                                         'title' => $result['title'],
  324.                                         'vendor' => $result['vendor'],
  325.                                         'labels' => $result['badges'],
  326.                                         'rawPrice' => $result['rawPrice'],
  327.                                         'price' => $result['vatPrice'],
  328.                                         'rawSpecial' => ($result['isDiscounted'] ? $result['rawDiscountPrice'] : false),
  329.                                         'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  330.                                         'image' => $image,
  331.                                         'attributes' => $result['attributes'],
  332.                                         'available' => $result['availableQty'],
  333.                                         'href' => $this->url($request)->link('product', [
  334.                                             'product_id' => $result['id'],
  335.                                             'isBazaar'   => $result['isBazaar'] ?? 0
  336.                                         ]),
  337.                                         'active' => $result['active'],
  338.                                         'timedSalesActive' => $result['timedSalesActive'],
  339.                                         'timedSalesStartDate' => $timedSalesStartDate,
  340.                                         'timedSalesEndDate' => $timedSalesEndDate,
  341.                                     ];
  342.                                     $data['embeddings'][] = [
  343.                                         'type' => 'flashsalebox',
  344.                                         'search' => $embedding,
  345.                                         'data' => $flashSaleProduct,
  346.                                     ];
  347.                                 }
  348.                             } // Product Type
  349.                             elseif (strpos($function, 'PRODUCTTYPE') !== false) {
  350.                                 // Where
  351.                                 $where = '';
  352.                                 if (isset($arguments[0])) {
  353.                                     $where .= ' AND p.type = ' . (int)$arguments[0];
  354.                                 }
  355.                                 if (isset($arguments[1]) && (int)$arguments[1] == 1) {
  356.                                     $where .= ' AND pm.discounted = 1';
  357.                                 }
  358.                                 // Order By
  359.                                 $orderBy = 'pm.currentVatPrice ';
  360.                                 if (isset($arguments[2])) {
  361.                                     if (strotupper($arguments[2]) == 'CREATED') {
  362.                                         $orderBy = 'p.crated ';
  363.                                     } elseif (strotupper($arguments[2]) == 'AVAILABLE') {
  364.                                         $orderBy = 'p.available ';
  365.                                     }
  366.                                 }
  367.                                 if (isset($arguments[3]) && strotupper($arguments[3]) == 'DESC') {
  368.                                     $orderBy .= 'DESC';
  369.                                 } else {
  370.                                     $orderBy .= 'ASC';
  371.                                 }
  372.                                 // Limit
  373.                                 if (isset($arguments[4]) && (int)$arguments[4] > 0 && (int)$arguments[4] <= 6) {
  374.                                     $limit = (int)$arguments[4];
  375.                                 } else {
  376.                                     $limit = 6;
  377.                                 }
  378.                                 // Placeholder
  379.                                 $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  380.                                 // Products
  381.                                 $products = [];
  382.                                 $productsByType = $entityManager->createQuery("SELECT p 
  383.                                         FROM AtechNetCoreBundle:Product p 
  384.                                         LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = ( 
  385.                                             SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . " 
  386.                                         ) 
  387.                                         WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1" . $where . " 
  388.                                         ORDER BY " . $orderBy . ", p.updated DESC")
  389.                                     ->setMaxResults($limit)
  390.                                     ->getResult();
  391.                                 $results = $productHelper->getStructuredDataForProducts($productsByType);
  392.                                 foreach ($results as $result) {
  393.                                     $image = $placeholder;
  394.                                     if (is_object($result['images'])) {
  395.                                         $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  396.                                     }
  397.                                     $products[] = [
  398.                                         'id' => $result['id'],
  399.                                         'title' => ProductHelper::getHeadingTitle($result),
  400.                                         'vendor' => $result['vendor'],
  401.                                         'vendorId' => $result['vendorId'],
  402.                                         'labels' => $result['badges'],
  403.                                         'price' => $result['vatPrice'],
  404.                                         'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  405.                                         'rawPrice' => $result['rawPrice'],
  406.                                         'rawDiscountPrice' => $result['rawDiscountPrice'],
  407.                                         'image' => $image,
  408.                                         'attributes' => $result['attributes'],
  409.                                         'attributesListTxt' => $result['attributesListTxt'],
  410.                                         'available' => $result['availableQty'],
  411.                                         'type' => $result['productType'],
  412.                                         'typeId' => $result['productTypeId'],
  413.                                         'href' => $this->url($request)->link('product', [
  414.                                             'product_id' => $result['id'],
  415.                                             'isBazaar'   => $result['isBazaar'] ?? 0
  416.                                         ]),
  417.                                         'active' => $result['active'],
  418.                                         'timedSalesActive' => $result['timedSalesActive'],
  419.                                         'reviewCount' => $result['reviewCount'],
  420.                                         'reviewStars' => $result['reviewStars'],
  421.                                         'reviews' => $result['reviews'],
  422.                                         'freeShipping' => $result['freeShipping'],
  423.                                         'warrantyYear' => $this->getWarrantyForProductType($multiStore->getDomainId(), $result['productTypeId'])['year'],
  424.                                     ];
  425.                                 }
  426.                                 $data['embeddings'][] = [
  427.                                     'type' => 'producttype',
  428.                                     'search' => $embedding,
  429.                                     'data' => $products,
  430.                                 ];
  431.                             } // Products
  432.                             elseif (strpos($function, 'PRODUCTS') !== false) {
  433.                                 // Placeholder
  434.                                 $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  435.                                 // Products
  436.                                 $products = [];
  437.                                 $selectedProducts = $entityManager->createQuery("SELECT p 
  438.                                     FROM AtechNetCoreBundle:Product p 
  439.                                     LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
  440.                                         SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . "
  441.                                     ) 
  442.                                     WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1 AND p.code IN (" . implode(',', $arguments) . ") 
  443.                                     ORDER BY pm.currentVatPrice ASC, p.updated DESC")
  444.                                     ->setMaxResults(6)
  445.                                     ->getResult()
  446.                                 ;
  447.                                 $results = $productHelper->getStructuredDataForProducts($selectedProducts);
  448.                                 foreach ($results as $result) {
  449.                                     $image = $placeholder;
  450.                                     if (is_object($result['images'])) {
  451.                                         $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  452.                                     }
  453.                                     $products[] = [
  454.                                         'id' => $result['id'],
  455.                                         'title' => ProductHelper::getHeadingTitle($result),
  456.                                         'vendor' => $result['vendor'],
  457.                                         'vendorId' => $result['vendorId'],
  458.                                         'labels' => $result['badges'],
  459.                                         'price' => $result['vatPrice'],
  460.                                         'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  461.                                         'rawPrice' => $result['rawPrice'],
  462.                                         'rawDiscountPrice' => $result['rawDiscountPrice'],
  463.                                         'image' => $image,
  464.                                         'attributes' => $result['attributes'],
  465.                                         'attributesListTxt' => $result['attributesListTxt'],
  466.                                         'available' => $result['availableQty'],
  467.                                         'type' => $result['productType'],
  468.                                         'typeId' => $result['productTypeId'],
  469.                                         'href' => $this->url($request)->link('product', [
  470.                                             'product_id' => $result['id'],
  471.                                             'isBazaar'   => $result['isBazaar'] ?? 0
  472.                                         ]),
  473.                                         'active' => $result['active'],
  474.                                         'timedSalesActive' => $result['timedSalesActive'],
  475.                                         'reviewCount' => $result['reviewCount'],
  476.                                         'reviewStars' => $result['reviewStars'],
  477.                                         'reviews' => $result['reviews'],
  478.                                         'freeShipping' => $result['freeShipping'],
  479.                                     ];
  480.                                 }
  481.                                 $data['embeddings'][] = [
  482.                                     'type' => 'products',
  483.                                     'search' => $embedding,
  484.                                     'data' => $products,
  485.                                 ];
  486.                             }
  487.                             // Invalid Function
  488.                             else {
  489.                                 $data['content'] = str_replace($embedding, '', $data['content']);
  490.                             }
  491.                         }
  492.                     }
  493.                 }
  494.                 $domain = $multiStore->getDomain();
  495.                 $data['precision'] = $domain->getPricePrecision();
  496.                 $data['currency'] = $domain->getCurrency();
  497.                 //<- Embeddings
  498.                 $data['header'] = $this->getHeader($request);
  499.                 $data['footer'] = $this->getFooter($request);
  500.                 $data['columnRight'] = $this->getColumnRight($request);
  501.                 $data['contentBottom'] = $this->getContentBottom($request);
  502.                 $blogCategoryId = 0;
  503.                 if ($blog->getCategoryPage()) {
  504.                     $blogCategoryId = $blog->getCategoryPage()->getId();
  505.                 }
  506.                 if (empty($blogCategoryId)) {
  507.                     $domainId = $blog->getDomain()->getId();
  508.                     if ($domainId == Domain::DOMAIN_ID_RT_SK) {
  509.                         $blogCategoryId = 3;
  510.                     } elseif ($domainId == Domain::DOMAIN_ID_RT_HU) {
  511.                         $blogCategoryId = 77;
  512.                     } elseif ($domainId == Domain::DOMAIN_ID_RT_CZ) {
  513.                         $blogCategoryId = 169;
  514.                     }
  515.                 }
  516.                 $data['url'] = $this->generateUrl('blog_show', [
  517.                     'blogCategoryId' => $blogCategoryId,
  518.                     'blogId' => $seoUrl ? $seoUrl->getKeyword() : $blogId,
  519.                 ], UrlGeneratorInterface::ABSOLUTE_URL);
  520.                 $data['urlEscaped'] = urlencode($data['url']);
  521.                 $data['inLanguageSchema'] = MultiStore::getBCP47LanguageCode($multiStore->getDefaultLocale());
  522.                 $data['coverImage'] = $this->getSocialShareImageHelper()->getImageUrl($blog->getCoverImage(), 'blog');
  523.                 $categoryPageId = $meta->getCategoryPage();
  524.                 $languageId = $multiStore->getDefaultLanguage()->getId();
  525.                 if ($categoryPageId != null && $languageId > 0) {
  526.                     $data['articleSection'] = $entityManager->getRepository(PageMeta::class)->findOneBy([
  527.                         'category_page_id' => $categoryPageId,
  528.                         'language_id' => $languageId,
  529.                     ])->getTitle();
  530.                 }
  531.                 $data['showAdminLoginPanel'] = $request->getSession()->get('isAdminLogin');
  532.                 return $this->render('AtechNetCoreBundle/Page/blog.html.twig', $data);
  533.             }
  534.         }
  535.         return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
  536.     }
  537.     /**
  538.      * @Route("/blog/{blogId}/preview", name="blog_preview", defaults={"_locale":""})
  539.      * @Route("/{_locale<%supported_locales%>?}/blog/{blogId}/preview", name="blog_preview_locale", defaults={"_locale":""})
  540.      * @param int|string $blogId
  541.      * @param Request $request
  542.      * @return Response
  543.      * @throws InvalidArgumentException
  544.      */
  545.     public function previewBlogAction($blogId, Request $request): Response
  546.     {
  547.         $data = [];
  548.         $data['canonical_link'] = '';
  549.         $data['preview'] = true;
  550.         // Entity Manager
  551.         $entityManager = $this->getEntityManager();
  552.         $blog = $this->getEntityManager()->getRepository(BlogPage::class)->findOneById($blogId);
  553.         $customerTypeId = $this->getCustomerTypeId($request);
  554.         if ($blog) {
  555.             if ($customerTypeId != 2 && in_array($blog->getDomain()->getId(), [Domain::DOMAIN_ID_WS_SK, Domain::DOMAIN_ID_WS_HU, Domain::DOMAIN_ID_WS_CZ])) {
  556.                 return $this->redirectToRoute('homepage');
  557.             }
  558.             $multiStore = $this->getMultiStoreHelper($request);
  559.             $productHelper = $this->getProductHelper($request);
  560.             $seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  561.                 'query' => 'blog_id=' . $blogId,
  562.                 'language' => $multiStore->getDefaultLanguage(),
  563.             ]);
  564.             $meta = $blog->getMetaByLanguage($multiStore->getDefaultLanguage());
  565.             if ($meta) {
  566.                 $translator = $this->getTranslator();
  567.                 $data['breadcrumbs'] = [];
  568.                 $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  569.                 $data['breadcrumbs'][] = [
  570.                     'text' => $meta->getTitle(),
  571.                     'href' => $this->url($request)->link('blog', [
  572.                         'blog_id' => $blog->getId(),
  573.                     ]),
  574.                 ];
  575.                 $data['seoTitle'] = $meta->getSeoTitle();
  576.                 $data['indexable'] = $blog->isIndexable();
  577.                 if (empty($data['seoTitle'])) {
  578.                     $data['seoTitle'] = $meta->getTitle();
  579.                 }
  580.                 $data['seoDescription'] = $meta->getSeoDesc();
  581.                 $data['title'] = $meta->getTitle();
  582.                 $data['created'] = $meta->getCreated()->format($translator->trans('datetime.format'));
  583.                 $data['createdSchema'] = $meta->getCreated()->format('Y-m-d H:i:s');
  584.                 $data['modifiedSchema'] = $blog->getUpdated()->format('Y-m-d H:i:s');
  585.                 $data['createdBy'] = $blog->getCreatedBy()->getFirstName();
  586.                 $data['content'] = $meta->getContent();
  587.                 $data['tags'] = $blog->getTags();
  588.                 //-> Embeddings
  589.                 $data['embeddings'] = [];
  590.                 if (preg_match_all('/\[\[(.*)\]\]/', $data['content'], $embeddings) !== false) {
  591.                     if (!empty($embeddings[0])) {
  592.                         foreach ($embeddings[0] as $embedding) {
  593.                             // Remove brackets & trim
  594.                             $_embedding = trim(str_replace(['[', ']'], '', $embedding));
  595.                             // Arguments
  596.                             $start = strpos($_embedding, '(') + 1;
  597.                             $end = strrpos($_embedding, ')');
  598.                             $arguments = explode(',', trim(substr($_embedding, $start, ($end - $start))));
  599.                             // Get Function Name
  600.                             $function = strtoupper(substr($_embedding, 0, strpos($_embedding, '(')));
  601.                             // Flash Sale Box
  602.                             if (strpos($function, 'FLASHSALEBOX') !== false) {
  603.                                 $product = $entityManager->getRepository(Product::class)->findOneByCode($arguments[0]);
  604.                                 if ($product) {
  605.                                     $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  606.                                     $result = $productHelper->getStructuredDataForProduct($product, 'list');
  607.                                     $image = $placeholder;
  608.                                     if (is_object($result['images'])) {
  609.                                         $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  610.                                     }
  611.                                     if ($result['timedSalesStartDate'] === false) {
  612.                                         $timedSalesStartDate = [
  613.                                             'year' => (new \DateTime())->format('Y'),
  614.                                             'month' => (new \DateTime())->format('M'),
  615.                                             'day' => (new \DateTime())->format('d'),
  616.                                             'hour' => (new \DateTime())->format('H'),
  617.                                         ];
  618.                                     } else {
  619.                                         $timedSalesStartDate = $result['timedSalesStartDate'];
  620.                                     }
  621.                                     if ($result['timedSalesEndDate'] === false) {
  622.                                         $timedSalesEndDate = [
  623.                                             'year' => (new \DateTime())->format('Y'),
  624.                                             'month' => (new \DateTime())->format('M'),
  625.                                             'day' => (new \DateTime())->format('d'),
  626.                                             'hour' => (new \DateTime())->format('H'),
  627.                                         ];
  628.                                     } else {
  629.                                         $timedSalesEndDate = $result['timedSalesEndDate'];
  630.                                     }
  631.                                     $flashSaleProduct = [
  632.                                         'id' => $result['id'],
  633.                                         'title' => $result['title'],
  634.                                         'vendor' => $result['vendor'],
  635.                                         'labels' => $result['badges'],
  636.                                         'rawPrice' => $result['rawPrice'],
  637.                                         'price' => $result['vatPrice'],
  638.                                         'rawSpecial' => ($result['isDiscounted'] ? $result['rawDiscountPrice'] : false),
  639.                                         'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  640.                                         'image' => $image,
  641.                                         'attributes' => $result['attributes'],
  642.                                         'available' => $result['availableQty'],
  643.                                         'href' => $this->url($request)->link('product', [
  644.                                             'product_id' => $result['id'],
  645.                                             'isBazaar'   => $result['isBazaar'] ?? 0
  646.                                         ]),
  647.                                         'active' => $result['active'],
  648.                                         'timedSalesActive' => $result['timedSalesActive'],
  649.                                         'timedSalesStartDate' => $timedSalesStartDate,
  650.                                         'timedSalesEndDate' => $timedSalesEndDate,
  651.                                     ];
  652.                                     $data['embeddings'][] = [
  653.                                         'type' => 'flashsalebox',
  654.                                         'search' => $embedding,
  655.                                         'data' => $flashSaleProduct,
  656.                                     ];
  657.                                 }
  658.                             } // Product Type
  659.                             elseif (strpos($function, 'PRODUCTTYPE') !== false) {
  660.                                 // Where
  661.                                 $where = '';
  662.                                 if (isset($arguments[0])) {
  663.                                     $where .= ' AND p.type = ' . (int)$arguments[0];
  664.                                 }
  665.                                 if (isset($arguments[1]) && (int)$arguments[1] == 1) {
  666.                                     $where .= ' AND pm.discounted = 1';
  667.                                 }
  668.                                 // Order By
  669.                                 $orderBy = 'pm.currentVatPrice ';
  670.                                 if (isset($arguments[2])) {
  671.                                     if (strotupper($arguments[2]) == 'CREATED') {
  672.                                         $orderBy = 'p.crated ';
  673.                                     } elseif (strotupper($arguments[2]) == 'AVAILABLE') {
  674.                                         $orderBy = 'p.available ';
  675.                                     }
  676.                                 }
  677.                                 if (isset($arguments[3]) && strotupper($arguments[3]) == 'DESC') {
  678.                                     $orderBy .= 'DESC';
  679.                                 } else {
  680.                                     $orderBy .= 'ASC';
  681.                                 }
  682.                                 // Limit
  683.                                 if (isset($arguments[4]) && (int)$arguments[4] > 0 && (int)$arguments[4] <= 6) {
  684.                                     $limit = (int)$arguments[4];
  685.                                 } else {
  686.                                     $limit = 6;
  687.                                 }
  688.                                 // Placeholder
  689.                                 $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  690.                                 // Products
  691.                                 $products = [];
  692.                                 $productsByType = $entityManager->createQuery("SELECT p 
  693.                                         FROM AtechNetCoreBundle:Product p 
  694.                                         LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = ( 
  695.                                             SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . " 
  696.                                         ) 
  697.                                         WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1" . $where . " 
  698.                                         ORDER BY " . $orderBy . ", p.updated DESC")
  699.                                     ->setMaxResults($limit)
  700.                                     ->getResult();
  701.                                 $results = $productHelper->getStructuredDataForProducts($productsByType);
  702.                                 foreach ($results as $result) {
  703.                                     $image = $placeholder;
  704.                                     if (is_object($result['images'])) {
  705.                                         $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  706.                                     }
  707.                                     $products[] = [
  708.                                         'id' => $result['id'],
  709.                                         'title' => ProductHelper::getHeadingTitle($result),
  710.                                         'vendor' => $result['vendor'],
  711.                                         'vendorId' => $result['vendorId'],
  712.                                         'labels' => $result['badges'],
  713.                                         'price' => $result['vatPrice'],
  714.                                         'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  715.                                         'rawPrice' => $result['rawPrice'],
  716.                                         'rawDiscountPrice' => $result['rawDiscountPrice'],
  717.                                         'image' => $image,
  718.                                         'attributes' => $result['attributes'],
  719.                                         'attributesListTxt' => $result['attributesListTxt'],
  720.                                         'available' => $result['availableQty'],
  721.                                         'type' => $result['productType'],
  722.                                         'typeId' => $result['productTypeId'],
  723.                                         'href' => $this->url($request)->link('product', [
  724.                                             'product_id' => $result['id'],
  725.                                             'isBazaar'   => $result['isBazaar'] ?? 0
  726.                                         ]),
  727.                                         'active' => $result['active'],
  728.                                         'timedSalesActive' => $result['timedSalesActive'],
  729.                                         'reviewCount' => $result['reviewCount'],
  730.                                         'reviewStars' => $result['reviewStars'],
  731.                                         'reviews' => $result['reviews'],
  732.                                         'freeShipping' => $result['freeShipping'],
  733.                                     ];
  734.                                 }
  735.                                 $data['embeddings'][] = [
  736.                                     'type' => 'producttype',
  737.                                     'search' => $embedding,
  738.                                     'data' => $products,
  739.                                 ];
  740.                             } // Products
  741.                             elseif (strpos($function, 'PRODUCTS') !== false) {
  742.                                 // Placeholder
  743.                                 $placeholder = $this->getImage('placeholder.png', '')->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  744.                                 // Products
  745.                                 $products = [];
  746.                                 $selectedProducts = $entityManager->createQuery("SELECT p 
  747.                                         FROM AtechNetCoreBundle:Product p 
  748.                                         LEFT JOIN AtechNetCoreBundle:ProductMeta pm WITH pm.id = (
  749.                                             SELECT pm2.id FROM AtechNetCoreBundle:ProductMeta pm2 WHERE pm2.product = p.id AND pm2.domain = " . $multiStore->getDomainId() . "
  750.                                         ) 
  751.                                         WHERE pm.active = 1 AND p.available > 0 AND pm.orderable = 1 AND pm.listed = 1 AND p.code IN (" . implode(',', $arguments) . ") 
  752.                                         ORDER BY pm.currentVatPrice ASC, p.updated DESC")
  753.                                     ->setMaxResults(6)
  754.                                     ->getResult();
  755.                                 $results = $productHelper->getStructuredDataForProducts($selectedProducts);
  756.                                 foreach ($results as $result) {
  757.                                     $image = $placeholder;
  758.                                     if (is_object($result['images'])) {
  759.                                         $image = $this->getImage($result['images'], 'product/' . $result['code'])->resize(Image::PRODUCT_LIST_THUMB_WIDTH, Image::PRODUCT_LIST_THUMB_HEIGHT);
  760.                                     }
  761.                                     $products[] = [
  762.                                         'id' => $result['id'],
  763.                                         'title' => ProductHelper::getHeadingTitle($result),
  764.                                         'vendor' => $result['vendor'],
  765.                                         'vendorId' => $result['vendorId'],
  766.                                         'labels' => $result['badges'],
  767.                                         'price' => $result['vatPrice'],
  768.                                         'special' => ($result['isDiscounted'] ? $result['discountVatPrice'] : false),
  769.                                         'rawPrice' => $result['rawPrice'],
  770.                                         'rawDiscountPrice' => $result['rawDiscountPrice'],
  771.                                         'image' => $image,
  772.                                         'attributes' => $result['attributes'],
  773.                                         'attributesListTxt' => $result['attributesListTxt'],
  774.                                         'available' => $result['availableQty'],
  775.                                         'type' => $result['productType'],
  776.                                         'typeId' => $result['productTypeId'],
  777.                                         'href' => $this->url($request)->link('product', [
  778.                                             'product_id' => $result['id'],
  779.                                             'isBazaar'   => $result['isBazaar'] ?? 0
  780.                                         ]),
  781.                                         'active' => $result['active'],
  782.                                         'timedSalesActive' => $result['timedSalesActive'],
  783.                                         'reviewCount' => $result['reviewCount'],
  784.                                         'reviewStars' => $result['reviewStars'],
  785.                                         'reviews' => $result['reviews'],
  786.                                         'freeShipping' => $result['freeShipping'],
  787.                                     ];
  788.                                 }
  789.                                 $data['embeddings'][] = [
  790.                                     'type' => 'products',
  791.                                     'search' => $embedding,
  792.                                     'data' => $products,
  793.                                 ];
  794.                             } // Invalid Function
  795.                             else {
  796.                                 $data['content'] = str_replace($embedding, '', $data['content']);
  797.                             }
  798.                         }
  799.                     }
  800.                 }
  801.                 $domain = $multiStore->getDomain();
  802.                 $data['precision'] = $domain->getPricePrecision();
  803.                 $data['currency'] = $domain->getCurrency();
  804.                 $data['warrantyYear'] = $this->getWarrantyForNonProductText($domain->getId());
  805.                 //<- Embeddings
  806.                 $data['content'] = str_replace('&nbsp;', ' ', $data['content']);
  807.                 $data['header'] = $this->getHeader($request);
  808.                 $data['footer'] = $this->getFooter($request);
  809.                 $data['columnRight'] = $this->getColumnRight($request);
  810.                 $data['contentBottom'] = $this->getContentBottom($request);
  811.                 $blogCategoryId = 0;
  812.                 if ($blog->getCategoryPage()) {
  813.                     $blogCategoryId = $blog->getCategoryPage()->getId();
  814.                 }
  815.                 if (empty($blogCategoryId)) {
  816.                     $domainId = $blog->getDomain()->getId();
  817.                     if ($domainId == Domain::DOMAIN_ID_RT_SK) {
  818.                         $blogCategoryId = 3;
  819.                     } elseif ($domainId == Domain::DOMAIN_ID_RT_HU) {
  820.                         $blogCategoryId = 77;
  821.                     } elseif ($domainId == Domain::DOMAIN_ID_RT_CZ) {
  822.                         $blogCategoryId = 169;
  823.                     }
  824.                 }
  825.                 $data['url'] = $this->generateUrl('blog_show', [
  826.                     'blogCategoryId' => $blogCategoryId,
  827.                     'blogId' => $seoUrl ? $seoUrl->getKeyword() : $blogId,
  828.                 ], UrlGeneratorInterface::ABSOLUTE_URL);
  829.                 
  830.                 $data['urlEscaped'] = urlencode($data['url']);
  831.                 $data['inLanguageSchema'] = MultiStore::getBCP47LanguageCode($multiStore->getDefaultLocale());
  832.                 $data['coverImage'] = $this->getSocialShareImageHelper()->getImageUrl($blog->getCoverImage(), 'blog');
  833.                 $categoryPageId = $meta->getCategoryPage();
  834.                 $languageId = $multiStore->getDefaultLanguage()->getId();
  835.                 if ($categoryPageId != null && $languageId > 0) {
  836.                     $data['articleSection'] = $entityManager->getRepository(PageMeta::class)->findOneBy([
  837.                         'category_page_id' => $categoryPageId,
  838.                         'language_id' => $languageId,
  839.                     ])->getTitle();
  840.                 }
  841.                 $data['showAdminLoginPanel'] = $request->getSession()->get('isAdminLogin');
  842.                 return $this->render('AtechNetCoreBundle/Page/blog.html.twig', $data);
  843.             }
  844.         }
  845.         return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction');
  846.     }
  847.     /**
  848.      * @Route("/blog",                                                              name="blog_main", defaults={"_locale":""})
  849.      * @Route("/{_locale<%supported_locales%>?}/blog",                              name="blog_main_locale", defaults={"_locale":""})
  850.      * @Route("/blog/{blogCategoryId}",                                             name="blog_show_category", defaults={"_locale":""})
  851.      * @Route("/{_locale<%supported_locales%>?}/blog/{blogCategoryId}",             name="blog_show_category_locale", defaults={"_locale":""})
  852.      * @Route("/blog/{blogCategoryId}/category",                                    name="blog_list", defaults={"_locale":""})
  853.      * @Route("/{_locale<%supported_locales%>?}/blog/{blogCategoryId}/category",    name="blog_list_locale", defaults={"_locale":""})
  854.      * @param Request $request
  855.      * @param int $blogCategoryId
  856.      * @return Response
  857.      * @throws InvalidArgumentException
  858.      * @throws NotSupported
  859.      * @throws NoResultException
  860.      * @throws NonUniqueResultException
  861.      */
  862.     public function listBlogAction(Request $request, $blogCategoryId = 0)
  863.     {
  864.         $data = [];
  865.         $data['hideChat'] = true;
  866.         $multiStore = $this->getMultiStoreHelper($request);
  867.         $entityManager = $this->getEntityManager();
  868.         if (!is_numeric($blogCategoryId)) {
  869.             $seoUrl = $entityManager->getRepository(SeoUrl::class)->findOneBy([
  870.                 'keyword' => $blogCategoryId,
  871.                 'language' => $this->getMultiStoreHelper($request)->getDefaultLanguage(),
  872.             ]);
  873.             if ($seoUrl) {
  874.                 $query = explode('=', $seoUrl->getQuery());
  875.                 $blogCategoryId = $query[1];
  876.                 if ($query[0] == 'blog_id') {
  877.                     $blog = $entityManager->getRepository(BlogPage::class)->findOneById($blogCategoryId);
  878.                     if ($blog) {
  879.                         $blogCategoryId = 0;
  880.                         if ($blog->getCategoryPage()) {
  881.                             $blogCategoryId = $blog->getCategoryPage()->getId();
  882.                         }
  883.                         if (empty($blogCategoryId)) {
  884.                             $domainId = $blog->getDomain()->getId();
  885.                             $blogCategoryId = $multiStore->getBlogCategoryIdByDomainId($domainId);
  886.                         }
  887.                         return $this->redirect($this->url($request)->link('blog', [
  888.                             'blog_category_id' => $blogCategoryId,
  889.                             'blog_id' => $blog->getId(),
  890.                         ]), 301);
  891.                     }
  892.                 }
  893.             } else {
  894.                 $blogCategoryId = 0;
  895.             }
  896.         }
  897.         $blogCategory = $entityManager->getRepository(CategoryPage::class)->findOneBy([
  898.             'id' => $blogCategoryId,
  899.             'published' => true,
  900.             'type' => CategoryPage::CATEGORY_TYPE_BLOG,
  901.         ]);
  902.         $customerTypeId = $this->getCustomerTypeId($request);
  903.         $translator = $this->getTranslator();
  904.         if ($blogCategory) {
  905.             $language = $multiStore->getDefaultLanguage();
  906.             $meta = $blogCategory->getMetaByLanguage($language);
  907.             if ($meta) {
  908.                 $additionalSeoTitle = '';
  909.                 if ($request->get('page')) {
  910.                     $page = $request->get('page');
  911.                     $additionalSeoTitle .= ', ' . $page . '.' . $translator->trans('page');
  912.                 } else {
  913.                     $page = 1;
  914.                 }
  915.                 if ($request->get('limit')) {
  916.                     $limit = $request->get('limit');
  917.                 } else {
  918.                     $limit = 12;
  919.                 }
  920.                 $data['breadcrumbs'] = [];
  921.                 $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  922.                 $data['breadcrumbs'][] = [
  923.                     'text' => $meta->getTitle(),
  924.                     'href' => $this->url($request)->link('blog_category', [
  925.                         'blog_category_id' => $blogCategory->getId(),
  926.                     ]),
  927.                 ];
  928.                 $data['seoTitle'] = $meta->getSeoTitle() . $additionalSeoTitle;
  929.                 if (empty($data['seoTitle'])) {
  930.                     $data['seoTitle'] = $meta->getTitle() . $additionalSeoTitle;
  931.                 }
  932.                 $data['seoDescription'] = $meta->getSeoDesc();
  933.                 $data['title'] = $meta->getTitle() . $additionalSeoTitle;
  934.                 $data['content'] = $meta->getContent();
  935.                 $data['blogs'] = [];
  936.                 $placeholder = $this->getImage('placeholder.png', '')->resize(Image::BLOG_LIST_THUMB_WIDTH, Image::BLOG_LIST_THUMB_HEIGHT);
  937.                 $queryBuilder = $entityManager->createQueryBuilder();
  938.                 $queryBuilder
  939.                     ->select('b')
  940.                     ->from('AtechNetCoreBundle:BlogPage', 'b')
  941.                     ->leftJoin('b.metas', 'm')
  942.                     ->andWhere('b.published = :published')
  943.                     ->setParameter(':published', 1)
  944.                     ->andWhere('m.language = :languageId')
  945.                     ->setParameter(':languageId', $multiStore->getDefaultLanguageId())
  946.                     ->andWhere('b.categoryPage = :categoryPage')
  947.                     ->setParameter(':categoryPage', $blogCategory->getId())
  948.                     ->andWhere('b.domain = :domain')
  949.                     ->setParameter(':domain', $multiStore->getDomainId())
  950.                     ->setFirstResult((($page - 1) * $limit))
  951.                     ->orderBy('b.created', 'DESC')
  952.                     ->setMaxResults($limit);
  953.                 $query = $queryBuilder->getQuery();
  954.                 $results = new Paginator($query);
  955.                 foreach ($results as $result) {
  956.                     if (!is_null($result->getCoverImageLink())) {
  957.                         $thumb = $this->getImage($result->getCoverImageLink(), 'blog')->resize(Image::BLOG_BLOCK_THUMB_16_9_WIDTH, Image::BLOG_BLOCK_THUMB_16_9_HEIGHT);
  958.                     } else {
  959.                         $thumb = $placeholder;
  960.                     }
  961.                     $blogCategoryId = 0;
  962.                     if ($result->getCategoryPage()) {
  963.                         $blogCategoryId = $result->getCategoryPage()->getId();
  964.                     }
  965.                     if (empty($blogCategoryId)) {
  966.                         $domainId = $result->getDomain()->getId();
  967.                         $blogCategoryId = $multiStore->getBlogCategoryIdByDomainId($domainId);
  968.                     }
  969.                     $meta = $result->getMetaByLanguage($language);
  970.                     $salesManager = $meta->getBlogPage()->getCreatedBy();
  971.                     $data['blogs'][] = [
  972.                         'title' => $meta->getTitle(),
  973.                         'created' => $meta->getCreated()->format($translator->trans($customerTypeId == 2 ? 'datetime.format.ws' : 'datetime.format')),
  974.                         'text' => $meta->getShortDesc() != '' ? $meta->getShortDesc() : substr(trim(strip_tags($meta->getContent())), 0, 350),
  975.                         'thumb' => $thumb,
  976.                         'href' => $this->url($request)->link('blog', [
  977.                             'blog_category_id' => $blogCategoryId,
  978.                             'blog_id' => $result->getId(),
  979.                         ]),
  980.                         'salesManagerName' => !is_null($salesManager) ? $salesManager->getFirstName() : '',
  981.                         'salesManagerId' => !is_null($salesManager) ? $salesManager->getId() : '',
  982.                     ];
  983.                 }
  984.                 // Totals
  985.                 $queryBuilder = $entityManager->createQueryBuilder();
  986.                 $queryBuilder
  987.                     ->select(
  988.                         $queryBuilder->expr()->countDistinct('b.id')
  989.                     )
  990.                     ->from('AtechNetCoreBundle:BlogPage', 'b')
  991.                     ->leftJoin('b.metas', 'm')
  992.                     ->andWhere('b.published = :published')
  993.                     ->setParameter(':published', 1)
  994.                     ->andWhere('m.language = :languageId')
  995.                     ->setParameter(':languageId', $multiStore->getDefaultLanguageId())
  996.                     ->andWhere('b.categoryPage = :categoryPage')
  997.                     ->setParameter(':categoryPage', $blogCategory->getId())
  998.                     ->andWhere('b.domain = :domain')
  999.                     ->setParameter(':domain', $multiStore->getDomainId());
  1000.                 $query = $queryBuilder->getQuery();
  1001.                 $result = $query->getSingleScalarResult();
  1002.                 $data['pagination'] = [
  1003.                     'total' => $result,
  1004.                     'page' => $page,
  1005.                     'limit' => $limit,
  1006.                     'noInfinite' => true,
  1007.                     'url' => $this->url($request)->link('blog_category', [
  1008.                         'blog_category_id' => $blogCategory->getId(),
  1009.                         'page' => '{page}',
  1010.                     ]),
  1011.                 ];
  1012.                 if ($page > 2) {
  1013.                     $data['linkPrev'] = $this->url($request)->link('blog_category', [
  1014.                         'blog_category_id' => $blogCategory->getId(),
  1015.                         'page' => ($page - 1),
  1016.                     ]);
  1017.                 } elseif ($page > 1) {
  1018.                     $data['linkPrev'] = $this->url($request)->link('blog_category', [
  1019.                         'blog_category_id' => $blogCategory->getId(),
  1020.                     ]);
  1021.                 } else {
  1022.                     $data['linkPrev'] = false;
  1023.                 }
  1024.    
  1025.                 if ($limit && ceil($result / $limit) > $page) {
  1026.                     $data['linkNext'] = $this->url($request)->link('blog_category', [
  1027.                         'blog_category_id' => $blogCategory->getId(),
  1028.                         'page' => ($page + 1),
  1029.                     ]);
  1030.                 } else {
  1031.                     $data['linkNext'] = false;
  1032.                 }
  1033.                 //-> Canonical Link
  1034.                 $canonicalUrl = $this->url($request)->link('blog_category', [
  1035.                     'blog_category_id' => $blogCategory->getId(),
  1036.                 ]);
  1037.                 if ($canonicalUrl != $request->getUri()) {
  1038.                     $data['canonical_link'] = $canonicalUrl;
  1039.                 } else {
  1040.                     $data['canonical_link'] = '';
  1041.                 }
  1042.                 //<- Canonical Link
  1043.                 $data['header'] = $this->getHeader($request);
  1044.                 $data['footer'] = $this->getFooter($request);
  1045.                 $data['columnRight'] = $this->getColumnRight($request);
  1046.                 $data['contentBottom'] = $this->getContentBottom($request);
  1047.                 $data['customerTypeId'] = $customerTypeId;
  1048.                 return $this->render('AtechNetCoreBundle/Page/blogList.html.twig', $data);
  1049.             }
  1050.         } elseif ($blogCategoryId == 0) {
  1051.             $multiStore = $this->getMultiStoreHelper($request);
  1052.             $entityManager = $this->getEntityManager();
  1053.             $language = $multiStore->getDefaultLanguage();
  1054.             $additionalSeoTitle = '';
  1055.             if ($request->get('tag')) {
  1056.                 $tag = $request->get('tag');
  1057.             } else {
  1058.                 $tag = false;
  1059.             }
  1060.             if ($request->get('page')) {
  1061.                 $page = $request->get('page');
  1062.                 $additionalSeoTitle .= ', ' . $page . '.' . $translator->trans('page');
  1063.             } else {
  1064.                 $page = 1;
  1065.             }
  1066.             if ($request->get('limit')) {
  1067.                 $limit = $request->get('limit');
  1068.             } else {
  1069.                 $limit = 12;
  1070.             }
  1071.             $data['breadcrumbs'] = [];
  1072.             $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  1073.             $title = in_array($multiStore->getDomain()->getId(), [1, 3]) ? $translator->trans('Blog') : $translator->trans('News');
  1074.             $data['breadcrumbs'][] = [
  1075.                 'text' => $title,
  1076.                 'href' => $this->generateUrl('blog_main'),
  1077.             ];
  1078.             $data['seoTitle'] = $data['title'] = $title . $additionalSeoTitle;
  1079.             $data['seoDescription'] = $translator->trans('Blog list description');
  1080.             $data['content'] = '';
  1081.             $data['blogs'] = [];
  1082.             $placeholder = $this->getImage('placeholder.png', '')->resize(Image::BLOG_BLOCK_THUMB_16_9_WIDTH, Image::BLOG_BLOCK_THUMB_16_9_HEIGHT);
  1083.             $queryBuilder = $entityManager->createQueryBuilder();
  1084.             $queryBuilder
  1085.                 ->select('b')
  1086.                 ->from('AtechNetCoreBundle:BlogPage', 'b')
  1087.                 ->leftJoin('b.metas', 'm')
  1088.                 ->andWhere('b.published = :published')
  1089.                 ->setParameter(':published', 1)
  1090.                 ->andWhere('m.language = :languageId')
  1091.                 ->setParameter(':languageId', $multiStore->getDefaultLanguageId())
  1092.                 ->andWhere('b.domain = :domain')
  1093.                 ->setParameter(':domain', $multiStore->getDomainId());
  1094.             if ($tag) {
  1095.                 $queryBuilder->join('b.tags', 't')
  1096.                     ->andWhere('t.slug = :tagSlug')
  1097.                     ->setParameter(':tagSlug', $tag);
  1098.             }
  1099.             $queryBuilder
  1100.                 ->setFirstResult((($page - 1) * $limit))
  1101.                 ->orderBy('b.created', 'DESC')
  1102.                 ->setMaxResults($limit);
  1103.             $query = $queryBuilder->getQuery();
  1104.             $results = new Paginator($query, $fetchJoinCollection = true);
  1105.             foreach ($results as $result) {
  1106.                 if (!is_null($result->getCoverImageLink())) {
  1107.                     $thumb = $this->getImage($result->getCoverImageLink(), 'blog')->resize(Image::BLOG_BLOCK_THUMB_16_9_WIDTH, Image::BLOG_BLOCK_THUMB_16_9_HEIGHT);
  1108.                 } else {
  1109.                     $thumb = $placeholder;
  1110.                 }
  1111.                 $blogCategoryId = 0;
  1112.                 if ($result->getCategoryPage()) {
  1113.                     $blogCategoryId = $result->getCategoryPage()->getId();
  1114.                 }
  1115.                 if (empty($blogCategoryId)) {
  1116.                     $domainId = $result->getDomain()->getId();
  1117.                     $blogCategoryId = $multiStore->getBlogCategoryIdByDomainId($domainId);
  1118.                 }
  1119.                 $meta = $result->getMetaByLanguage($language);
  1120.                 $salesManager = $meta->getBlogPage()->getCreatedBy();
  1121.                 $data['blogs'][] = [
  1122.                     'title' => $meta->getTitle(),
  1123.                     'created' => $meta->getCreated()->format($translator->trans($customerTypeId == 2 ? 'datetime.format.ws' : 'datetime.format')),
  1124.                     'text' => $meta->getShortDesc() != '' ? $meta->getShortDesc() : substr(trim(strip_tags($meta->getContent())), 0, 350),
  1125.                     'thumb' => $thumb,
  1126.                     'href' => $this->url($request)->link('blog', [
  1127.                         'blog_category_id' => $blogCategoryId,
  1128.                         'blog_id' => $result->getId(),
  1129.                     ]),
  1130.                     'salesManagerName' => !is_null($salesManager) ? $salesManager->getFirstName() : '',
  1131.                     'salesManagerId' => !is_null($salesManager) ? $salesManager->getId() : '',
  1132.                 ];
  1133.             }
  1134.             // Totals
  1135.             $queryBuilder = $entityManager->createQueryBuilder();
  1136.             $queryBuilder
  1137.                 ->select(
  1138.                     $queryBuilder->expr()->countDistinct('b.id')
  1139.                 )
  1140.                 ->from('AtechNetCoreBundle:BlogPage', 'b')
  1141.                 ->leftJoin('b.metas', 'm')
  1142.                 ->andWhere('b.published = :published')
  1143.                 ->setParameter(':published', 1)
  1144.                 ->andWhere('m.language = :languageId')
  1145.                 ->setParameter(':languageId', $multiStore->getDefaultLanguageId())
  1146.                 ->andWhere('b.domain = :domain')
  1147.                 ->setParameter(':domain', $multiStore->getDomainId());
  1148.             if ($tag) {
  1149.                 $queryBuilder->join('b.tags', 't')
  1150.                     ->andWhere('t.slug = :tagSlug')
  1151.                     ->setParameter(':tagSlug', $tag);
  1152.             }
  1153.             $query = $queryBuilder->getQuery();
  1154.             $result = $query->getSingleScalarResult();
  1155.             $data['pagination'] = [
  1156.                 'total' => $result,
  1157.                 'page' => $page,
  1158.                 'limit' => $limit,
  1159.                 'infinite' => false,
  1160.                 'url' => $this->generateUrl('blog_main', [
  1161.                     'page' => '{page}',
  1162.                 ]),
  1163.                 'moreButton' => false,
  1164.             ];
  1165.             if ($page > 2) {
  1166.                 $data['linkPrev'] = $this->generateUrl('blog_main', [
  1167.                     'page' => ($page - 1),
  1168.                 ], UrlGeneratorInterface::ABSOLUTE_URL);
  1169.             } elseif ($page > 1) {
  1170.                 $data['linkPrev'] = $this->generateUrl('blog_main', [], UrlGeneratorInterface::ABSOLUTE_URL);
  1171.             } else {
  1172.                 $data['linkPrev'] = false;
  1173.             }
  1174.             if ($limit && ceil($result / $limit) > $page) {
  1175.                 $data['linkNext'] = $this->generateUrl('blog_main', [
  1176.                     'page' => ($page + 1),
  1177.                 ], UrlGeneratorInterface::ABSOLUTE_URL);
  1178.             } else {
  1179.                 $data['linkNext'] = false;
  1180.             }
  1181.             //-> Canonical Link
  1182.             $canonicalUrl = $this->generateUrl('blog_main', [], UrlGeneratorInterface::ABSOLUTE_URL);
  1183.             if ($canonicalUrl != $request->getUri()) {
  1184.                 $data['canonical_link'] = $canonicalUrl;
  1185.             } else {
  1186.                 $data['canonical_link'] = '';
  1187.             }
  1188.             //<- Canonical Link
  1189.             $data['header'] = $this->getHeader($request);
  1190.             $data['footer'] = $this->getFooter($request);
  1191.             $data['columnRight'] = $this->getColumnRight($request);
  1192.             $data['contentBottom'] = $this->getContentBottom($request);
  1193.             $data ['customerTypeId'] = $customerTypeId;
  1194.             return $this->render('AtechNetCoreBundle/Page/blogList.html.twig', $data);
  1195.         }
  1196.         return $this->forward('App\AtechNet\CoreBundle\Controller\DefaultController::notFoundAction', []);
  1197.     }
  1198.     /**
  1199.      * @Route("/reviews",                                   name="review_list")
  1200.      * @Route("/reviews",                                   name="review_list_sk")
  1201.      * @Route("/reviews",                                   name="review_list_hu")
  1202.      * @Route("/reviews",                                   name="review_list_cz")
  1203.      * @Route("/reviews",                                   name="review_list_en")
  1204.      * @param Request $request
  1205.      * @return Response
  1206.      * @throws InvalidArgumentException
  1207.      */
  1208.     public function listReviewAction(Request $request): Response
  1209.     {
  1210.         $translator = $this->getTranslator();
  1211.         $data['breadcrumbs'] = [];
  1212.         $data['breadcrumbs'][] = $this->getBreadCrumbsBase($request);
  1213.         $data['breadcrumbs'][] = [
  1214.             'text' => $translator->trans('Client testimonials'),
  1215.             'href' => $this->generateUrl('review_list'),
  1216.         ];
  1217.         $data['header'] = $this->getHeader($request);
  1218.         $data['footer'] = $this->getFooter($request);
  1219.         $data['contentBottom'] = $this->getContentBottom($request);
  1220.         return $this->render('AtechNetCoreBundle/Page/reviewList.html.twig', $data);
  1221.     }
  1222.     /**
  1223.      * Product types for the review filter form
  1224.      *
  1225.      * @return array
  1226.      */
  1227.     private function getProductTypeList($translator): array
  1228.     {
  1229.         $types = [];
  1230.         $typesData = $this->getEntityManager()->getRepository(ProductType::class)
  1231.             ->findBy([
  1232.                 'id' => $this->getProductTypeIdListForReviewCategoryFilter(),
  1233.             ]);
  1234.         foreach ($typesData as $type) {
  1235.             $types[$type->getId()] = $translator->trans('Review ' . $type->getTitle());
  1236.         }
  1237.         $types['other'] = $translator->trans('Other');
  1238.         return $types;
  1239.     }
  1240.     /**
  1241.      * Product type Id list for the review filter form
  1242.      *
  1243.      * @return array
  1244.      */
  1245.     private function getProductTypeIdListForReviewCategoryFilter(): array
  1246.     {
  1247.         return [
  1248.             ProductType::PRODUCT_TYPE_ID_MONITOR,
  1249.             ProductType::PRODUCT_TYPE_ID_NOTEBOOK,
  1250.             ProductType::PRODUCT_TYPE_ID_PC,
  1251.             ProductType::PRODUCT_TYPE_ID_TABLET,
  1252.             ProductType::PRODUCT_TYPE_ID_PC_SET,
  1253.             ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE,
  1254.             ProductType::PRODUCT_TYPE_ID_SMARTPHONE,
  1255.         ];
  1256.     }
  1257.     /**
  1258.      * Quality statuses for the review filter form
  1259.      *
  1260.      * @param  $translator
  1261.      *
  1262.      * @return array
  1263.      */
  1264.     private function getQualityStatuses($translator): array
  1265.     {
  1266.         $qualityStatuses = Product::getQualityStatusChoices();
  1267.         if (empty($qualityStatuses)) {
  1268.             return [];
  1269.         }
  1270.         $statuses = [];
  1271.         foreach ($qualityStatuses as $id => $title) {
  1272.             if ($id == Product::QualityStatus_Platinum) {
  1273.                 continue;
  1274.             }
  1275.             if ($id != 0) {
  1276.                 $statuses[$id] = $translator->trans($title);
  1277.             }
  1278.         }
  1279.         return $statuses;
  1280.     }
  1281.     /**
  1282.      * @Route("/servis", name="service", defaults={"_locale":""})
  1283.      * @Route("/{_locale<%supported_locales%>?}/servis", name="service_locale", defaults={"_locale":""})
  1284.      * @param Request $request
  1285.      * @return Response
  1286.      * @throws InvalidArgumentException
  1287.      */
  1288.     public function serviceAction(Request $request): Response
  1289.     {
  1290.         $data = [];
  1291.         $data['form'] = $this->createForm(ServiceType::class, null, [
  1292.             'locale' => $request->getLocale(),
  1293.         ])->createView();
  1294.         $data['seoTitle'] = 'The service courier goes home!';
  1295.         $data['indexable'] = true;
  1296.         $data['seoDescription'] = 'SEO desc';
  1297.         $data['title'] = $data['seoTitle'];
  1298.         $multistore = $this->getMultiStoreHelper($request);
  1299.         $domainId = $multistore->getDomainId();
  1300.         switch ($domainId) {
  1301.             case 1:
  1302.             case 2:
  1303.                 $data['dataProtectionLink'] = '/informacie-o-ochrane-osobnych-udajov';
  1304.                 $data['claims'] = '/reklamacny-poriadok';
  1305.                 break;
  1306.             case 3:
  1307.             case 4:
  1308.                 $data['dataProtectionLink'] = '/adatkezelesi-tajekoztato';
  1309.                 $data['claims'] = '/reklamacio';
  1310.                 break;
  1311.             default:
  1312.                 $data['dataProtectionLink'] = '/informacie-o-ochrane-osobnych-udajov';
  1313.                 $data['claims'] = '/reklamacny-poriadok';
  1314.         }
  1315.         $data['header'] = $this->getHeader($request);
  1316.         $data['footer'] = $this->getFooter($request);
  1317.         $data['contentBottom'] = $this->getContentBottom($request);
  1318.         return $this->render('AtechNetCoreBundle/Page/service.html.twig', $data);
  1319.     }
  1320.     /**
  1321.      * @Route("/servis/save", name="service_save", defaults={"_locale":""})
  1322.      * @Route("/{_locale<%supported_locales%>?}/servis/save", name="service_save_locale", defaults={"_locale":""})
  1323.      * @param Request $request
  1324.      * @return Response
  1325.      * @throws InvalidArgumentException
  1326.      */
  1327.     public function saveServiceAction(Request $request): Response
  1328.     {
  1329.         $data = [];
  1330.         $translator = $this->getTranslator();
  1331.         $form = $this->createForm(ServiceType::class, null, [
  1332.             'locale' => $request->getLocale(),
  1333.         ]);
  1334.         $form->handleRequest($request);
  1335.         if ($form->isSubmitted() && $form->isValid()) {
  1336.             $captchaResponse = $request->request->get('g-recaptcha-response');
  1337.             $captchaResult = $this->verifyGoogleCaptcha($captchaResponse);
  1338.             if ($captchaResult) {
  1339.                 $formData = $form->getNormData();
  1340.                 $emailData['firstName'] = $formData['firstName'];
  1341.                 $emailData['lastName'] = $formData['lastName'];
  1342.                 $emailData['city'] = $formData['city'];
  1343.                 $emailData['street'] = $formData['street'];
  1344.                 $emailData['zip'] = $formData['zip'];
  1345.                 $emailData['phone'] = $formData['phone'];
  1346.                 $emailData['userEmail'] = $formData['email'];
  1347.                 $emailData['productType'] = $formData['productType'];
  1348.                 $emailData['errorType'] = $translator->trans(ServiceType::getErrorTypeChoices()[$formData['errorType']]);
  1349.                 $emailData['aestheticStatuses'] = '';
  1350.                 foreach ($formData['aestheticStatus'] as $aestheticStatusKey) {
  1351.                     if ($emailData['aestheticStatuses'] != '') {
  1352.                         $emailData['aestheticStatuses'] .= ', ';
  1353.                     }
  1354.                     $emailData['aestheticStatuses'] .= $translator->trans(ServiceType::getAestheticStatusChoices()[$aestheticStatusKey]);
  1355.                 }
  1356.                 $emailData['aestheticDescription'] = $formData['aestheticDescription'];
  1357.                 $emailData['accessories'] = '';
  1358.                 foreach ($formData['accessories'] as $accessoriesKey) {
  1359.                     if ($emailData['accessories'] != '') {
  1360.                         $emailData['accessories'] .= ', ';
  1361.                     }
  1362.                     $emailData['accessories'] .= $translator->trans(ServiceType::getAccessoriesChoices()[$accessoriesKey]);
  1363.                 }
  1364.                 $emailData['accessoriesDescription'] = $formData['accessoriesDescription'];
  1365.                 $emailData['dataBackup'] = $translator->trans(ServiceType::getDataBackupChoices()[$formData['dataBackup']]);
  1366.                 $emailData['errorDescription'] = $formData['errorDescription'];
  1367.                 $emailData['accountingDescription'] = $formData['accountingDescription'];
  1368.                 $emailData['subject'] = 'furbify service - ' . $emailData['productType'] . ' (' . $emailData['firstName'] . ' ' . $emailData['lastName'] . ')';
  1369.                 $emailData['locale'] = $request->getLocale();
  1370.                 $mailer = $this->getMailer();
  1371.                 $email = (new TemplatedEmail())
  1372.                     ->subject($emailData['subject'])
  1373.                     ->to('servis@furbify.eu')
  1374.                     ->htmlTemplate('AtechNetCoreBundle/Email/service.html.twig')
  1375.                     ->context($emailData);
  1376.                 $mailer->send($email);
  1377.             } else {
  1378.                 $this->addFlash(
  1379.                     'error',
  1380.                     $translator->trans('Captcha check failed, please try again!')
  1381.                 );
  1382.             }
  1383.         } else {
  1384.             return $this->redirectToRoute('service', [
  1385.                 'error' => 1,
  1386.             ]);
  1387.         }
  1388.         return $this->redirectToRoute('service', [
  1389.             'success' => 1,
  1390.         ]);
  1391.     }
  1392. }