src/WebBundle/Service/LeftMenuService.php line 81

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Service;
  3. use FlexApp\Constant\TimeConstant;
  4. use FlexApp\Service\RedisCachePool;
  5. use Symfony\Contracts\Translation\TranslatorInterface;
  6. use WebBundle\Entity\Collection;
  7. use WebBundle\Entity\FilterEntity;
  8. use WebBundle\Enum\LotusCollectionStatusEnum;
  9. use WebBundle\Helper\App;
  10. use WebBundle\Helper\HideFactoryCountriesHelper;
  11. use WebBundle\Helper\LocaleHelper;
  12. use WebBundle\Helper\RequestHelper;
  13. use WebBundle\Helper\StrHelper;
  14. use WebBundle\Repository\CollectionRepository;
  15. use WebBundle\Repository\FactoryRepository;
  16. use WebBundle\Repository\FilterRepository;
  17. use WebBundle\Repository\PublicationRepository;
  18. class LeftMenuService
  19. {
  20.     /** @required */
  21.     public SphinxSearcherService $sphinxSearcherService;
  22.     /** @required */
  23.     public CollectionRepository $collectionRepository;
  24.     /** @required */
  25.     public FactoryRepository $factoryRepository;
  26.     /** @required */
  27.     public FilterRepository $filterRepository;
  28.     /** @required */
  29.     public PublicationRepository $publicationRepository;
  30.     /** @required */
  31.     public TranslatorInterface $translator;
  32.     public function getDataMenuLite(): array
  33.     {
  34.         /** @var Collection $coll */
  35.         $route RequestHelper::get('_route');
  36.         $searchParams = [];
  37.         $locale App::getCurLocale();
  38.         $localeUc ucfirst($locale);
  39.         $showReset false;
  40.         // тут получаем полную выборку для калькулятора по стране //пересчет делать через ajax
  41.         $redisCachePool App::getContainer()->get(RedisCachePool::class)->getPool();
  42.         $memKeyCalc 'all_calculate_' App::getCurCountry() . '_' LocaleHelper::getUserMeasure(); //этот кеш пересечета фильтра ToDO добавить в команду php bin/console sphinx:count
  43.         $memcKeyCountColl 'collection_count_not_filtered' App::getCurCountry();
  44.         $allCalculate $redisCachePool->getItem($memKeyCalc);
  45.         if ($allCalculate->isHit()) {
  46.             $calculate $allCalculate->get();
  47.         } else {
  48.             $calculate false;
  49.         }
  50.         $countCollItem $redisCachePool->getItem($memcKeyCountColl);
  51.         //это только количество колекций в стране, загружаются же левые через ajax
  52.         if (!$countCollItem->isHit()) {
  53.             $aColls $this->collectionRepository->getCollections([
  54.                 'order' => 'c.id',
  55.                 'onlyCF' => true,
  56.                 'leftCollectionCount' => true,
  57.                 'locale' => $locale,
  58.             ]);
  59.             $countColl count($aColls);
  60.         } else {
  61.             $countColl $countCollItem->get();
  62.         }
  63.         $collection = [
  64.             'name' => 'collection',
  65.             'alias' => 'left_menu_collections',
  66.             'first' => $this->translator->trans('left_menu_collections'),
  67.             'type' => 'select',
  68.             'selected' => null,
  69.             'count' => $countColl,
  70.             'countCur' => $countColl,
  71.             'list' => [],
  72.         ];
  73.         // без учета скрытых фабрик как оказалось не только скрытых но и тех что не выводим колекции по какимто причинам
  74.         $countFactory $calculate count($calculate['factory']) : $this->filterRepository->getBrand(['count' => 1]);
  75.         // формирование подсказки для быстрых образцов
  76.         $expressSampleTooltip null;
  77.         if ($estLink $this->publicationRepository->getUrlBlogExpressSamples()) {
  78.             $linkMore $this->translator->trans('how_to_order_sample');
  79.             $linkMore "<a href=\"$estLink\" target='_blank' onclick=\"event.stopPropagation()\">$linkMore</a>";
  80.             $estTxt $this->translator->trans('menu.express_delivery.tooltip', ['%link_more%' => $linkMore]);
  81.             $expressSampleTooltip = [
  82.                 'url' => $estLink,
  83.                 'text' => $estTxt,
  84.             ];
  85.         }
  86.         //////////////////////////////////////////////////////////
  87.         $filters = [
  88.             // фабрики
  89.             'factory' => [
  90.                 'name' => 'factory',
  91.                 'alias' => 'left_menu_factories',
  92.                 'title' => $this->translator->trans('left_menu_factories'),
  93.                 'first' => $this->translator->trans('left_menu_factories'),
  94.                 'type' => 'select',
  95.                 'selected' => null,
  96.                 'count' => $countFactory,
  97.                 'countCur' => $countFactory,
  98.                 //'countNew' => $countNewFactory,//новые фабрики не нужны
  99.                 'list' => [],
  100.             ],
  101.             // Фактура под
  102.             'getFacturas' => [
  103.                 'name' => 'effect',
  104.                 'alias' => 'left_menu_effect',
  105.                 'title' => $this->translator->trans('left_menu_effect'),
  106.                 'first' => $this->translator->trans('left_all_effect'),
  107.                 'type' => 'checkbox',
  108.                 'selected' => null,
  109.                 'list' => [],
  110.             ],
  111.             'getStone' => [
  112.                 'name' => 'effect',
  113.                 'alias' => 'left_menu_effect',
  114.                 'title' => $this->translator->trans('left_menu_effect'),
  115.                 'first' => $this->translator->trans('left_all_effect'),
  116.                 'type' => 'checkbox',
  117.                 'selected' => null,
  118.                 'list' => [],
  119.             ],
  120.             // Стиль
  121.             'getStyles' => [
  122.                 'name' => 'style',
  123.                 'alias' => 'left_menu_style',
  124.                 'title' => $this->translator->trans('left_menu_style'),
  125.                 'first' => $this->translator->trans('left_all_style'),
  126.                 'type' => 'checkbox',
  127.                 'selected' => null,
  128.                 'list' => [],
  129.             ],
  130.             // Цена руб/м2
  131.             'getCostCategory' => [
  132.                 'name' => 'price',
  133.                 'alias' => 'left_menu_price',
  134.                 'title' => $this->translator->trans('left_menu_price'),
  135.                 'first' => $this->translator->trans('left_all_price'),
  136.                 'type' => 'checkbox',
  137.                 'selected' => null,
  138.                 'list' => [],
  139.             ],
  140.             // Цвет
  141.             'getColors' => [
  142.                 'name' => 'color',
  143.                 'alias' => 'left_menu_color',
  144.                 'title' => $this->translator->trans('left_menu_color'),
  145.                 'first' => $this->translator->trans('left_all_color'),
  146.                 'type' => 'checkbox',
  147.                 'selected' => null,
  148.                 'list' => [],
  149.             ],
  150.             // Цвет
  151.             'getTypeUsings' => [
  152.                 'name' => 'using',
  153.                 'alias' => 'left_menu_use',
  154.                 'title' => $this->translator->trans('left_menu_use'),
  155.                 'first' => $this->translator->trans('left_all_use'),
  156.                 'type' => 'checkbox',
  157.                 'selected' => null,
  158.                 'list' => [],
  159.             ],
  160.             // Экспресс образцы
  161.             'expressSample' => [
  162.                 'name' => 'expressSample',
  163.                 'alias' => 'articleQuickSample',
  164.                 'title' => $this->translator->trans('articleQuickSample'),
  165.                 'first' => $this->translator->trans('articleQuickSample'),
  166.                 'type' => 'checkbox',
  167.                 'selected' => null,
  168.                 'tooltip' => $expressSampleTooltip,
  169.                 'list' => [],
  170.             ],
  171.         ];
  172.         $queryKeys = [];
  173.         if ($route == 'app_catalog') {
  174.             $queryKeys explode('&'RequestHelper::get('key'));
  175.         }
  176.         if ($route == 'app_collection' || $route == 'app_tile') {
  177.             $collUrl RequestHelper::get('collectionUrl');
  178.             $factUrl StrHelper::toLower(RequestHelper::get('factoryUrl'));
  179.             $factId $this->factoryRepository->getIdByUrl($factUrl);
  180.             if ($collUrl) {
  181.                 $coll $this->collectionRepository->findOneBy(['url' => $collUrl'factory' => $factId,]);
  182.                 if (
  183.                     $coll
  184.                     && ($coll->getStatus() == LotusCollectionStatusEnum::PUBLISHED
  185.                         || $coll->getStatus() == LotusCollectionStatusEnum::DISCONTINUED
  186.                         || $coll->getStatus() == LotusCollectionStatusEnum::TEMPORARY_NOT_PUBLISHED
  187.                     )
  188.                 ) {
  189.                     $oFactory $coll->getFactory()->getFilter();
  190.                     if ($oFactory) {
  191.                         $queryKeys[] = $factUrl;
  192.                         $rowCollection = [
  193.                             'id' => $coll->getId(),
  194.                             'url' => $coll->getUrl(),
  195.                             'name' => $coll->getName(),
  196.                             'dataLink' => App::generateUrl(
  197.                                 'app_collection',
  198.                                 [
  199.                                     'factoryUrl' => $factUrl,
  200.                                     'collectionUrl' => $coll->getUrl(),
  201.                                 ]
  202.                             ),
  203.                             'factory' => [
  204.                                 'id' => $oFactory->getOldId(),
  205.                                 'name' => $oFactory->getCountry()->getPage()->{'getNameMenu' ucfirst($locale)}(),
  206.                             ],
  207.                         ];
  208.                         $collection['selected'] = $rowCollection;
  209.                         $searchParams['collection'] = $rowCollection;
  210.                         $filters['factory']['countCur'] = 1;
  211.                     }
  212.                 }
  213.             }
  214.             // получение доп фильтров коллекции, для передачи в короткое меню
  215.             $filterKeys RequestHelper::get('elementId');
  216.             if ($filterKeys) {
  217.                 $filterKeys explode('&'$filterKeys);
  218.                 $queryKeys array_merge($queryKeys$filterKeys);
  219.             }
  220.         }
  221.         $aFilters $this->filterRepository->getArrListForMenu(
  222.             ['effect''style''samples''price''color''using''brand'],
  223.             $locale
  224.         );
  225.         $subFilter = [];
  226.         /** @var FilterEntity $filter */
  227.         foreach ($aFilters as $aFilter) {
  228.             foreach ($aFilter as $filter) {
  229.                 if (!empty($filters[$filter['oldCommand']])) {
  230.                     $url $filter['url' $localeUc];
  231.                     $name $filter['pageNameMenu' $localeUc];
  232.                     if (!$name) {
  233.                         continue;
  234.                     }
  235.                     // костыль для фильтра цен, что бы показывать верно для разных стран
  236.                     if ($filter['groupsAltName'] == 'price') {
  237.                         $name LocaleHelper::getNamePriceFilter($name$locale);
  238.                     }
  239.                     //удаляем фильтры которые и есть и нет если был пересчет например https://tile.expert/en-us/advanced-search?c=/en-us/catalogue/price-under-10
  240.                     if ($calculate && (empty($calculate[$filter['oldCommand']]) || empty($calculate[$filter['oldCommand']][$filter['id']]))) {
  241.                         continue;
  242.                     }
  243.                     $row = [
  244.                         'id' => $filter['oldId'],
  245.                         'fid' => $filter['id'],
  246.                         'pid' => $filter['pid'],
  247.                         'groups' => $filter['groupsAltName'],
  248.                         'url' => $url,
  249.                         'alias' => $filter['leftMenu'],
  250.                         'important' => $filter['important'],
  251.                         'name' => $name,
  252.                         'selected' => [],
  253.                         'count' => !empty($calculate[$filter['oldCommand']]) && !empty($calculate[$filter['oldCommand']][$filter['id']]) ? $calculate[$filter['oldCommand']][$filter['id']] : $filter['paramCount'],
  254.                         //'new_count' =>!empty($calculate[$filter['oldCommand']]) && !empty($calculate[$filter['oldCommand']][$filter['id']]) ? $calculate[$filter['oldCommand']][$filter['id']] : 0,
  255.                         'sub' => [],
  256.                     ];
  257.                     if (!empty($filter['country'])) {
  258.                         $row['country'] = [
  259.                             'id' => $filter['country']['oldId'],
  260.                             'name' => $this->translator->trans($filter['country']['leftMenu']),
  261.                         ];
  262.                     }
  263.                     if (in_array($row['url'], $queryKeys)) {
  264.                         $showReset true;
  265.                         $row['selected'] = $row['url'];
  266.                         $filters[$filter['oldCommand']]['selected'] = $row;
  267.                         if ($filter['oldCommand'] == 'factory') {
  268.                             $collection['countCur'] = $this->collectionRepository->countCollections(['factoryId' => $row['id']]);
  269.                         }
  270.                     }
  271.                     // не кладём в список фабрики
  272.                     if ($filter['oldCommand'] != 'factory') {
  273.                         if ($filter['pid'] != null) {
  274.                             if ($filter['id'] != '10147') {
  275.                                 $subFilter[$row['pid']][$row['fid']] = $row;
  276.                             }
  277.                         } else {
  278.                             $filters[$filter['oldCommand']]['list'][] = $row;
  279.                         }
  280.                     }
  281.                 }
  282.             }
  283.         }
  284.         $factory $filters['factory'];
  285.         unset($filters['factory']);
  286.         $searchParams['factory'] = $factory;
  287.         $filters $this->addSubFilters($filters$subFilter);
  288.         return [
  289.             'locale' => $localeUc,
  290.             'searchParams' => $searchParams,
  291.             'filters' => $filters,
  292.             'collection' => $collection,
  293.             'brand' => $factory,
  294.             'showReset' => $showReset,
  295.             'countryList' => App::getCountryList(),
  296.         ];
  297.     }
  298.     /**
  299.      * Вставляем вложенные фильтры, если есть такие
  300.      *
  301.      * @param array $filterGroups
  302.      * @param array $subFilter
  303.      * @return array
  304.      */
  305.     private function addSubFilters(array $filterGroups, array $subFilter): array
  306.     {
  307.         $filterGroups array_filter($filterGroups, static fn(array $group) => !empty($group['list']));
  308.         foreach ($filterGroups as &$filterGroup) {
  309.             foreach ($filterGroup['list'] as $key => &$filter) {
  310.                 if (!empty($subFilter[$filter['fid']])) {
  311.                     //если родитель выбран, то и дети выбраны
  312.                     if (!empty($filter['selected'])) {
  313.                         $filter['selected'] = [];
  314.                         foreach ($subFilter[$filter['fid']] as $sk => $sv) {
  315.                             $subFilter[$filter['fid']][$sk]['selected'] = $subFilter[$filter['fid']][$sk]['url'];
  316.                             $filterGroup['selected'][] = $subFilter[$filter['fid']][$sk];
  317.                         }
  318.                     }
  319.                     $filter['sub'] = array_values($subFilter[$filter['fid']]);
  320.                 }
  321.             }
  322.         }
  323.         return $filterGroups;
  324.     }
  325. }