<?php
namespace WebBundle\Controller;
use Exception;
use FlexApp\DTO\RequestCatalogDTO;
use FlexApp\Service\LastUrlService;
use FlexApp\Service\Meta\MetaManager;
use Import1CBundle\Helper\v3\ArticleHelper;
use Import1CBundle\Helper\v3\BiConst;
use Import1CBundle\Helper\v3\InteriorHelper;
use Import1CBundle\Helper\v3\TranslitNameHelper;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Contracts\Translation\TranslatorInterface;
use WebBundle\Constant\CookieKeysConstant;
use WebBundle\Helper\App;
use WebBundle\Helper\ConversionHelper;
use WebBundle\Helper\CookieHelper;
use WebBundle\Helper\ItemHelper;
use WebBundle\Helper\LocaleHelper;
use WebBundle\Helper\PathHelper;
use WebBundle\Helper\RedirectHelper;
use WebBundle\Helper\SearchLogHelper;
use WebBundle\Helper\StrHelper;
use WebBundle\Helper\UrlHelper;
use WebBundle\Helper\UserHelper;
use WebBundle\Repository\ArticleRepository;
use WebBundle\Repository\BuyOrderRepository;
use WebBundle\Repository\CollectionRepository;
use WebBundle\Repository\FilterRepository;
use WebBundle\Repository\IdeaRepository;
use WebBundle\Repository\InteriorRepository;
use WebBundle\Repository\ListCountryRepository;
use WebBundle\Repository\PublicationRepository;
use WebBundle\Repository\SampleRepository;
use WebBundle\Service\CollectionService;
use WebBundle\Service\ReviewsService;
use WebBundle\Service\SampleService;
use WebBundle\Service\SearchService;
use WebBundle\Service\SliderService;
/**
* Работа слайдера
* коллекция опубликована,
* вызов из коллекции, вызывается 5 слайдов - 0, -2, +2, для крайних уменьшается до 0, игнорируются снятые слайды
* вызов из би - вызывается 5 слайдов аналогично, снятые игнорируются
* прямой вызов - вызвается 5 слайдов, снятые игнорируются
* прямой вызов снятого - вызвается 1 слайд
* при перелистываении подгружается крайний +-1 слайд
*
* коллекция неопубликована - слайдер заблокирован для всех случаев
*
* коллекция снята -
* только прямой вызов по одному слайду
*
* коллекция импортирована
* вызвается 5 слайдов аналогично
* прямой вызов - 5 слайдов
*
* Коллекция на проверке
* вызывается 5 слайдов аналогично
* collection controller.
*/
class SliderController extends ExtendedController
{
/** @required */
public FilterRepository $filterRepository;
/** @required */
public SampleRepository $sampleRepository;
/** @required */
public BuyOrderRepository $buyOrderRepository;
/** @required */
public ListCountryRepository $listCountryRepository;
/** @required */
public PublicationRepository $publicationRepository;
/** @required */
public IdeaRepository $ideaRepository;
/** @required */
public ArticleRepository $articleRepository;
/** @required */
public CollectionRepository $collectionRepository;
/** @required */
public InteriorRepository $interiorRepository;
/** @required */
public CollectionService $collectionService;
/** @required */
public ReviewsService $reviewsService;
/** @required */
public SampleService $sampleService;
/** @required */
public SliderService $sliderService;
/** @required */
/** @required */
public SearchService $searchService;
/** @required */
public LastUrlService $lastUrlService;
private AuthorizationChecker $authorizationChecker;
private TranslatorInterface $translator;
public function __construct(
AuthorizationChecker $authorizationChecker,
TranslatorInterface $translator
) {
parent::__construct();
$this->authorizationChecker = $authorizationChecker;
$this->translator = $translator;
}
/**
* @param Request $request
* @param $factoryUrl
* @param $collectionUrl
* @param $type
* @param $elementId
* @return Response
* @throws Exception
*/
public function indexAction(Request $request, $factoryUrl, $collectionUrl, $type, $elementId)
{
// проверка переноса фабрики
if ($iNeedRedirect = RedirectHelper::checkRedirect($factoryUrl, $collectionUrl, $type, $elementId)) {
return $this->redirect(
$this->generateUrl(
'app_collection',
$iNeedRedirect->getArrayForRedirect()
)
);
}
$token = UserHelper::getInstance()->getToken();
$translator = $this->translator;
$collection = $this->collectionRepository->getSlideCollection($factoryUrl, $collectionUrl);
// проверка на сменный URL коллекции
if (!$collection) {
$redirect = $this->lastUrlService->getSliderRedirectUrl($collectionUrl, $factoryUrl, $type, $elementId);
if ($redirect) {
return new RedirectResponse($redirect);
}
}
if (!$collection) {
throw $this->createNotFoundException('Element not found');
}
$isCollectionStatus = in_array(
$collection['status'],
[BiConst::STATE_DISCONTINUED, BiConst::STATE_WORK_CONTINUED]
);
// Закрываем доступ для еще не опубликованных коллекций
if (
!in_array(
$collection['status'],
[BiConst::STATE_PUBLISHED, BiConst::STATE_DISCONTINUED, BiConst::STATE_WORK_CONTINUED]
)
&& !$this->authorizationChecker->isGranted('ROLE_ADMIN')
) {
throw $this->createNotFoundException('Slide not found');
}
$msg = $this->collectionService->getAlertMessageIfCollectionInDiscontinuedState($collection);
$isBiFreezed = $request->get('is_freezed');
$isFactoryStatus = in_array(
$collection['factory']['status'],
[BiConst::STATE_DISCONTINUED, BiConst::STATE_WORK_CONTINUED]
);
$isFreezed = ($isBiFreezed !== null) ? (bool)$isBiFreezed : $isCollectionStatus || $isFactoryStatus;
$suspended = $isCollectionStatus || $isFactoryStatus;
$pathData = [
'factoryUrl' => $collection['factory']['url'],
'collectionUrl' => $collection['url'],
'file' => '%img%',
];
$data = $this->getData($request, $token, $type, $collection, $elementId);
if (!empty($data['redirect'])) {
return new RedirectResponse($data['redirect'], 301);
} elseif (
count($data['elements']) === 0
|| $data['elementId'] === null
) {
throw new NotFoundHttpException('The element is not found or it has the column "file" is null');
}
if (empty(App::getCountryList()[StrHelper::toLower($collection['factory']['country']['code'])])) {
$countryEntity = $this->listCountryRepository->getCountry($collection['factory']['country']['code']);
$countryKey = '';
if ($countryEntity) {
$countryKey = $countryEntity->getAlias();
}
} else {
$countryKey = App::getCountryList()[StrHelper::toLower($collection['factory']['country']['code'])]['alias'];
}
$countryUrl = '';
if ($countryKey) {
$countryKey = $this->filterRepository->getKeyByLeftMenu($countryKey);
$countryUrl = App::generateUrl('app_catalog', ['key' => $countryKey]);
}
// Специальная ссылка на блог
$blog = $this->publicationRepository->find(2232);
$qr = null;
if (($request->get('QR') || $request->get('qr')) && $type == 'a') {
$sampleId = $data['elements'][$data['elementId']]['id'];
$sample = $this->sampleRepository->sample((int)$sampleId);
if (!$sample) {
throw $this->createNotFoundException('Sample not found');
}
$params = [$sample['itemOneId']];
if ($sample['itemTwoId']) {
$params[] = $sample['itemTwoId'];
}
$ides = $this->sampleRepository->getArticlesIdes($params);
$itemList = $this->articleRepository->getArticleNativeOpt(
[
'collection' => $collection['id'],
'status' => $collection['status'],
'interior' => true,
'items' => array_column($ides, 'id'),
'isFreezed' => $isFreezed,
],
true
);
foreach ($itemList as $k => $r) {
if (!empty($r['surface']['name']) && !empty($r['surface']['alias'])) {
$itemList[$k]['surface']['name'] = App::trans($r['surface']['alias']);
}
if (!empty($r['colors'])) {
foreach ($r['colors'] as $n => $c) {
if (!empty($c['name']) && !empty($c['alias'])) {
$itemList[$k]['colors'][$n]['name'] = App::trans($c['alias']);
}
}
}
}
$mea = CookieHelper::get(in_array(App::getCurCountry(), ['us', 'ca']) ? 'measureFt' : 'measure');
$sampleData = $this->sampleService
->getSampleData(
$data['elements'][$data['elementId']]['code'],
App::getCurCountryId(),
false,
CookieHelper::get(CookieKeysConstant::CURRENCY),
$mea
);
if ($mea == 'ft') {
$sample['sizeXOne'] = ConversionHelper::convertInch((float)$sample['sizeXOne'], ConversionHelper::CM);
$sample['sizeYOne'] = ConversionHelper::convertInch((float)$sample['sizeYOne'], ConversionHelper::CM);
$sample['sizeXTwo'] = ConversionHelper::convertInch((float)$sample['sizeXTwo'], ConversionHelper::CM);
$sample['sizeYTwo'] = ConversionHelper::convertInch((float)$sample['sizeYTwo'], ConversionHelper::CM);
}
$qr = [
'main' => array_merge($sampleData, $sample),
'mss' => ArticleHelper::getTileArticleAddOptions($data['elements'][$data['elementId']])['mss'],
'listItem' => $itemList,
];
}
$reviews = $this->reviewsService->getReviewByCollection($collection['code']);
$output = [
'windowSizes' => json_decode($request->cookies->get('windowSizes', '{}'), true),
'filters' => $this->getGoogleRefererInfo(),
'qr' => $qr,
'msg' => $msg ?? null,
'elements' => $data['elements'],
'elementsCount' => $data['elementsCount'],
'elementId' => $data['elementId'],
'number' => $data['numberElement'],
'type' => $type,
'suspended' => $suspended,
'dataNoRegular' => $collection['factory']['suspended'],
'buyOrderArticles' => $this->buyOrderRepository->getInfoBuyOrderArticle($token),
'userCountry' => App::getCurCountry(),
'userLocale' => App::getCurLocale(),
'currency' => LocaleHelper::getCurrency(LocaleHelper::getCur()),
'measureGb' => LocaleHelper::measureGb(),
'vatPercent' => LocaleHelper::includeVATAlways(),
'urls' => [
'settings' => App::generateUrl('app_article_settings', ['id' => 0]),
'collection' => App::generateUrl(
'app_collection',
['factoryUrl' => '%factory%', 'collectionUrl' => '%collection%']
),
'factory' => App::generateUrl('app_catalog', ['key' => '%factory%']),
'country' => $countryUrl,
'ideas' => App::generateUrl('app_ideas_list', ['id' => '%id%']),
'pathImg' => [
'item' => PathHelper::pathGenerate('article', $pathData),
'interior' => PathHelper::pathGenerate('interior', $pathData),
],
'fastDeliverySamplesUrl' => UrlHelper::genUrlBlogSingle($blog),
'mainPic' => PathHelper::pathGenerate('main', $collection),
],
'stateNotTime' => BiConst::STATE_NOT_TIME,
'statePublished' => BiConst::STATE_PUBLISHED,
'stateDiscontinued' => BiConst::STATE_DISCONTINUED,
'stateProcessing' => BiConst::STATE_PROCESSING,
'isWithoutVATPrice' => LocaleHelper::isWithoutVATPrice(10) !== false,
'isFreezed' => $isFreezed,
'closed' => ($collection['status'] == BiConst::STATE_DISCONTINUED
? $translator->trans('collection_unavailable_freezed_desc')
: ($collection['status'] == BiConst::STATE_PROCESSING
? $translator->trans('collection_unavailable')
: ''
)),
'closedHelp' => $collection['status'] == BiConst::STATE_PROCESSING
? $translator->trans('collection_unavailable_manufacture_desc')
: '',
'trans' => [
'orderHelp' => $translator->trans('buyOrder.help'),
'collectionCeilToPallet' => $translator->trans('collection_ceil_to_pallet'),
'popupAutoChangeCountArts' => $translator->trans('popup_auto_change_count_arts'),
'collectionAtentionPallet' => $translator->trans('collection_atention_pallet'),
'articleTypeSample' => $translator->trans('article.type.sample'),
'collection_Article' => $translator->trans('collection_article'),
'collection_Interior' => $translator->trans('collection_interior'),
'collectionName' => $translator->trans('collection_name'),
'catalogFactory' => $translator->trans('catalog_factory'),
'articleCharacteristics' => $translator->trans('article_characteristics'),
'articleItemFormats' => $translator->trans('article_item_formats'),
'itemDifferentPatterns' => $translator->trans('item_different_patterns'),
'itemVariationsOfGraphics' => $translator->trans('item_variations_of_graphics'),
'vatLabel' => $translator->trans('vat.label'),
'vatIncluded' => $translator->trans('vat.included'),
'catalogPrice' => $translator->trans('catalog_price'),
'articleDiscountinued' => $translator->trans('article.discountinued'),
'collectionBack' => $translator->trans('collection_back'),
'commentAddQuestion' => $translator->trans('comment_add_question'),
'articleInStock' => $translator->trans('article_in_stock'),
'item' => [
'collection' => $translator->trans('collection_name'),
'factory' => $translator->trans('catalog_factory'),
'characteristics' => $translator->trans('article_characteristics'),
'header' => $translator->trans('collection_articles_d'),
'formats' => $translator->trans('article_item_formats'),
'cm' => $translator->trans('left_menu_cm'),
'translated_by_google' => $translator->trans('translated_by_google'),
'show_translate' => $translator->trans('show_translate'),
'show_original' => $translator->trans('show_original'),
'inch' => '″',
'diameter' => $translator->trans('article_item_diameter'),
'pcs' => $translator->trans('measure_unit'),
'pcsPlural' => $translator->trans('measure_units'),
'set' => $translator->trans('measure_set'),
'sets' => $translator->trans('measure_sets'),
'settings' => $translator->trans('collection_marks'),
'someSettings' => $translator->trans('article_characteristics'),
'allSettings' => $translator->trans('all'),
'price' => $translator->trans('catalog_price'),
'vat' => [
'label' => $translator->trans('vat.label'),
'included' => $translator->trans('vat.included'),
'excluded' => $translator->trans('vat.excluded'),
],
'info' => $translator->trans('article_item_more_info'),
'infoLess' => $translator->trans('article_item_less_info'),
'order' => [
'help' => $translator->trans('buyOrder.help'),
'ceilToPallet' => $translator->trans('collection_ceil_to_pallet'),
'atentionPallet' => $translator->trans('collection_atention_pallet'),
'popupAutoChangeCountArts' => $translator->trans('popup_auto_change_count_arts'),
],
'up' => $translator->trans('article.price.up'),
'down' => $translator->trans('article.price.down'),
'readMore' => $translator->trans('read_more'),
'titleAddedArticle' => $translator->trans('buyOrder.titleAddedArticle'),
'addIntoOrder' => $translator->trans('buy_order.add_into_order'),
'headerOrderAdd' => $translator->trans('header_order_add'),
'draft' => $translator->trans('order.status.draft'),
'typeMain' => $translator->trans('article.type.main'),
'typeSample' => $translator->trans('article.type.sample'),
'sampleText' => $translator->trans('article.type.sampleText'),
'typeCompare' => $translator->trans('article.type.compare'),
'compareText' => $translator->trans('article.type.compareText'),
'type3d' => $translator->trans('article.type.3d'),
'text3d' => $translator->trans('article.type.3dText'),
'articleOrderOver' => $translator->trans('article.order.over'),
'articlePricePerPallet' => $translator->trans('article.price.perPallet'),
'articlePriceNoLessPallet' => $translator->trans('article.price.noLessPallet'),
'articlePricePalleteFrom' => $translator->trans('article.pricePallete.from'),
'articlePriceFrom' => $translator->trans('article.price.from'),
'articlePricePalleteUnder' => $translator->trans('article.pricePallete.under'),
'articlePriceFromTo' => $translator->trans('article.price.from_to'),
'articleOrderMultiplies' => $translator->trans('article.order.multiplies'),
'highResolutionImageDownload' => $translator->trans('image_download_high_resolution'),
'boxArticleSingle' => $translator->trans('box_article_single'),
'boxArticlePlural' => $translator->trans('box_article_plural'),
'articleNoImgTitle' => $translator->trans('article.no_img'),
'collectionAddOrder' => $translator->trans('collection_add_order'),
'tempNoUKShippingMsg' => $translator->trans('msg.uk'),
'discountinued' => $translator->trans('article.discountinued'),
'tempUnavailable' => $translator->trans('article.temp_unavailable'),
],
'sample' => [
'folder' => $translator->trans('sample.folder.text'),
'original' => $translator->trans('sample.original.text'),
'piece' => $translator->trans('sample.piece.text'),
'title' => $translator->trans('samplePopup.title'),
'noMoreShow' => $translator->trans('samplePopup.noMoreShow'),
'withDecl' => $translator->trans('article.type.sampleWithDecl'),
'alreadyAdded' => $translator->trans('sample_already_added.header'),
'fitsForItems' => $translator->trans('fits_for_items'),
],
'reviews' => [
'heading' => $translator->trans('collection_customer_reviews'),
'validUser' => $translator->trans('product_validUser'),
'reply' => $translator->trans('reply_comment'),
'edit' => $translator->trans('edit'),
'save' => $translator->trans('save'),
'cancel' => $translator->trans('cancel'),
'stars' => $translator->trans('reviews.stars.many'),
],
'box' => $translator->trans('measure_box'),
'boxes' => $translator->trans('boxes'),
'collectionNotRegular' => $translator->trans('collection.notRegular'),
'collectionBy' => $translator->trans('collection_by'),
'ideaDelInteriorMsg' => $translator->trans('idea_del_interior_msg'),
'ideaYes' => $translator->trans('idea_yes'),
'ideaNo' => $translator->trans('idea_no'),
'ideaMsgAdded' => $translator->trans('idea_msg_added'),
'ideaMsgNormal' => $translator->trans('idea_msg_normal'),
'ideaMsgNormalMany' => $translator->trans('idea_msg_normal_many'),
'ideaMsgNormalZero' => $translator->trans('idea_msg_normal_zero'),
'articleItemDiameter' => $translator->trans('article_item_diameter'),
'leftMenuCm' => $translator->trans('left_menu_cm'),
'leftMenuInch' => '″',
'sampleFolderText' => $translator->trans('sample.folder.text'),
'sampleOriginalText' => $translator->trans('sample.original.text'),
'samplePieceText' => $translator->trans('sample.piece.text'),
'unavailableFreezedDescArticle' => $translator->trans('collection_unavailable_freezed_desc_article'),
'discountinued' => $translator->trans('article.discountinued'),
'articleInInterior' => $translator->trans('article_in_interior'),
'factoryCountry' => $translator->trans($collection['factory']['country']['alias']),
'collectionIdeasShort' => $translator->trans('collection_ideas_short'),
],
'reviews' => [
'data' => $reviews,
'urls' => [
'preDataCollectionReviewsUrl' => App::generateUrl(
'pre_data_collection_reviews',
['id' => $collection['id']]
),
'collectionReviewsUrl' => App::generateUrl('collection_reviews', ['id' => $collection['id']]),
],
],
];
$imagePreload = null;
if (!empty($output['elements'][$output['elementId']]['pathImg'])) {
$imagePreload = $output['elements'][$output['elementId']]['pathImg'];
}
SearchLogHelper::save([
'url' => $request->getUri(),
'title' => $data['elements'][$data['elementId']]['title'],
]);
if ($request->get('only-slider')) {
return new JsonResponse(['slider' => $output]);
} else {
$art = $data['elements'][$data['elementId']];
if ($type == 'i') {
$art = !empty($art['articles'][0]) ? $art['articles'][0] : null;
}
return $this->renderReact('@Web/Slider/index.html.twig', [
'imagePreload' => $imagePreload,
'metaData' => [
'title' => $data['elements'][$data['elementId']]['title'],
'description' => $data['elements'][$data['elementId']]['description'],
'keyword' => '',
],
//для динамического ремаркетинга
'ecommProdid' => $data['elementId'],
'ecommTotalvalue' => $art ? LocaleHelper::getPrice($art) : 0,
'initialState' => ['slider' => $output],
]);
}
}
/**
* @param Request $request
* @param string $token
* @param string $type
* @param array $collection
* @param string|null $elementId
* @param string|null $load
* @return array|null
* @throws Exception|\Doctrine\DBAL\Driver\Exception
*/
private function getData(
Request $request,
string $token,
string $type,
array $collection,
?string $elementId = null,
?string $load = 'all'
): ?array {
if ($type == 'a') {
$elementsCount = $this->articleRepository->countArticlesColl(
$collection['id'],
$request->get('all', false)
);
// $elements = $this->articleRepository->idesArticlesColl(
// $collection['id'],
// !empty($_GET['all'])
// );
// $elementIdes = array_keys($elements);
// $elementUrls = array_values($elements);
//подсчитываем по тому почему и выводим
$params = [
'collection' => $collection['id'],
'offset' => 0,
'limit' => 200000,
];
$elements = $this->articleRepository->getArticleNativeOpt(
$params,
true
);
$elementIdes = array_column($elements, 'id');
$elementUrls = array_column($elements, 'url');
if (in_array($elementId, $elementUrls)) {
if (
$redirectArticle = $this->articleRepository->findOneBy([
'url' => $elementId,
'collection' => $collection['id'],
])
) {
$elementId = $redirectArticle->getId();
}
} else {
// если ключ элемента цифровой - запросим редирект
// https://tile.expert/ru-it/tile/del-conca/hcl-climb/a/288881155
if (array_key_exists($elementId, $elements)) {
return [
'redirect' => $this->generateUrl(
'app_collection_slideshow',
[
'factoryUrl' => $collection['factory']['url'],
'collectionUrl' => $collection['url'],
'type' => $type,
'elementId' => $elements[$elementId],
]
),
];
}
$elementId = null;
}
$isFreezed = false;
$res = $this->getIdes($elementIdes, $elementId, $load);
$elements = $this->articleRepository->getArticleNativeOpt(
[
'collection' => $collection['id'],
'status' => $collection['status'],
'interior' => true,
'items' => $res['ides'],
'isFreezed' => $isFreezed
],
true
);
} else {
$elementsCount = $this->interiorRepository->countInteriorsColl($collection['id']);
$res = $this->interiorRepository->interiorId($elementId, $collection['id']);
if (!$res) {
$url = $this->interiorRepository->interiorUrlByName($elementId, $collection['id']);
if ($url) {
return [
'redirect' => $this->generateUrl(
'app_collection_slideshow',
[
'factoryUrl' => $collection['factory']['url'],
'collectionUrl' => $collection['url'],
'type' => 'i',
'elementId' => $url
]
)
];
}
}
$elementId = $res;
$filter = $request->get('filter');
if ($filter) {
$searchFilter = [
'c_id' => [$collection['id']],
'inside' => true
];
$reqCatDTO = new RequestCatalogDTO($request, $filter, null);
$oSearchService = $this->searchService;
$oSearchService->setFilter($reqCatDTO, $searchFilter);
$data = $oSearchService->getSearchData();
$keyString = serialize($data);
$key = 'sphinx' . md5($keyString);
$searchTrue_cache = App::getMemcache()->get($key);
if ($searchTrue_cache !== false) {
$searchTrue = $searchTrue_cache;
} else {
$searchTrue = App::searchSphinx($data, 0, true);
App::getMemcache()->set($key, $searchTrue);
}
$elementIdesAll_ = $this->interiorRepository->getInteriorsForSlider(
$collection['id'],
['onlyId' => true]
);
if (!empty($searchTrue[0]['interiors'])) {
$elementIdesFind = array_column($searchTrue[0]['interiors'], 'i_id');
if (in_array($elementId, $elementIdesFind)) {
$elementIdes = array_values($elementIdesFind);
$elementsCount = count($elementIdes);
} else {
$elementIdes = array_column($elementIdesAll_, 'id');
$elementIdes = array_values(array_diff($elementIdes, $elementIdesFind));
$elementsCount = count($elementIdes);
}
} else {
$elementIdes = array_column($elementIdesAll_, 'id');
}
$res = $this->getIdes($elementIdes, $elementId, $load);
$elements = $this->interiorRepository->getInteriorsForSlider(
$collection['id'],
['ids' => $res['ides']]
);
foreach ($elements as &$element) {
$element = InteriorHelper::getInteriorDetails($element, $element['collection'], null, $filter);
}
} else {
$elementIdes = $this->interiorRepository->getInteriorsForSlider($collection['id'], ['onlyId' => true]);
$res = $this->getIdes(array_column($elementIdes, 'id'), $elementId, $load);
$elements = $this->interiorRepository->getInteriorsForSlider($collection['id'], ['ids' => $res['ides']]);
foreach ($elements as &$element) {
$element = InteriorHelper::getInteriorDetails($element, $element['collection']);
}
}
}
$favorites = $this->ideaRepository->getInteriorsIdeasByToken($token);
$nameF = $collection['factory']['name'];
$pos = isset($collection['factory']['name']) ? strpos($collection['factory']['name'], '′') : false;
if ($pos !== false) {
$name = TranslitNameHelper::replacePrime($collection['factory']['name'], false);
$nameF = $name;
}
$titleData = [
'c_id' => $collection['id'],
'c_name' => $collection['name'],
'c_satus' => $collection['status'],
'f_id' => $collection['factory']['id'],
'f_name' => $nameF,
'f_satus2' => $collection['factory']['status'],
'code' => $collection['factory']['country']['code'],
'type' => $type,
'elsCount' => $elementsCount,
];
$buyOrderArticle = $this->buyOrderRepository->getInfoBuyOrderArticle($token);
$samplesArray = [];
if ($request->get('sample')) {
$samplesArray = $this->sampleService
->getSamplesData(
array_column($elements, 'code'),
App::getCurCountryId(),
false,
LocaleHelper::getCur(),
LocaleHelper::getUserMeasure()
);
}
$newElements = [];
$ordersItems = $this->buyOrderRepository->getInfoBuyOrderArticle($token);
foreach ($elements as $row) {
$row = $this->unsetInactiveArticleInInteriorOrCollection($row);
$newElements[$row['id']] = $newElements[$row['id']] ?? $row;
$newElements[$row['id']]['name'] = html_entity_decode($row['name']);
$newElements[$row['id']]['alternateName'] = empty($row['alternateName']) ? null : html_entity_decode(
$row['alternateName']
);
$newElements[$row['id']]['numberElement'] = $res['numberElement'][$row ['id']];
$titleData['id'] = $row['id'];
$titleData['elNum'] = $res['numberElement'][$row['id']];
$newElements[$row['id']]['collection']['priceSort'] = LocaleHelper::getPrMin($row['collection']);
$newElements[$row['id']]['collection']['priceSortCur'] = LocaleHelper::getCurrency();
$newElements[$row['id']]['collection']['priceSortMea'] = LocaleHelper::getUserMeasure();
$this->addInfoAboutAvailableInCountryOfFactory($row['collection'], $newElements[$row['id']]);
$furl = $row['collection']['factory']['url'] ?? null;
$curl = $row['collection']['url'] ?? null;
if ($type == 'i') {
if (empty($row['file'])) {
$row['file'] = StrHelper::toLower($row['name']) . '.jpg';
} else {
$row['file'] = StrHelper::toLower($row['file']);
}
//todo временно
if (!empty($newElements[$row['id']]['collection']['process'])) {
$row['file'] = preg_replace('#\.jpg#i', '.webp', $row['file']);
$isWebp = $newElements[$row['id']]['collection']['a_version'] = true;
} else {
$isWebp = $newElements[$row['id']]['collection']['a_version'] = false;
}
foreach ($row['articles'] as $n => $article) {
if (empty($article['collection'])) {
unset($newElements[$row['id']]['articles'][$n]);
continue;
}
$afurl = $article['collection']['factory']['url'] ?? null;
$acurl = $article['collection']['url'] ?? null;
$article['name'] = html_entity_decode($article['name']);
$article['alternateName'] = empty($article['alternateName']) ? null : html_entity_decode(
$article['alternateName']
);
$article['addUrl'] = App::generateUrl(
'app_buy_orders_list',
[
'articleId' => $article['id'],
]
);
$article['sampleUrl'] = App::generateUrl('app_order_sample', ['code' => $article['code']]);
$article['collectionUrl'] = App::generateUrl(
'app_collection',
[
'factoryUrl' => $afurl,
'collectionUrl' => $acurl,
]
);
$article['factoryUrl'] = App::generateUrl(
'app_catalog',
[
'key' => $afurl,
]
);
$article['prc'] = LocaleHelper::getPrice($article);
$article['mea'] = App::trans(LocaleHelper::getMeasure($article));
// рассчитываем размер в inch-ах
$article['sizeGbX'] = ConversionHelper::convertInch((float)$article['sizeX'], ConversionHelper::CM);
$article['sizeGbY'] = ConversionHelper::convertInch((float)$article['sizeY'], ConversionHelper::CM);
$article['sizeGbZ'] = ConversionHelper::convertInch((float)$article['sizeZ'], ConversionHelper::CM);
$article['amount'] = LocaleHelper::getAmount($article);
$article['orders'] = !empty($ordersItems[$article['id']]) ? $ordersItems[$article['id']] : false;
$article['ssLink'] = App::generateUrl(
'app_collection_slideshow',
[
'factoryUrl' => $afurl,
'collectionUrl' => $acurl,
'type' => 'a',
'elementId' => $article['url'],
]
);
$article['imageSettingIcon'] = ArticleHelper::getPathArticleImageSettings($article);
$article['shape'] = [
'id' => $article['shape']['id'],
'alias' => App::trans($article['shape']['alias']),
];
if ($isWebp) {
$articleFileNameWebp = preg_replace('#\.jpg#i', '.webp', $article['details']['file']);
} else {
$articleFileNameWebp = $article['details']['file'];
}
$article['pathImg'] = PathHelper::pathGenerate(
'article',
[
'factoryUrl' => $afurl,
'collectionUrl' => $acurl,
'file' => 'b_' . $articleFileNameWebp,
]
);
if (!empty($article['commentSchemeImage'])) {
$article['commentSchemeImage'] = PathHelper::pathGenerate(
'article',
[
'factoryUrl' => $afurl,
'collectionUrl' => $acurl,
'file' => 'b_' . $article['details']['commentSchemeImage'],
]
);
}
$alt[] = $article['name'];
foreach ($article['textures'] as $k => $texture) {
$article['textures'][$k]['alias'] = $alt[] = App::trans($texture['alias']);
}
if (!empty($article['details']['variantImage']['texture'])) {
$article['details']['variantImage']['texture'] = ItemHelper::addMainPic(
$article['details']['variantImage']['texture'],
$articleFileNameWebp
);
}
if (!empty($article['details']['variantImage']['picture'])) {
$article['details']['variantImage']['picture'] = ItemHelper::addMainPic(
$article['details']['variantImage']['picture'],
$articleFileNameWebp
);
}
// добавляем объект цены для js
$price = LocaleHelper::getPrice($article);
$woVATPrice = LocaleHelper::isWithoutVATPrice($price);
if ($woVATPrice) {
$article['discountsAmount'][] = [
'price' => $price,
'startAmount' => 0,
'woVATPrice' => $woVATPrice,
'fold' => 0,
];
} else {
$article['discountsAmount'][] = [
'price' => $price,
'startAmount' => 0,
'woVATPrice' => $price,
'fold' => 0,
];
}
if (!empty($article['priceDiscounts'])) {
foreach ($article['priceDiscounts'] as $k => $r) {
if ($r == null) {
continue;
}
$priceDiscount = LocaleHelper::getPriceDiscount($r, [
'measureId' => $article['measure']['id'],
]);
if (
$k == 0 && $article['multiplePallet'] == 1 &&
$article['packagingCount'] >= $priceDiscount['amount']
) {
$article['discountsAmount'] = [];
} else {
$article['discountsAmount'][count(
$article['discountsAmount']
) - 1]['endAmount'] = $priceDiscount['amount'];
}
$woVATPrice = LocaleHelper::isWithoutVATPrice($priceDiscount['price']);
if ($woVATPrice) {
$article['discountsAmount'][] = [
'price' => $priceDiscount['price'],
'startAmount' => $priceDiscount['amount'],
'woVATPrice' => $woVATPrice,
'fold' => $r['fold'],
];
} else {
$article['discountsAmount'][] = [
'price' => $priceDiscount['price'],
'startAmount' => $priceDiscount['amount'],
'woVATPrice' => $priceDiscount['price'],
'fold' => $r['fold'],
];
}
}
}
$coords = [];
if (!empty($article['coordItems'])) {
foreach ($article['coordItems'] as $coord) {
$interiorId = $coord['interior']['id'] ?? null;
if ($interiorId == $row['id']) {
$coords[] = [
'id' => $coord['id'],
'coordX' => $coord['coordX'],
'coordY' => $coord['coordY'],
'typePointer' => $coord['typePointer'],
'interiorId' => $coord['interior']['id'],
'articleId' => $coord['article']['id'],
];
}
}
}
unset($article['coordItems']);
$article['coordItems'] = $coords;
$article['url'] = !empty($article['url']) ? $article['url'] : $article['name'];
if (!empty($buyOrderArticle[$article['id']])) {
$article['orders'] = $buyOrderArticle[$article['id']];
} else {
$article['orders'] = [];
}
$pos = isset($article['collection']['factory']['name'])
? strpos($article['collection']['factory']['name'], '′')
: false;
if ($pos !== false) {
$name = TranslitNameHelper::replacePrime($article['collection']['factory']['name'], false);
$alternateName = TranslitNameHelper::replacePrime(
$article['collection']['factory']['alternateName'],
false
);
$article['collection']['factory']['name'] = $name;
$article['collection']['factory']['alternateName'] = $alternateName;
}
$newElements[$row['id']]['articles'][$n] = ArticleHelper::getTileArticleAddOptions($article);
}
if (!empty($newElements[$row['id']]['articles'])) {
$newElements[$row['id']]['articles'] = array_values($newElements[$row['id']]['articles']);
}
$pos = isset($row['collection']['factory']['name'])
? strpos($row['collection']['factory']['name'], '′')
: false;
if ($pos !== false) {
$name = TranslitNameHelper::replacePrime($row['collection']['factory']['name'], false);
$alternateName = TranslitNameHelper::replacePrime(
$row['collection']['factory']['alternateName'],
false
);
$newElements[$row['id']]['collection']['factory']['name'] = $name;
$newElements[$row['id']]['collection']['factory']['alternateName'] = $alternateName;
}
$newElements[$row['id']]['inIdeaBook'] = in_array($row['id'], $favorites);
$newElements[$row['id']]['url'] = $row['url'];
$newElements[$row['id']]['paths'] = [
'hd' => !empty($row['fileSizeHDY']) ?
PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => 'hd_' . $row['file']
]
)
: null,
'shd_1080' => !empty($row['fileSizeSHDY'])
? PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => 'shd_' . $row['file']
]
)
: null,
's_900' => PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => $row['file']
]
)
];
$newElements[$row['id']]['pathImg'] = PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => $row['file']
]
);
$alt[] = $row['name'];
foreach ($row['textures'] as $k => $texture) {
$newElements[$row['id']]['textures'][$k]['alias'] = $alt[] = App::trans($texture['alias']);
}
$titleData['i_name'] = $res['numberElement'][$row['id']];
$titleData['numberPhoto'] = $res['numberElement'][$row['id']];
$titleData['minPrice'] = $this->interiorRepository->getArticleMinPriceByInteriorId($row['id']);
} else {
$titleData['a_name'] = $row['name'];
if ($request->get('sample')) {
$newElements[$row['id']]['sampleData'] = $samplesArray[$row['code']] ?? [];
} else {
$newElements[$row['id']]['sampleData'] = null;
}
// todo удалить при первой возможности - вынести из цикла!
$titleData['minPrice'] = $this->articleRepository->getArticleMinPriceById($row['id']);
$newElements[$row['id']]['addUrl'] = App::generateUrl(
'app_buy_orders_list',
[
'articleId' => $row['id']
]
);
$newElements[$row['id']]['sampleUrl'] = App::generateUrl(
'app_order_sample',
[
'code' => $row['code']
]
);
$newElements[$row['id']]['collectionUrl'] = App::generateUrl(
'app_collection',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
]
);
$newElements[$row['id']]['factoryUrl'] = App::generateUrl(
'app_catalog',
[
'key' => $furl
]
);
$newElements[$row['id']]['prc'] = LocaleHelper::getPrice($row);
$newElements[$row['id']]['mea'] = App::trans(LocaleHelper::getMeasure($row));
$newElements[$row['id']]['amount'] = LocaleHelper::getAmount($row);
$newElements[$row['id']]['orders'] = !empty($ordersItems[$row['id']]) ? $ordersItems[$row['id']] : false;
$newElements[$row['id']]['ssLink'] = App::generateUrl(
'app_collection_slideshow',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'type' => 'a',
'elementId' => $row['url']
]
);
$newElements[$row['id']]['file'] = $row['details']['file'] ?? null;
$newElements[$row['id']]['pathImg'] = PathHelper::pathGenerate(
'article',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => 'b_' . $row['details']['file'] ?? null
]
);
if ($row['details']['commentSchemeImage']) {
$newElements[$row['id']]['commentSchemeImage'] = PathHelper::pathGenerate(
'article',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => $row['details']['commentSchemeImage']
]
);
}
if ($row['shape']) {
$newElements[$row['id']]['shape'] = [
'id' => $row['shape']['id'],
'alias' => App::trans($row['shape']['alias'])
];
}
$variantImage = $row['details']['variantImage'] ?? null;
if ($variantImage) {
if ($variantImage['texture'] ?? null) {
$newElements[$row['id']]['variantImage']['texture'] = ItemHelper::addMainPic(
$variantImage['texture'],
$row['details']['file']
);
}
if ($variantImage['picture'] ?? null) {
$newElements[$row['id']]['variantImage']['picture'] = ItemHelper::addMainPic(
$variantImage['picture'],
$row['details']['file']
);
}
}
$filesEdit = $row['details']['fileEdit'] ?? null;
if ($filesEdit) {
foreach ($filesEdit as $fileEdit) {
// генерируем список загружаемых картинок
$newElements[$row['id']]['fileEdit'] = PathHelper::pathGenerate(
'article',
[
'factoryUrl' => $furl,
'collectionUrl' => $curl,
'file' => $fileEdit
]
);
}
}
$newElements[$row['id']]['imageZipLink'] = null;
$alt[] = $row['name'];
$textures = $row['textures'];
foreach ($textures as $k => $texture) {
$newElements[$row['id']]['textures'][$k]['alias'] = $alt[] = App::trans($texture['alias']);
}
if (!empty($row['interiors'])) {
foreach ($row['interiors'] as $i => $r) {
if (
$r['status'] == 2
|| $r['collection']['status'] != 1
|| $r['collection']['factory']['status'] != 1
) {
if (!empty($newElements[$row['id']]['interiors'][$i])) {
unset($newElements[$row['id']]['interiors'][$i]);
}
continue;
}
$newElements[$row['id']]['interiors'][$i]['url'] = $r['url'];
$newElements[$row['id']]['interiors'][$i]['inIdeaBook'] = in_array($r['id'], $favorites);
if (empty($r['file'])) {
$r['file'] = $r['name'] . '.jpg';
}
if (preg_match('#/f/(.*)/a/#is', App::getRequest()->getUri(), $matches)) {
$url = App::generateUrl('app_collection_slideshow_f', [
'factoryUrl' => $r['collection']['factory']['url'],
'collectionUrl' => $r['collection']['url'],
'filter' => $matches[1],
'type' => 'i',
'elementId' => $r['url']
]);
} else {
$url = App::generateUrl('app_collection_slideshow', [
'factoryUrl' => $r['collection']['factory']['url'],
'collectionUrl' => $r['collection']['url'],
'type' => 'i',
'elementId' => $r['url']
]);
}
$r['file'] = StrHelper::toLower($r['file']);
// $newElements[$row['id']]['interiors']['setting'] = $this->getSettingColl($r['collection']['id']);
// https://te.remote.team/#/discus/6C90A7A2-893A-62A1-117D-43B66115858D/
$newElements[$row['id']]['interiors']['setting'] = $r['collection']['settings'];
$newElements[$row['id']]['interiors'][$i]['url'] = $url;
$newElements[$row['id']]['interiors'][$i]['paths'] = [
'hd' => !empty($r['fileSizeHDY']) ?
PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $r['collection']['factory']['url'],
'collectionUrl' => $r['collection']['url'],
'file' => 'hd_' . $r['file']
]
)
: null,
'shd_1080' => !empty($r['fileSizeSHDY'])
? PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $r['collection']['factory']['url'],
'collectionUrl' => $r['collection']['url'],
'file' => 'shd_' . $r['file']
]
)
: null,
's_900' => PathHelper::pathGenerate(
'interior',
[
'factoryUrl' => $r['collection']['factory']['url'],
'collectionUrl' => $r['collection']['url'],
'file' => $r['file']
]
)
];
}
} else {
$newElements[$row['id']]['interiors'] = [];
}
$newElements[$row['id']] = ArticleHelper::getTileArticleAddOptions($newElements[$row['id']]);
}
if (!empty($newElements[$row['id']]['interiors'])) {
unset($newElements[$row['id']]['interiors']['setting']);
// необходимо, чтобы выровнять ключи
$newElements[$row['id']]['interiors'] = array_values($newElements[$row['id']]['interiors']);
}
$metaManager = new MetaManager($titleData, [
'_route' => 'app_collection_slideshow',
'type' => $type
]);
$newElements[$row['id']]['title'] = html_entity_decode($metaManager->getTitle());
$newElements[$row['id']]['description'] = $metaManager->getDescription();
}
return [
'elements' => $newElements,
'elementsCount' => $elementsCount,
'elementId' => $elementId,
'numberElement' => $res['numberElement'],
];
}
/**
* @param array $elementIdes
* @param ?int $elementId
* @param ?string $load
* @return array
*/
private function getIdes(array $elementIdes, ?int $elementId = null, ?string $load = 'all'): array
{
if (!in_array($load, ['left', 'right', 'all'])) {
$load = 'all';
}
if ($elementId == null) {
$elementId = !empty($elementIdes[0]['id']) ? $elementIdes[0]['id'] : $elementIdes[0] ?? null;
}
$numberElement = [];
$ides = [0 => 0];
foreach ($elementIdes as $k => $row) {
if ($elementId == $row) {
$numberElement[$row] = $k + 1;
if ($load == 'all') {
$ides[] = $row;
}
if ($load == 'left' || $load == 'all') {
if (!empty($elementIdes[$k - 2])) {
$ides[] = $elementIdes[$k - 2];
$numberElement[$elementIdes[$k - 2]] = $k - 1;
}
if (!empty($elementIdes[$k - 1])) {
$ides[] = $elementIdes[$k - 1];
$numberElement[$elementIdes[$k - 1]] = $k;
}
}
if ($load == 'right' || $load == 'all') {
if (!empty($elementIdes[$k + 1])) {
$ides[] = $elementIdes[$k + 1];
$numberElement[$elementIdes[$k + 1]] = $k + 2;
}
if (!empty($elementIdes[$k + 2])) {
$ides[] = $elementIdes[$k + 2];
$numberElement[$elementIdes[$k + 2]] = $k + 3;
}
}
break;
}
}
return [
'ides' => $ides,
'numberElement' => $numberElement
];
}
/**
* @param Request $request
* @param string $factoryUrl
* @param string $collectionUrl
* @param string $type
* @param string|int $elementId
* @param ?string $load
* @return Response
* @throws Exception|\Doctrine\DBAL\Driver\Exception
*/
public function slideAction(
Request $request,
string $factoryUrl,
string $collectionUrl,
string $type,
$elementId,
?string $load = 'all'
) {
$token = UserHelper::getInstance()->getToken();
$collection = $this->collectionRepository->getSlideCollection($factoryUrl, $collectionUrl);
if (!$collection) {
throw $this->createNotFoundException('The collection is not found');
}
//App::debugExit($request, $factoryUrl, $collectionUrl ,$type, $elementId);
$data = $this->getData($request, $token, $type, $collection, $elementId, $load);
return new JsonResponse(['elements' => $data['elements']]);
}
private function unsetInactiveArticleInInteriorOrCollection(?array $element): ?array
{
foreach ($element['articles'] ?? [] as $key => $article) {
if ($article['collection']['status'] == 2) {
unset($element['articles'][$key]);
}
}
return $element;
}
private function getGoogleRefererInfo(): bool
{
if (
stripos($_SERVER['HTTP_REFERER'] ?? '', 'google.') !== false
&& stripos($_SERVER['HTTP_REFERER'] ?? '', 'mail.google.') === false
) {
return true;
}
// https://te2.remote.team/discus/DA0E211E-CD52-A435-805A-0039E39A2954
if (stripos($_SERVER['HTTP_REFERER'] ?? '', 'googleadservices.') !== false) {
return true;
}
// https://te2.remote.team/discus/D058F322-78AA-AEBE-9D88-B2B9B077677C
if (empty($_SERVER['HTTP_REFERER'])) {
return true;
}
return false;
}
private function addInfoAboutAvailableInCountryOfFactory(array $collection, array &$newElement): void
{
if (!($collection['factory']['country']['code'] ?? null)) {
return;
}
switch (StrHelper::toLower($collection['factory']['country']['code'])) {
case 'it':
$newElement['in_stock'] = $this->translator->trans('in_stock_italy');
return;
case 'es':
$newElement['in_stock'] = $this->translator->trans('in_stock_spain');
return;
case 'ge':
$newElement['in_stock'] = $this->translator->trans('in_stock_germany');
return;
case 'ma':
$newElement['in_stock'] = $this->translator->trans('in_stock_morocco');
return;
case 'pt':
$newElement['in_stock'] = $this->translator->trans('in_stock_portugal');
return;
}
}
}