<?php
namespace WebBundle\Service;
use FlexApp\Constant\TimeConstant;
use FlexApp\Service\RedisCachePool;
use Symfony\Contracts\Translation\TranslatorInterface;
use WebBundle\Entity\Collection;
use WebBundle\Entity\FilterEntity;
use WebBundle\Enum\LotusCollectionStatusEnum;
use WebBundle\Helper\App;
use WebBundle\Helper\HideFactoryCountriesHelper;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\RequestHelper;
use WebBundle\Helper\StrHelper;
use WebBundle\Repository\CollectionRepository;
use WebBundle\Repository\FactoryRepository;
use WebBundle\Repository\FilterRepository;
use WebBundle\Repository\PublicationRepository;
class LeftMenuService
{
/** @required */
public SphinxSearcherService $sphinxSearcherService;
/** @required */
public CollectionRepository $collectionRepository;
/** @required */
public FactoryRepository $factoryRepository;
/** @required */
public FilterRepository $filterRepository;
/** @required */
public PublicationRepository $publicationRepository;
/** @required */
public TranslatorInterface $translator;
public function getDataMenuLite(): array
{
/** @var Collection $coll */
$route = RequestHelper::get('_route');
$searchParams = [];
$locale = App::getCurLocale();
$localeUc = ucfirst($locale);
$showReset = false;
// тут получаем полную выборку для калькулятора по стране //пересчет делать через ajax
$redisCachePool = App::getContainer()->get(RedisCachePool::class)->getPool();
$memKeyCalc = 'all_calculate_' . App::getCurCountry() . '_' . LocaleHelper::getUserMeasure(); //этот кеш пересечета фильтра ToDO добавить в команду php bin/console sphinx:count
$memcKeyCountColl = 'collection_count_not_filtered' . App::getCurCountry();
$allCalculate = $redisCachePool->getItem($memKeyCalc);
if ($allCalculate->isHit()) {
$calculate = $allCalculate->get();
} else {
$calculate = false;
}
$countCollItem = $redisCachePool->getItem($memcKeyCountColl);
//это только количество колекций в стране, загружаются же левые через ajax
if (!$countCollItem->isHit()) {
$aColls = $this->collectionRepository->getCollections([
'order' => 'c.id',
'onlyCF' => true,
'leftCollectionCount' => true,
'locale' => $locale,
]);
$countColl = count($aColls);
} else {
$countColl = $countCollItem->get();
}
$collection = [
'name' => 'collection',
'alias' => 'left_menu_collections',
'first' => $this->translator->trans('left_menu_collections'),
'type' => 'select',
'selected' => null,
'count' => $countColl,
'countCur' => $countColl,
'list' => [],
];
// без учета скрытых фабрик как оказалось не только скрытых но и тех что не выводим колекции по какимто причинам
$countFactory = $calculate ? count($calculate['factory']) : $this->filterRepository->getBrand(['count' => 1]);
// формирование подсказки для быстрых образцов
$expressSampleTooltip = null;
if ($estLink = $this->publicationRepository->getUrlBlogExpressSamples()) {
$linkMore = $this->translator->trans('how_to_order_sample');
$linkMore = "<a href=\"$estLink\" target='_blank' onclick=\"event.stopPropagation()\">$linkMore</a>";
$estTxt = $this->translator->trans('menu.express_delivery.tooltip', ['%link_more%' => $linkMore]);
$expressSampleTooltip = [
'url' => $estLink,
'text' => $estTxt,
];
}
//////////////////////////////////////////////////////////
$filters = [
// фабрики
'factory' => [
'name' => 'factory',
'alias' => 'left_menu_factories',
'title' => $this->translator->trans('left_menu_factories'),
'first' => $this->translator->trans('left_menu_factories'),
'type' => 'select',
'selected' => null,
'count' => $countFactory,
'countCur' => $countFactory,
//'countNew' => $countNewFactory,//новые фабрики не нужны
'list' => [],
],
// Фактура под
'getFacturas' => [
'name' => 'effect',
'alias' => 'left_menu_effect',
'title' => $this->translator->trans('left_menu_effect'),
'first' => $this->translator->trans('left_all_effect'),
'type' => 'checkbox',
'selected' => null,
'list' => [],
],
'getStone' => [
'name' => 'effect',
'alias' => 'left_menu_effect',
'title' => $this->translator->trans('left_menu_effect'),
'first' => $this->translator->trans('left_all_effect'),
'type' => 'checkbox',
'selected' => null,
'list' => [],
],
// Стиль
'getStyles' => [
'name' => 'style',
'alias' => 'left_menu_style',
'title' => $this->translator->trans('left_menu_style'),
'first' => $this->translator->trans('left_all_style'),
'type' => 'checkbox',
'selected' => null,
'list' => [],
],
// Цена руб/м2
'getCostCategory' => [
'name' => 'price',
'alias' => 'left_menu_price',
'title' => $this->translator->trans('left_menu_price'),
'first' => $this->translator->trans('left_all_price'),
'type' => 'checkbox',
'selected' => null,
'list' => [],
],
// Цвет
'getColors' => [
'name' => 'color',
'alias' => 'left_menu_color',
'title' => $this->translator->trans('left_menu_color'),
'first' => $this->translator->trans('left_all_color'),
'type' => 'checkbox',
'selected' => null,
'list' => [],
],
// Цвет
'getTypeUsings' => [
'name' => 'using',
'alias' => 'left_menu_use',
'title' => $this->translator->trans('left_menu_use'),
'first' => $this->translator->trans('left_all_use'),
'type' => 'checkbox',
'selected' => null,
'list' => [],
],
// Экспресс образцы
'expressSample' => [
'name' => 'expressSample',
'alias' => 'articleQuickSample',
'title' => $this->translator->trans('articleQuickSample'),
'first' => $this->translator->trans('articleQuickSample'),
'type' => 'checkbox',
'selected' => null,
'tooltip' => $expressSampleTooltip,
'list' => [],
],
];
$queryKeys = [];
if ($route == 'app_catalog') {
$queryKeys = explode('&', RequestHelper::get('key'));
}
if ($route == 'app_collection' || $route == 'app_tile') {
$collUrl = RequestHelper::get('collectionUrl');
$factUrl = StrHelper::toLower(RequestHelper::get('factoryUrl'));
$factId = $this->factoryRepository->getIdByUrl($factUrl);
if ($collUrl) {
$coll = $this->collectionRepository->findOneBy(['url' => $collUrl, 'factory' => $factId,]);
if (
$coll
&& ($coll->getStatus() == LotusCollectionStatusEnum::PUBLISHED
|| $coll->getStatus() == LotusCollectionStatusEnum::DISCONTINUED
|| $coll->getStatus() == LotusCollectionStatusEnum::TEMPORARY_NOT_PUBLISHED
)
) {
$oFactory = $coll->getFactory()->getFilter();
if ($oFactory) {
$queryKeys[] = $factUrl;
$rowCollection = [
'id' => $coll->getId(),
'url' => $coll->getUrl(),
'name' => $coll->getName(),
'dataLink' => App::generateUrl(
'app_collection',
[
'factoryUrl' => $factUrl,
'collectionUrl' => $coll->getUrl(),
]
),
'factory' => [
'id' => $oFactory->getOldId(),
'name' => $oFactory->getCountry()->getPage()->{'getNameMenu' . ucfirst($locale)}(),
],
];
$collection['selected'] = $rowCollection;
$searchParams['collection'] = $rowCollection;
$filters['factory']['countCur'] = 1;
}
}
}
// получение доп фильтров коллекции, для передачи в короткое меню
$filterKeys = RequestHelper::get('elementId');
if ($filterKeys) {
$filterKeys = explode('&', $filterKeys);
$queryKeys = array_merge($queryKeys, $filterKeys);
}
}
$aFilters = $this->filterRepository->getArrListForMenu(
['effect', 'style', 'samples', 'price', 'color', 'using', 'brand'],
$locale
);
$subFilter = [];
/** @var FilterEntity $filter */
foreach ($aFilters as $aFilter) {
foreach ($aFilter as $filter) {
if (!empty($filters[$filter['oldCommand']])) {
$url = $filter['url' . $localeUc];
$name = $filter['pageNameMenu' . $localeUc];
if (!$name) {
continue;
}
// костыль для фильтра цен, что бы показывать верно для разных стран
if ($filter['groupsAltName'] == 'price') {
$name = LocaleHelper::getNamePriceFilter($name, $locale);
}
//удаляем фильтры которые и есть и нет если был пересчет например https://tile.expert/en-us/advanced-search?c=/en-us/catalogue/price-under-10
if ($calculate && (empty($calculate[$filter['oldCommand']]) || empty($calculate[$filter['oldCommand']][$filter['id']]))) {
continue;
}
$row = [
'id' => $filter['oldId'],
'fid' => $filter['id'],
'pid' => $filter['pid'],
'groups' => $filter['groupsAltName'],
'url' => $url,
'alias' => $filter['leftMenu'],
'important' => $filter['important'],
'name' => $name,
'selected' => [],
'count' => !empty($calculate[$filter['oldCommand']]) && !empty($calculate[$filter['oldCommand']][$filter['id']]) ? $calculate[$filter['oldCommand']][$filter['id']] : $filter['paramCount'],
//'new_count' =>!empty($calculate[$filter['oldCommand']]) && !empty($calculate[$filter['oldCommand']][$filter['id']]) ? $calculate[$filter['oldCommand']][$filter['id']] : 0,
'sub' => [],
];
if (!empty($filter['country'])) {
$row['country'] = [
'id' => $filter['country']['oldId'],
'name' => $this->translator->trans($filter['country']['leftMenu']),
];
}
if (in_array($row['url'], $queryKeys)) {
$showReset = true;
$row['selected'] = $row['url'];
$filters[$filter['oldCommand']]['selected'] = $row;
if ($filter['oldCommand'] == 'factory') {
$collection['countCur'] = $this->collectionRepository->countCollections(['factoryId' => $row['id']]);
}
}
// не кладём в список фабрики
if ($filter['oldCommand'] != 'factory') {
if ($filter['pid'] != null) {
if ($filter['id'] != '10147') {
$subFilter[$row['pid']][$row['fid']] = $row;
}
} else {
$filters[$filter['oldCommand']]['list'][] = $row;
}
}
}
}
}
$factory = $filters['factory'];
unset($filters['factory']);
$searchParams['factory'] = $factory;
$filters = $this->addSubFilters($filters, $subFilter);
return [
'locale' => $localeUc,
'searchParams' => $searchParams,
'filters' => $filters,
'collection' => $collection,
'brand' => $factory,
'showReset' => $showReset,
'countryList' => App::getCountryList(),
];
}
/**
* Вставляем вложенные фильтры, если есть такие
*
* @param array $filterGroups
* @param array $subFilter
* @return array
*/
private function addSubFilters(array $filterGroups, array $subFilter): array
{
$filterGroups = array_filter($filterGroups, static fn(array $group) => !empty($group['list']));
foreach ($filterGroups as &$filterGroup) {
foreach ($filterGroup['list'] as $key => &$filter) {
if (!empty($subFilter[$filter['fid']])) {
//если родитель выбран, то и дети выбраны
if (!empty($filter['selected'])) {
$filter['selected'] = [];
foreach ($subFilter[$filter['fid']] as $sk => $sv) {
$subFilter[$filter['fid']][$sk]['selected'] = $subFilter[$filter['fid']][$sk]['url'];
$filterGroup['selected'][] = $subFilter[$filter['fid']][$sk];
}
}
$filter['sub'] = array_values($subFilter[$filter['fid']]);
}
}
}
return $filterGroups;
}
}