src/WebBundle/Controller/SearchController.php line 125

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Controller;
  3. use Exception;
  4. use Import1CBundle\Helper\v3\ArticleHelper;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use WebBundle\Entity\Factory;
  7. use WebBundle\Helper\App;
  8. use WebBundle\Helper\UserHelper;
  9. use WebBundle\Repository\BuyOrderRepository;
  10. use WebBundle\Repository\PublicationRepository;
  11. /**
  12.  * Search controller.
  13.  */
  14. class SearchController extends ExtendedController
  15. {
  16.     private const LIMIT 30;
  17.     /**
  18.      * @return Response
  19.      * @throws Exception
  20.      */
  21.     public function indexAction()
  22.     {
  23.         ini_set('memory_limit''3072M');
  24.         $query trim(urldecode(App::getRequest()->get('q')));
  25.         $fullTextSearcherService $this->get('full_text_searcher');
  26.         $result $fullTextSearcherService->search($query);
  27.         $result['articles'] = ArticleHelper::getArticlesForSearch($result);
  28.         $res = [
  29.             'filters' => [
  30.                 'name' => array_slice($result['filters']['name'], 0self::LIMIT),
  31.                 'desc' => array_slice(
  32.                     $result['filters']['desc'],
  33.                     0,
  34.                     self::LIMIT count(array_slice($result['filters']['name'], 0self::LIMIT))
  35.                 ),
  36.                 'nCount' => count($result['filters']['name']),
  37.                 'dCount' => count($result['filters']['desc']),
  38.             ],
  39.             'publications' => [
  40.                 'name' => array_slice($result['publications']['name'], 0self::LIMIT),
  41.                 'desc' => array_slice(
  42.                     $result['publications']['desc'],
  43.                     0,
  44.                     self::LIMIT count(array_slice($result['publications']['name'], 0self::LIMIT))
  45.                 ),
  46.                 'nCount' => count($result['publications']['name']),
  47.                 'dCount' => count($result['publications']['desc']),
  48.             ],
  49.             'factory' => [
  50.                 'name' => array_slice($result['factory']['name'], 0self::LIMIT),
  51.                 'desc' => array_slice(
  52.                     $result['factory']['desc'],
  53.                     0,
  54.                     self::LIMIT count(array_slice($result['factory']['name'], 0self::LIMIT))
  55.                 ),
  56.                 'nCount' => count($result['factory']['name']),
  57.                 'dCount' => count($result['factory']['desc']),
  58.             ],
  59.             'collections' => [
  60.                 'name' => array_slice($result['collections']['name'], 0self::LIMIT),
  61.                 'desc' => array_slice(
  62.                     $result['collections']['desc'],
  63.                     0,
  64.                     self::LIMIT count(array_slice($result['collections']['name'], 0self::LIMIT))
  65.                 ),
  66.                 'nCount' => count($result['collections']['name']),
  67.                 'dCount' => count($result['collections']['desc']),
  68.             ],
  69.             'articles' => [
  70.                 'res' => array_slice($result['articles'], 0self::LIMIT),
  71.                 'count' => count($result['articles'])
  72.             ]
  73.         ];
  74.         $nameCount $res['filters']['nCount'] + $res['factory']['nCount'] + $res['collections']['nCount'] +
  75.             $res['articles']['count'] + $res['publications']['nCount'];
  76.         $docsCount $res['filters']['nCount'] + $res['filters']['dCount'] + $res['factory']['nCount'] +
  77.             $res['factory']['dCount'] + $res['collections']['nCount'] + $res['collections']['dCount'] +
  78.             $res['articles']['count'] + $res['publications']['nCount'] + $res['publications']['dCount'];
  79.         $trans App::getTranslator();
  80.         // формируем имя фабрики с префиксом
  81.         if ($res['factory']['name']) {
  82.             foreach ($res['factory']['name'] as $i => $r) {
  83.                 $key Factory::TYPES_KEY[$r['f_type']];
  84.                 $res['factory']['name'][$i]['f_title'] = $trans->trans($key, ['%factory%' => $r['f_name']]);
  85.             }
  86.         }
  87.         $token UserHelper::getInstance()->getToken();
  88.         /** @var BuyOrderRepository $buyOrderRepo */
  89.         $buyOrderRepo App::getContainer()->get('app.repo.order');
  90.         $buyOrderArticle $buyOrderRepo->getInfoBuyOrderArticle($token);
  91.         /** @var PublicationRepository $repoPublication */
  92.         $repoPublication App::getRepository('WebBundle:Publication');
  93.         $expressSampleTooltip null;
  94.         if ($estLink $repoPublication->getUrlBlogExpressSamples()) {
  95.             $estTxt $trans->trans('read_more');
  96.             $expressSampleTooltip = [
  97.                 'url' => $estLink,
  98.                 'text' => $estTxt,
  99.             ];
  100.         }
  101.         $output = [
  102.             'nameCount' => $nameCount,
  103.             'docsCount' => $docsCount,
  104.             'result' => $res,
  105.             'query' => $query,
  106.             'noSEOLink' => true,
  107.             'buyOrderArticle' => $buyOrderArticle,
  108.             'expressSampleTooltip' => $expressSampleTooltip,
  109.             //'noFloor' => true
  110.         ];
  111.         return $this->render('@Web/Search/show.html.twig'$output);
  112.     }
  113.     /**
  114.      * @return Response
  115.      * @throws Exception
  116.      */
  117.     public function reactAction()
  118.     {
  119.         ini_set('memory_limit''3072M');
  120.         $query trim(urldecode(App::getRequest()->get('q')));
  121.         $fullTextSearcherService $this->get('full_text_searcher');
  122.         $result $fullTextSearcherService->search($query);
  123.         $result['articles'] = ArticleHelper::getArticlesForSearch($result);
  124.         $res = [
  125.             'filters' => [
  126.                 'name' => array_slice($result['filters']['name'], 0self::LIMIT),
  127.                 'desc' => array_slice(
  128.                     $result['filters']['desc'],
  129.                     0,
  130.                     self::LIMIT count(array_slice($result['filters']['name'], 0self::LIMIT))
  131.                 ),
  132.                 'nCount' => count($result['filters']['name']),
  133.                 'dCount' => count($result['filters']['desc']),
  134.             ],
  135.             'publications' => [
  136.                 'name' => array_slice($result['publications']['name'], 0self::LIMIT),
  137.                 'desc' => array_slice(
  138.                     $result['publications']['desc'],
  139.                     0,
  140.                     self::LIMIT count(array_slice($result['publications']['name'], 0self::LIMIT))
  141.                 ),
  142.                 'nCount' => count($result['publications']['name']),
  143.                 'dCount' => count($result['publications']['desc']),
  144.             ],
  145.             'factory' => [
  146.                 'name' => array_slice($result['factory']['name'], 0self::LIMIT),
  147.                 'desc' => array_slice(
  148.                     $result['factory']['desc'],
  149.                     0,
  150.                     self::LIMIT count(array_slice($result['factory']['name'], 0self::LIMIT))
  151.                 ),
  152.                 'nCount' => count($result['factory']['name']),
  153.                 'dCount' => count($result['factory']['desc']),
  154.             ],
  155.             'collections' => [
  156.                 'name' => array_slice($result['collections']['name'], 0self::LIMIT),
  157.                 'desc' => array_slice(
  158.                     $result['collections']['desc'],
  159.                     0,
  160.                     self::LIMIT count(array_slice($result['collections']['name'], 0self::LIMIT))
  161.                 ),
  162.                 'nCount' => count($result['collections']['name']),
  163.                 'dCount' => count($result['collections']['desc']),
  164.             ],
  165.             'articles' => [
  166.                 'res' => array_slice($result['articles'], 0self::LIMIT),
  167.                 'count' => count($result['articles'])
  168.             ]
  169.         ];
  170.         $nameCount $res['filters']['nCount'] + $res['factory']['nCount'] + $res['collections']['nCount'] +
  171.             $res['articles']['count'] + $res['publications']['nCount'];
  172.         $docsCount $res['filters']['nCount'] + $res['filters']['dCount'] + $res['factory']['nCount'] +
  173.             $res['factory']['dCount'] + $res['collections']['nCount'] + $res['collections']['dCount'] +
  174.             $res['articles']['count'] + $res['publications']['nCount'] + $res['publications']['dCount'];
  175.         $trans App::getTranslator();
  176.         // формируем имя фабрики с префиксом
  177.         if ($res['factory']['name']) {
  178.             foreach ($res['factory']['name'] as $i => $r) {
  179.                 $key Factory::TYPES_KEY[$r['f_type']];
  180.                 $res['factory']['name'][$i]['f_title'] = $trans->trans($key, ['%factory%' => $r['f_name']]);
  181.             }
  182.         }
  183.         $token UserHelper::getInstance()->getToken();
  184.         /** @var BuyOrderRepository $buyOrderRepo */
  185.         $buyOrderRepo App::getContainer()->get('app.repo.order');
  186.         $buyOrderArticle $buyOrderRepo->getInfoBuyOrderArticle($token);
  187.         /** @var PublicationRepository $repoPublication */
  188.         $repoPublication App::getRepository('WebBundle:Publication');
  189.         $expressSampleTooltip null;
  190.         if ($estLink $repoPublication->getUrlBlogExpressSamples()) {
  191.             $estTxt $trans->trans('read_more');
  192.             $expressSampleTooltip = [
  193.                 'url' => $estLink,
  194.                 'text' => $estTxt,
  195.             ];
  196.         }
  197.         $output = [
  198.             'nameCount' => $nameCount,
  199.             'docsCount' => $docsCount,
  200.             'result' => $res,
  201.             'query' => $query,
  202. //            'noSEOLink'            => true,
  203.             'buyOrderArticle' => $buyOrderArticle,
  204.             'expressSampleTooltip' => $expressSampleTooltip,
  205.             'trans' => self::trans()
  206.             //'noFloor' => true
  207.         ];
  208.         return $this->renderReact('@Web/Search/index.html.twig', [
  209.             'title' => App::trans('search_result'),
  210.             'initialState' => [
  211.                 'textSearch' => $output
  212.             ]
  213.         ]);
  214.     }
  215.     /**
  216.      * @param string $type [filters|factory|collections|articles|publications]
  217.      * @param int $p номерпорции
  218.      * @param int $limit
  219.      * @return Response
  220.      * @throws Exception
  221.      */
  222.     public function portionAction($type 'filter'$p 1$limit self::LIMIT)
  223.     {
  224.         if (!in_array($type, ['filters''factory''collections''articles''publications'])) {
  225.             throw new Exception('Not valid type');
  226.         }
  227.         $trans App::getTranslator();
  228.         $query trim(urldecode(App::getRequest()->get('q')));
  229.         $fullTextSearcherService $this->get('full_text_searcher');
  230.         $result $fullTextSearcherService->search($query);
  231.         if ($type == 'articles') {
  232.             $result['articles'] = ArticleHelper::getArticlesForSearch($result);
  233.             $res $result['articles'];
  234.         } else {
  235.             $res array_merge($result[$type]['name'], $result[$type]['desc']);
  236.         }
  237.         // формируем имя фабрики с префиксом
  238.         if ($type == 'factory') {
  239.             foreach ($res as $i => $r) {
  240.                 $key Factory::TYPES_KEY[$r['f_type']];
  241.                 $res[$i]['f_title'] = $trans->trans($key, ['%factory%' => $r['f_name']]);
  242.             }
  243.         }
  244.         return $this->render('@Web/Search/portion.html.twig', [
  245.             'res' => array_slice($res, ($p $limit $limit), $limit),
  246.             'type' => $type
  247.         ]);
  248.     }
  249.     /**
  250.      * @return Response
  251.      */
  252.     public function suggesterAction()
  253.     {
  254.         $query trim(urldecode(App::getRequest()->get('q')));
  255.         $fullTextSearcherService $this->get('full_text_searcher');
  256.         $result $fullTextSearcherService->suggester($query);
  257.         return $this->render('@Web/Search/suggester.html.twig'$result);
  258.     }
  259.     /**
  260.      * Переводы для страницы коллекции
  261.      * @return array
  262.      * @throws Exception
  263.      */
  264.     private function trans()
  265.     {
  266.         /** @var PublicationRepository $repoBlog */
  267.         $repoBlog App::getRepository('WebBundle:Publication');
  268.         $translator App::getTranslator();
  269.         return [
  270.             'loc' => App::getCurLocale(true),
  271.             'lang' => App::getCurLocale(),
  272.             'settings' => $translator->trans('collection_marks'),
  273.             'added' => $translator->trans('collection_added'),
  274.             'star' => $translator->trans('reviews.stars.one'),
  275.             'stars' => $translator->trans('reviews.stars.many'),
  276.             'reviewShowAll' => $translator->trans('product_review_show_all'),
  277.             'catalogMoreDown' => $translator->trans('catalog_more_down'),
  278.             'catalogMoreUp' => $translator->trans('catalog_more_up'),
  279.             'descCollectionHeader' => $translator->trans('descCollectionHeader'),
  280.             'collectionVideos' => $translator->trans('collection.videos'),
  281.             'collectionBack' => $translator->trans('collection_back'),
  282.             'productReview' => [
  283.                 $translator->trans('product_review'),
  284.                 $translator->trans('product_review_'),
  285.                 $translator->trans('product_reviews')
  286.             ],
  287.             'of' => $translator->trans('of'),
  288.             'more' => $translator->trans('show_more'),
  289.             'effect' => $translator->trans('left_menu_effect'),
  290.             'style' => $translator->trans('left_menu_style'),
  291.             'item' => [
  292.                 'collection' => $translator->trans('collection_name'),
  293.                 'factory' => $translator->trans('catalog_factory'),
  294.                 'characteristics' => $translator->trans('article_characteristics'),
  295.                 'tile' => $translator->trans('footer_tile'),
  296.                 'item' => $translator->trans('collection_article'),
  297.                 'header' => $translator->trans('collection_articles_d'),
  298.                 'formats' => $translator->trans('article_item_formats'),
  299.                 'cm' => $translator->trans('left_menu_cm'),
  300.                 'inch' => '″',
  301.                 'diameter' => $translator->trans('article_item_diameter'),
  302.                 'pcs' => $translator->trans('buyOrder.th.pcs'),
  303.                 'sets' => $translator->trans('measure_sets'),
  304.                 'price' => $translator->trans('catalog_price'),
  305.                 'vat' => [
  306.                     'label' => $translator->trans('vat.label'),
  307.                     'included' => $translator->trans('vat.included'),
  308.                     'excluded' => $translator->trans('vat.excluded')
  309.                 ],
  310.                 'info' => $translator->trans('article_item_more_info'),
  311.                 'infoLess' => $translator->trans('article_item_less_info'),
  312.                 'order' => [
  313.                     'help' => $translator->trans('buyOrder.help'),
  314.                     'ceilToPallet' => $translator->trans('collection_ceil_to_pallet'),
  315.                     'atentionPallet' => $translator->trans('collection_atention_pallet'),
  316.                     'popupAutoChangeCountArts' => $translator->trans('popup_auto_change_count_arts'),
  317.                 ],
  318.                 'up' => $translator->trans('article.price.up'),
  319.                 'down' => $translator->trans('article.price.down'),
  320.                 'readMore' => $translator->trans('read_more'),
  321.                 'titleAddedArticle' => $translator->trans('buyOrder.titleAddedArticle'),
  322.                 'addIntoOrder' => $translator->trans('buy_order.add_into_order'),
  323.                 'headerOrderAdd' => $translator->trans('header_order_add'),
  324.                 'draft' => $translator->trans('order.status.draft'),
  325.                 'typeMain' => $translator->trans('article.type.main'),
  326.                 'typeSample' => $translator->trans('article.type.sample'),
  327.                 'sampleText' => $translator->trans('article.type.sampleText'),
  328.                 'typeCompare' => $translator->trans('article.type.compare'),
  329.                 'compareText' => $translator->trans('article.type.compareText'),
  330.                 'type3d' => $translator->trans('article.type.3d'),
  331.                 'text3d' => $translator->trans('article.type.3dText'),
  332.                 'articleOrderOver' => $translator->trans('article.order.over'),
  333.                 'articleOrderMultiplies' => $translator->trans('article.order.multiplies'),
  334.                 'articlePricePerPallet' => $translator->trans('article.price.perPallet'),
  335.                 'articlePriceNoLessPallet' => $translator->trans('article.price.noLessPallet'),
  336.                 'articlePricePalleteFrom' => $translator->trans('article.pricePallete.from'),
  337.                 'articlePriceFrom' => $translator->trans('article.price.from'),
  338.                 'articlePricePalleteUnder' => $translator->trans('article.pricePallete.under'),
  339.                 'articlePriceFromTo' => $translator->trans('article.price.from_to'),
  340.                 'articlePriceFromLine' => $translator->trans('catalog_price_from'),
  341.                 'articlePriceToLine' => $translator->trans('dimensions_to'),
  342.                 'boxArticleSingle' => $translator->trans('box_article_single'),
  343.                 'boxArticlePlural' => $translator->trans('box_article_plural'),
  344.                 'articleNoImgTitle' => $translator->trans('article.no_img'),
  345.                 'collectionAddOrder' => $translator->trans('collection_add_order'),
  346.                 'discountinued' => $translator->trans('article.discountinued'),
  347.                 'tempUnavailable' => $translator->trans('article.temp_unavailable')
  348.             ],
  349.             'sample' => [
  350.                 'folder' => $translator->trans('sample.folder.text'),
  351.                 'original' => $translator->trans('sample.original.text'),
  352.                 'piece' => $translator->trans('sample.piece.text'),
  353.                 'title' => $translator->trans('samplePopup.title'),
  354.                 'noMoreShow' => $translator->trans('samplePopup.noMoreShow'),
  355.                 'withDecl' => $translator->trans('article.type.sampleWithDecl')
  356.             ],
  357.             'searchResultQuery' => $translator->trans('search_result_query'),
  358.             'headers' => [
  359.                 'all' => $translator->trans('all'),
  360.                 'catalog' => $translator->trans('catalog_catalog'),
  361.                 'factories' => $translator->trans('left_menu_factories'),
  362.                 'collections' => $translator->trans('left_menu_collections'),
  363.                 'items' => $translator->trans('collection_articles_d'),
  364.                 'blogs' => $translator->trans('blog_blogs')
  365.             ],
  366.             'searchNoResult' => $translator->trans('search_no_result')
  367.         ];
  368.     }
  369.     public function googleSearch(): Response
  370.     {
  371.         return $this->render('@Web/Search/google_search.html.twig');
  372.     }
  373. }