<?php
namespace PortalBundle\Controller;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Component\FormManager;
use CoreBundle\Entity\Model;
use CoreBundle\Entity\Vehicles\RecommendGroup;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Services\MediaExtensionVidi;
use DcSiteBundle\Model\Pagination;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Model\Catalog;
use PortalBundle\Model\SeoMetaTag;
use PortalBundle\Services\CatalogService;
use PortalBundle\Services\ServiceService;
use PortalBundle\Services\VehicleFilterService;
use Symfony\Component\HttpFoundation\JsonResponse;
use CoreBundle\Entity\Brand;
use CoreBundle\Entity\Dealer;
use CoreBundle\Entity\Forms;
use CoreBundle\Model\Vehicles\Vehicle;
use CoreBundle\Model\Vehicles\VehicleType;
use PortalBundle\Enums\CatalogEnum;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\RouterInterface;
/**
* Class CatalogController
* @package PortalBundle\Controller
*/
class CatalogController extends BaseController
{
private Catalog $modelCatalog;
private Pagination $modelPagination;
private CatalogService $catalogService;
private MediaExtensionVidi $mediaExtensionVidi;
private SeoMetaTag $seoMetaTag;
public function __construct(RouterInterface $router, Catalog $modelCatalog, Pagination $modelPagination,
CatalogService $catalogService, MediaExtensionVidi $mediaExtensionVidi,
SeoMetaTag $seoMetaTag, CoreFormFactory $coreFormFactory, RequestStack $requestStack,
Repository $vehicleRepository, ServiceService $serviceService)
{
parent::__construct($coreFormFactory, $requestStack, $router, $vehicleRepository, $serviceService);
$this->modelCatalog = $modelCatalog;
$this->modelPagination = $modelPagination;
$this->catalogService = $catalogService;
$this->mediaExtensionVidi = $mediaExtensionVidi;
$this->seoMetaTag = $seoMetaTag;
}
const PRE_PAGES = 15;
const MAX_PAGINATION_BUTTON = 5;
// Сторінка для тестування
public function catalog(Request $request, EntityManagerInterface $em)
{
$routeParams = $request->attributes->get('_route_params');
$searchParams = $request->query->all();
$cookies = $request->cookies->get('compare');
$findVehicles = $this->modelCatalog->findByParams($routeParams, $searchParams, self::PRE_PAGES);
if(!$findVehicles['data']){
$findVehicles = $this->modelCatalog->noFindVehicleByParams($routeParams, $searchParams, self::PRE_PAGES);
}
$vehicles = $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $routeParams, $cookies);
$pagination = $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES, 5);
$type = $request->get('type');
$state = $request->get('state');
$hasCredit = $request->get('credit');
$brand = $request->get('brand');
if (($brand && $brand === 'all') || ($state && $state === 'all')) {
throw new NotFoundHttpException();
}
$model = $request->get('model');
$findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model');
$param = $request->get('param');
$valueParam = $request->get('value');
$group = $request->get('group');
$typeData = VehicleType::getTypeDataByUrl($type);
if (!$typeData || $request->get('type') == 'special') {
throw new NotFoundHttpException();
}
$vehicleTypeId = $typeData['id'];
$service = $this->catalogService;
$filters = $service->getFilters($searchParams, $request->getLocale(), $state, $vehicleTypeId, $brand, $model, $param, $valueParam, $routeParams, $group);
if ($request->isXmlHttpRequest()) {
return $this->json([
'vehicles' => $service->getAjaxResult($vehicles, $request->getLocale()),
'pagination' => $pagination,
'count' => $findVehicles['count'],
'searchFilters' => $filters,
'hasCredit' => $hasCredit
]);
}
// if ($findVehicles['count'] === 0) {
// throw new NotFoundHttpException();
// }
$brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand);
if ($findModelUrl) {
$modelEm = $em->getRepository(Model::class)->findOneByUrl($findModelUrl, $brandEm);
} else {
$modelEm = null;
}
$catalogNav = $this->modelCatalog->getCatalogNav($type, $state, $hasCredit, $brand, $param, $valueParam, $group);
if(!$modelEm){
$vehicleTopViews = $this->modelCatalog->getVehicleTopViews(5, $brandEm);
}else{
$vehicleTopViews= $this->modelCatalog->getVehicleItemTopViews(5, $brandEm, $modelEm);
}
if ($hasCredit && !$brandEm) {
$randomTopViews = $this->modelCatalog->getRandomBrand(5);
} elseif ($hasCredit) {
$randomTopViews = $this->modelCatalog->getRandomModelBrand(999, $brandEm, $modelEm);
}
$dealers = $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm);
if (!$brand && ($routeParams['type'] == 'truck' || $routeParams['type'] == 'bus')) {
$brandSId = [];
foreach ($vehicles as $vehicle) {
$brandSId[] = $vehicle['dealer'];
}
$dealers = $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]);
}
$dealers = array_filter($dealers, fn($dealer) => $dealer->getId() !== 39);
$seoLinks = $this->seoMetaTag->buildSeoLinks($routeParams, $request->getLocale());
$seoLinks = $service->seoYearsLinksFilter($routeParams, $vehicles, $searchParams, $seoLinks);
$isUsed = $state == 'used';
$catalogCharacteristic = $service->catalogCharacteristic($vehicleTypeId, $isUsed);
$OrderCallForm = new Forms();
$OrderCallForm = $this->CoreFormFactory()->orderCallForm($OrderCallForm, $brandEm ? $brandEm->getDealer()[0] : null, 1)->createView();
return $this->basePortalRender('@Portal/Catalog/index.html.twig', [
'vehicles' => $vehicles,
'seoLinks' => $seoLinks,
'pagination' => $pagination,
'filters' => $filters,
'catalogNav' => $catalogNav,
'baseParams' => $routeParams,
'searchParams' => $searchParams,
'dealers' => $dealers,
'vehicleTopViews' => $vehicleTopViews,
'randomTopViews' => $randomTopViews ?? null,
'minMaxPrice' => $findVehicles['minMaxPrice'] ?? 0,
'minMaxCreditPayment' => $findVehicles['minMaxCreditPayment'] ?? 0,
'count' => $findVehicles['count'],
'type' => $routeParams['type'],
'state' => $routeParams['state'],
'group' => $routeParams['group'] ?? null,
'hasCredit' => $hasCredit,
'brand' => $brand,
'brandEm' => $brandEm,
'model' => $model,
'modelEm' => $modelEm,
'param' => $param,
'value' => $request->get('value'),
'year' => ($param === 1000) ? $param : $valueParam,
'seoMeta' => $this->seoMetaTag->buildSeoMeta($request),
'valueParam' => $catalogCharacteristic[$param][$valueParam] ?? null,
'catalogBanner' => $service->getCatalogBanner($request),
'OrderCallForm' => $OrderCallForm ?? '',
]);
}
/**
* @param Request $request
* @return JsonResponse
*/
public function buildFilters(Request $request): JsonResponse
{
$filters = $this->modelCatalog->buildFilters($request->request->all(), $request->getLocale());
return $this->json($filters);
}
/**
* @param Request $request
* @return JsonResponse
*/
public function getDealersFromSelectedFilter(Request $request, EntityManagerInterface $em): JsonResponse
{
$data = json_decode($request->getContent(), true);
$dealers = [];
foreach ($data as $brandUrl => $key) {
if ($key) {
$brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brandUrl);
$dealer = $em->getRepository(Dealer::class)->getCarDealer($brandEm);
if (count($dealer) > 1) {
foreach ($dealer as $oneDealer) {
$dealers[] = [
'id' => $oneDealer->getId(),
'name' => $oneDealer->getNameByLocale($request->getLocale()),
'brandName' => $oneDealer->getBrand()->getName(),
'domain' => $oneDealer->getDomain(),
'logo' => $this->mediaExtensionVidi->getPath($oneDealer->getBrand()->getLogo(), 'reference'),
'address' => $oneDealer->getAddressByLocale($request->getLocale()),
'phone' => $oneDealer->getPhone(),
'mapUrl' => 'https://maps.google.com/maps?q=' . $oneDealer->getLat() . ',' . $oneDealer->getLng() . '&hl=' . $request->getLocale(),
];
}
// Для дилерів з одним брендом
} else {
if ($dealer) {
$dealer = $dealer[0];
$dealers[] = [
'id' => $dealer->getId(),
'name' => $dealer->getNameByLocale($request->getLocale()),
'brandName' => $dealer->getBrand()->getName(),
'domain' => $dealer->getDomain(),
'logo' => $this->mediaExtensionVidi->getPath($dealer->getBrand()->getLogo(), 'reference'),
'address' => $dealer->getAddressByLocale($request->getLocale()),
'phone' => $dealer->getPhone(),
'mapUrl' => 'https://maps.google.com/maps?q=' . $dealer->getLat() . ',' . $dealer->getLng() . '&hl=' . $request->getLocale(),
];
}
}
}
}
$dealers = array_filter($dealers, fn($dealer) => $dealer['id'] !== 39);
return $this->json($dealers);
}
/**
* @param Request $request
* @return JsonResponse
*/
public function getDealersFromFilter(Request $request, EntityManagerInterface $em): JsonResponse
{
$data = json_decode($request->getContent(), true);
$dealers = [];
foreach ($data as $brand) {
$brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand['url']);
$dealer = $em->getRepository(Dealer::class)->getCarDealer($brandEm);
// Для дилерів з декількома брендами
if (count($dealer) > 1) {
foreach ($dealer as $oneDealer) {
$dealers[] = [
'id' => $oneDealer->getId(),
'name' => $oneDealer->getNameByLocale($request->getLocale()),
'brandName' => $oneDealer->getBrand()->getName(),
'domain' => $oneDealer->getDomain(),
'logo' => $this->mediaExtensionVidi->getPath($oneDealer->getBrand()->getLogo(), 'reference'),
'address' => $oneDealer->getAddressByLocale($request->getLocale()),
'phone' => $oneDealer->getPhone(),
'mapUrl' => 'https://maps.google.com/maps?q=' . $oneDealer->getLat() . ',' . $oneDealer->getLng() . '&hl=' . $request->getLocale(),
];
}
// Для дилерів з одним брендом
} else {
if ($dealer) {
$dealer = $dealer[0];
$dealers[] = [
'id' => $dealer->getId(),
'name' => $dealer->getNameByLocale($request->getLocale()),
'brandName' => $dealer->getBrand()->getName(),
'domain' => $dealer->getDomain(),
'logo' => $this->mediaExtensionVidi->getPath($dealer->getBrand()->getLogo(), 'reference'),
'address' => $dealer->getAddressByLocale($request->getLocale()),
'phone' => $dealer->getPhone(),
'mapUrl' => 'https://maps.google.com/maps?q=' . $dealer->getLat() . ',' . $dealer->getLng() . '&hl=' . $request->getLocale(),
];
}
}
}
$dealers = array_filter($dealers, fn($dealer) => $dealer['id'] !== 39);
return $this->json($dealers);
}
/**
* @param Request $request
* @return JsonResponse
*/
public function buildUrl(Request $request)
{
$params = $request->request->all();
$type = $params['type'];
$state = $params['state'];
$brand = $params['brand'] ?? null;
$model = $params['model'] ?? null;
$hasCredit = $params['hasCredit'] ?? null;
$isAjax = $params['isAjax'] ?? null;
if (is_array($brand) && count($brand) == 1) {
$brand = array_keys($brand)[0];
}
if (is_array($model) && count($model) == 1) {
$model = array_keys($model)[0];
}
$baseRouteParams = [
'type' => $type,
'state' => $state,
];
$getParams = [];
foreach ($params as $key => $row) {
if (!in_array($key, ['type', 'state', 'brand', 'model', 'dynamic', 'hasCredit']) && $row) {
$getParams[$key] = $row;
}
}
if (is_array($brand)) {
$getParams['m-brand'] = $brand;
$brand = null;
} else if ($brand) {
$getParams['m-brand'] = [$brand => true];
}
if (is_array($model)) {
$getParams['m-model'] = $model;
$model = null;
} else if ($model) {
$getParams['m-model'] = [$model => true];
$model = null;
}
$dynamic = [];
if (isset($params['dynamic'])) {
foreach ($params['dynamic'] as $id => $values) {
if (array_key_exists('from', $values) || array_key_exists('to', $values)) {
$dynamic[$id] = $values;
} else {
foreach ($values as $url => $v) {
if ($v != 'false') {
$dynamic[$id][$url] = 1;
}
}
}
}
}
$catalogCharacteristic = array_flip($this->modelCatalog->getCatalogCharacteristicsId());
if (!$brand && !$model && (!count($dynamic) || empty(array_intersect_key($dynamic, $catalogCharacteristic)))) {
$url = $this->router
->generate(
($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG : CatalogEnum::ROUTE_PORTAL_CATALOG,
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic])
);
return $this->json(['url' => $url]);
}
if (!$brand && !$model && count($dynamic)) {
$dId = key($dynamic);
$value = key($dynamic[$dId]);
if (!count($dynamic[$dId])) {
unset($dynamic[$dId]);
}
$baseRouteParams['param'] = $dId;
$baseRouteParams['value'] = $value;
$url = $this->router
->generate(
($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_PARAM : CatalogEnum::ROUTE_PORTAL_CATALOG_PARAM,
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic])
);
return $this->json(['url' => $url]);
}
if ($model) {
$baseRouteParams['model'] = $model;
$baseRouteParams['brand'] = $brand;
$url = $this->router
->generate(
($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_BM_NAME : CatalogEnum::ROUTE_PORTAL_CATALOG_BM_NAME,
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic])
);
return $this->json(['url' => $url]);
}
if ($brand) {
$baseRouteParams['brand'] = $brand;
$url = $this->router
->generate(
($hasCredit) ? CatalogEnum::ROUTE_PORTAL_CREDIT_CATALOG_B_NAME : CatalogEnum::ROUTE_PORTAL_CATALOG_B_NAME,
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic])
);
return $this->json(['url' => $url]);
}
}
public function catalogCategory(Request $request, $url, EntityManagerInterface $em, \CoreBundle\Factory\Vehicle $vehicleFactory)
{
$dealers = $em->getRepository(Dealer::class)->getCarDealer();
$recommends = $em->getRepository(RecommendGroup::class)->findBy(['state' => 1]);
$recommendGroup = $em->getRepository(RecommendGroup::class)->findOneBy(['url' => $url]);
$recommendGroupVehicles = $em->getRepository(\CoreBundle\Entity\Vehicles\Vehicle::class)->getVehicleByRecommendGroupUrl(['url' => $url]);
$vehicles = $vehicleFactory->createByEntities($recommendGroupVehicles);
$sort = $request->get('sort');
usort($vehicles, function (Vehicle $a, Vehicle $b) use ($sort) {
switch ($sort) {
case 'price-DESC':
return $a->fullPrice() < $b->fullPrice();
default:
return $a->fullPrice() > $b->fullPrice();
}
});
$seoMeta = [];
$urn = preg_replace('/^(\/?ua\/|\/?ru\/)/', '/', $request->getRequestUri());
$seo = $em->getRepository(\CoreBundle\Entity\SeoMetaTag::class)
->findOneBy(['domain' => $request->getHost(), 'urn' => $urn]);
if ($seo && $seo->getState()) {
$seoMeta = [
'title' => $seo->getTitle($request->getLocale()),
'description' => $seo->getDescription($request->getLocale()),
'h1' => $seo->getH1($request->getLocale()),
'robots' => $seo->getRobots(),
];
}
return $this->basePortalRender('@Portal/Car/category.html.twig', [
'dealers' => $dealers,
'recommends' => $recommends,
'recommendGroup' => $recommendGroup,
'vehicles' => $vehicles,
'url' => $url,
'seoMeta' => $seoMeta,
]);
}
//TODO remove this magic numbers
private function createPaginator($data, $page = 1, $limit = 21)
{
$maxPages = 10;
$paginator = [
'total' => ceil(count($data) / $limit),
'current' => $page,
];
if ($paginator['total'] > $maxPages && $page > floor($maxPages / 2)) {
$paginator['start'] = $page - floor($maxPages / 2);
$paginator['end'] = $paginator['start'] + $maxPages - 1;
} else {
$paginator['start'] = 1;
$paginator['end'] = min($paginator['total'], $maxPages);
}
return $paginator;
}
public function getChangeFilter(VehicleFilterService $vehicleFilterService): JsonResponse
{
return $this->json(['success' => true, 'filter' => $vehicleFilterService->initFilter()]);
}
public function initVehicleFilterUrl(VehicleFilterService $vehicleFilterService): JsonResponse
{
return $this->json(['success' => true, 'filterUrl' => $vehicleFilterService->getUrl()]);
}
public function vehicleColor(): JsonResponse
{
$vehicleImageColor = $this->modelCatalog->getVehicleImageColor();
return $this->json([
'success' => true,
'image' => $vehicleImageColor,
]);
}
public function saveCallback(Request $request, EntityManagerInterface $em, FormManager $formManager)
{
$dealer = $em->getRepository(Dealer::class)->findOneBy(['id' => $request->request->get('call_order')['dealer']]);
return $formManager->saveCallbackForm($request, $dealer);
}
//search
/**
* @param Request $request
* @return JsonResponse
*/
public function buildSearchUrl(Request $request)
{
$params = $request->request->all();
$type = $params['type'];
$state = $params['state'];
$hasCredit = filter_var($params['credit'] ?? false, FILTER_VALIDATE_BOOLEAN);
$brand = $params['brand'] ?? null;
$model = $params['model'] ?? null;
$isAjax = $params['isAjax'] ?? null;
if (is_array($brand) && count($brand) == 1) {
$brand = array_keys($brand)[0];
}
if (is_array($model) && count($model) == 1) {
$model = array_keys($model)[0];
}
$baseRouteParams = [
'type' => $type,
'state' => $state,
];
if($hasCredit){
$baseRouteParams['credit'] = true;
}
$getParams = [];
foreach ($params as $key => $row) {
if (!in_array($key, ['type', 'state', 'brand', 'model', 'dynamic']) && $row) {
$getParams[$key] = $row;
}
}
if (is_array($brand)) {
$getParams['m-brand'] = $brand;
$brand = null;
} else if ($brand) {
$getParams['m-brand'] = [$brand => true];
}
if (is_array($model)) {
$getParams['m-model'] = $model;
$model = null;
} else if ($model) {
$getParams['m-model'] = [$model => true];
$model = null;
}
$dynamic = [];
if (isset($params['dynamic'])) {
foreach ($params['dynamic'] as $id => $values) {
if (array_key_exists('from', $values) || array_key_exists('to', $values)) {
$dynamic[$id] = $values;
} else {
foreach ($values as $url => $v) {
if ($v != 'false') {
$dynamic[$id][$url] = 1;
}
}
}
}
}
$catalogCharacteristic = array_flip($this->modelCatalog->getCatalogCharacteristicsId());
if (!$brand && !$model && (!count($dynamic) || empty(array_intersect_key($dynamic, $catalogCharacteristic)))) {
$url = $this->router
->generate(
'portal_filter_catalog',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
$apiUrl = $this->router
->generate(
'portal_filter_catalog_api',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
return $this->json(['url' => $url, 'apiUrl' => $apiUrl]);
}
if (!$brand && !$model && count($dynamic)) {
$dId = key($dynamic);
$value = key($dynamic[$dId]);
if (!count($dynamic[$dId])) {
unset($dynamic[$dId]);
}
$baseRouteParams['param'] = $dId;
$baseRouteParams['value'] = $value;
$url = $this->router
->generate(
'portal_filter_catalog',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
$apiUrl = $this->router
->generate(
'portal_filter_catalog_api',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
return $this->json(['url' => $url, 'apiUrl' => $apiUrl]);
}
if ($model) {
$baseRouteParams['model'] = $model;
$baseRouteParams['brand'] = $brand;
$url = $this->router
->generate(
'portal_filter_catalog',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
$apiUrl = $this->router
->generate(
'portal_filter_catalog_api',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
return $this->json(['url' => $url, 'apiUrl' => $apiUrl]);
}
if ($brand) {
$baseRouteParams['brand'] = $brand;
$url = $this->router
->generate(
'portal_filter_catalog',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
$apiUrl = $this->router
->generate(
'portal_filter_catalog_api',
array_merge($baseRouteParams, $getParams, ['dynamic' => $dynamic, 'state' => $state, 'type' => $type])
);
return $this->json(['url' => $url, 'apiUrl' => $apiUrl]);
}
}
public function catalogSearch(Request $request, EntityManagerInterface $em)
{
$searchParams = $request->query->all();
$routeParams = $request->attributes->get('_route_params');
$cookies = $request->cookies->get('compare');
$findVehicles = $this->modelCatalog->findByParams($searchParams, $searchParams, self::PRE_PAGES);
if(!$findVehicles['data']){
$findVehicles = $this->modelCatalog->noFindVehicleByParams($searchParams, $searchParams, self::PRE_PAGES);
}
$vehicles = $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $searchParams, $cookies);
$pagination = $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES, 5);
$value = null;
$model = '';
$brand = '';
$vehicleTopViews = [];
$type = $request->get('type');
$state = $request->get('state');
$hasCredit = filter_var($request->get('credit') ?? false, FILTER_VALIDATE_BOOLEAN);
if ($request->get('m-brand')) {
$brand = array_key_first($request->get('m-brand'));
}
if ($request->get('m-model')) {
$model = array_key_first($request->get('m-model'));
}
if (isset($searchParams['dynamic'])) {
$param = array_key_first($searchParams['dynamic']);
if (isset($searchParams['dynamic'][$param])) {
$value = array_key_first($searchParams['dynamic'][$param]);
}
}
if ($brand && $brand === 'all') {
throw new NotFoundHttpException();
}
$findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model');
$param = $request->get('param');
$valueParam = $request->get('value');
$typeData = VehicleType::getTypeDataByUrl($type);
if (!$typeData) {
throw new NotFoundHttpException();
}
$vehicleTypeId = $typeData['id'];
$service = $this->catalogService;
$filters = $service->getFilters($searchParams, $request->getLocale(), $state, $vehicleTypeId, $brand, $model, $param, $valueParam, $routeParams);
$brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand);
$modelEm = $em->getRepository(Model::class)->findOneByUrl($findModelUrl, $brandEm);
$catalogNav = $this->modelCatalog->getCatalogNavByGetParams($type, $state, $hasCredit, $brand, $searchParams, $valueParam);
if ($brandEm) {
if (!$modelEm) {
$vehicleTopViews = $this->modelCatalog->getVehicleTopViews(5, $brandEm);
} else {
$vehicleTopViews = $this->modelCatalog->getVehicleItemTopViews(5, $brandEm, $modelEm);
}
}
$dealers = $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm);
if (!$brand && ($searchParams['type'] == 'truck' || $searchParams['type'] == 'bus')) {
$brandSId = [];
foreach ($vehicles as $vehicle) {
$brandSId[] = $vehicle['dealer'];
}
$dealers = $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]);
}
$dealers = array_filter($dealers, fn($dealer) => $dealer->getId() !== 39);
if ($model && !isset($searchParams['model'])) {
$searchParams['model'] = $model;
}
if ($brand && !isset($searchParams['brand'])) {
$searchParams['brand'] = $brand;
}
$seoLinks = $this->seoMetaTag->buildSeoLinks($searchParams, $request->getLocale());
$isUsed = $state == 'used';
$catalogCharacteristic = $service->catalogCharacteristic($vehicleTypeId, $isUsed);
$seoLinks = $service->seoYearsLinksFilter($searchParams, $vehicles, $searchParams, $seoLinks);
$OrderCallForm = new Forms();
$OrderCallForm = $this->CoreFormFactory()->orderCallForm($OrderCallForm, $brandEm ? $brandEm->getDealer()[0] : null, 1)->createView();
return $this->basePortalRender('@Portal/Car/catalog-search.html.twig', [
'vehicles' => $vehicles,
'seoLinks' => [],
'pagination' => $pagination,
'filters' => $filters,
'catalogNav' => $catalogNav,
'baseParams' => $searchParams,
'searchParams' => $searchParams,
'dealers' => $dealers,
'vehicleTopViews' => $vehicleTopViews,
'count' => $findVehicles['count'],
'type' => $searchParams['type'],
'state' => $searchParams['state'],
'hasCredit' => $searchParams['hasCredit'] ?? false,
'brand' => $brand,
'brandEm' => $brandEm,
'model' => $model,
'modelEm' => $modelEm,
'param' => $param,
'value' => $request->get('value'),
'year' => ($param === 1000) ? $param : $valueParam,
'seoMeta' => $this->seoMetaTag->buildSeoMetaGetParams($request, $searchParams, $searchParams, $param, $value),
'valueParam' => $catalogCharacteristic[$param][$valueParam] ?? null,
'catalogBanner' => $service->getCatalogBanner($request),
'OrderCallForm' => $OrderCallForm ?? '',
]);
}
public function catalogSearchApi(Request $request, EntityManagerInterface $em)
{
$searchParams = $request->query->all();
$routeParams = $request->attributes->get('_route_params');
$cookies = $request->cookies->get('compare');
$findVehicles = $this->modelCatalog->findByParams($searchParams, $searchParams, self::PRE_PAGES);
if(!$findVehicles['data']){
$findVehicles = $this->modelCatalog->noFindVehicleByParams($searchParams, $searchParams, self::PRE_PAGES);
}
$vehicles = $this->modelCatalog->getVehicleByCatalog($this->getUser(), $findVehicles['data'], $searchParams, $cookies);
$pagination = $this->modelPagination->initPagination($findVehicles['count'], self::PRE_PAGES, 5);
$value = null;
$model = '';
$brand = '';
$vehicleTopViews = [];
$type = $request->get('type');
$state = $request->get('state');
$hasCredit = filter_var($request->get('credit') ?? false, FILTER_VALIDATE_BOOLEAN);
if ($request->get('m-brand')) {
$brand = array_key_first($request->get('m-brand'));
}
if ($request->get('m-model')) {
$model = array_key_first($request->get('m-model'));
}
if (isset($searchParams['dynamic'])) {
$param = array_key_first($searchParams['dynamic']);
if (isset($searchParams['dynamic'][$param])) {
$value = array_key_first($searchParams['dynamic'][$param]);
}
}
if ($brand && $brand === 'all') {
throw new NotFoundHttpException();
}
$findModelUrl = (isset($searchParams['m-model'])) ? key($searchParams['m-model']) : $request->get('model');
$param = $request->get('param');
$valueParam = $request->get('value');
$typeData = VehicleType::getTypeDataByUrl($type);
if (!$typeData) {
throw new NotFoundHttpException();
}
$vehicleTypeId = $typeData['id'];
$service = $this->catalogService;
$filters = $service->getFilters($searchParams, $request->getLocale(), $state, $vehicleTypeId, $brand, $model, $param, $valueParam, $routeParams);
$brandEm = $em->getRepository(Brand::class)->getBrandByUrl($brand);
$modelEm = $em->getRepository(Model::class)->findOneByUrl($findModelUrl, $brandEm);
if ($brandEm) {
if (!$modelEm) {
$vehicleTopViews = $this->modelCatalog->getVehicleTopViews(5, $brandEm);
} else {
$vehicleTopViews = $this->modelCatalog->getVehicleItemTopViews(5, $brandEm, $modelEm);
}
}
$dealers = $em->getRepository(Dealer::class)->getDealerByBrandUrl($brandEm);
if (!$brand && ($searchParams['type'] == 'truck' || $searchParams['type'] == 'bus')) {
$brandSId = [];
foreach ($vehicles as $vehicle) {
$brandSId[] = $vehicle['dealer'];
}
$dealers = $em->getRepository(Dealer::class)->findBy(['id' => $brandSId]);
}
if ($model && !isset($searchParams['model'])) {
$searchParams['model'] = $model;
}
if ($brand && !isset($searchParams['brand'])) {
$searchParams['brand'] = $brand;
}
if ($request->isXmlHttpRequest()) {
return $this->json([
'vehicles' => $service->getAjaxResult($vehicles, $request->getLocale()),
'pagination' => $pagination,
'hasCredit' => $searchParams['hasCredit'] ?? false,
'count' => $findVehicles['count'],
'searchFilters' => $filters,
'seoLinks' => []
]);
}
return false;
}
}