src/Controller/HomepageController.php line 596
<?phpnamespace App\Controller;use App\Repository\BlogKindRepository;use App\Repository\BlogRepository;use App\Repository\DealerOpenHourRepository;use App\Repository\DealerRepository;use App\Repository\DistrictRepository;use App\Repository\PageRepository;use App\Repository\PartnerRepository;use App\Repository\RegionRepository;use App\Repository\VehicleBodyRepository;use App\Repository\VehicleCategoryRepository;use App\Repository\VehicleFuelRepository;use App\Repository\VehicleKindRepository;use App\Repository\VehicleManufacturerRepository;use App\Repository\VehicleModelRepository;use App\Repository\VehiclePartKindRepository;use App\Repository\VehicleRepository;use App\Repository\VehicleTipRepository;use App\Service\VehicleSeoService;use DateTime;use DateTimeZone;use Knp\Component\Pager\PaginatorInterface;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;/*** @phpstan-type PlaceValue array{name: string, url: string}* @phpstan-type Partner array{0: string, 1: string}*/class HomepageController extends AbstractController{#[Route('/{idAutanet}/auto-{idTipCars}/{urlName}.html', name: 'page_vehicle_detail_redirect', methods: ['GET'])]public function vehicleDetailRedirect(int $idAutanet, int $idTipCars, string $urlName, VehicleRepository $vehicleRepository): Response{$vehicle = $vehicleRepository->findOneBy(['idImport' => $idTipCars]);if ($vehicle) {return $this->redirectToRoute('page_vehicle_detail',['urlModel' => $vehicle->getModel()->getUrl(),'urlManufacturer' => $vehicle->getManufacturer()->getUrl(), 'id' => $vehicle->getId()]);} else {throw $this->createNotFoundException('Page old url vehicle no exist');}}#[Route('/models', name: 'app_models', methods: ['GET'])]public function getModels(Request $request, VehicleModelRepository $vehicleModelRepository, VehicleManufacturerRepository $manufacturerRepository): Response{$models = [];$manufacturerId = $request->get('idManufacturer');if ($manufacturerId) {$manufacturer = $manufacturerRepository->find($manufacturerId);if ($manufacturer) {foreach ($vehicleModelRepository->findActive($manufacturer) as $model) {$models[] = ['id' => $model->getId(),'name' => $model->getName(),'url' => $model->getUrl(),];}}}return $this->json(compact('models'));}#[Route('/autobazary/{urlPlace}', name: 'page_dealer', defaults: ['urlPlace' => false], methods: ['GET'])]public function dealers(string $urlPlace, Request $request, PaginatorInterface $paginator,DealerRepository $dealerRepository,VehicleRepository $vehicleRepository,DistrictRepository $districtRepository,RegionRepository $regionRepository): Response{$parameters = ['visible' => '1','excludeBasic' => true,];$activePlace = false;if ($urlPlace) {$dealer = $dealerRepository->findOneBy(['url' => $urlPlace]);if ($dealer) {return $this->redirectToRoute('page_dealer_detail', ['url' => $urlPlace], Response::HTTP_MOVED_PERMANENTLY);}if ('praha' === $urlPlace) {$urlPlace = 'hlavni-mesto-praha';}if ('ostrava' === $urlPlace) {$urlPlace = 'ostrava-mesto';}if ('brno' === $urlPlace) {$urlPlace = ['brno-mesto', 'brno-venkov'];}if ('plzen' === $urlPlace) {$urlPlace = ['plzen-mesto', 'plzen-jih', 'plzen-sever'];}if (!is_array($urlPlace) && $regionRepository->findOneBy(['url' => $urlPlace])) {$parameters['region'] = $urlPlace;$activePlace = $regionRepository->findOneBy(['url' => $urlPlace]);} else {$parameters['district'] = $urlPlace;if (is_array($urlPlace)) {$urlPlace = $urlPlace[0];}$activePlace = $districtRepository->findOneBy(['url' => $urlPlace]);}if (!$activePlace) {throw $this->createNotFoundException('The place does not exist');}}if ($request->query->all()) {$parameters += $request->query->all();}$pagination = $paginator->paginate($dealerRepository->findQuery($parameters), /* query NOT result */$request->query->getInt('page', 1), /*page number*/10 /*limit per page*/);$dealerMap = [];foreach ($dealerRepository->findBy(['visible' => '1'], ['name' => 'ASC']) as $dealer) {if ($dealer->isBasicAdvertising()) {continue;}$dealerMap[] = ['id' => $dealer->getId(),'lat' => $dealer->getLat(),'lng' => $dealer->getLng(),'street' => $dealer->getStreet(),'city' => $dealer->getCity(),'link' => $this->generateUrl('page_dealer_detail', ['url' => $dealer->getUrl()]),'name' => $dealer->getName(),'region' => $dealer->getDistrict()?->getRegion()?->getName() ?? '','countVehicle' => $vehicleRepository->count(['dealer' => $dealer, 'visible' => '1']),];}return $this->render('homepage/dealer.html.twig', ['dealers' => $pagination,'urlPlace' => $urlPlace,'dealerMap' => $dealerMap,'selectPlaceValues' => $this->getSelectPlaceValues($regionRepository, $districtRepository),'activePlace' => $activePlace,]);}/*** @param RegionRepository $regionRepository* @param DistrictRepository $districtRepository* @return array<int, PlaceValue>*/private function getSelectPlaceValues(RegionRepository $regionRepository, DistrictRepository $districtRepository): array{$selectPlaceValues = [];foreach ($regionRepository->findBy([], ['name' => 'ASC']) as $region) {if (strpos($region->getName(), 'Praha') !== false) {$selectPlaceValues[] = ['name' => 'Praha','url' => 'praha'];continue;}$selectPlaceValues[] = ['name' => $region->getName(),'url' => $region->getUrl()];}foreach ($districtRepository->findBy([], ['name' => 'ASC']) as $district) {//if in name prahaif (strpos($district->getName(), 'Praha') !== false) {continue;}if (strpos($district->getName(), 'Ostrava') !== false) {$selectPlaceValues[] = ['name' => 'Ostrava','url' => 'ostrava'];continue;}if (strpos($district->getName(), 'Brno-venkov') !== false) {continue;}if (strpos($district->getName(), 'území Hlavního města Prahy') !== false) {continue;}if (strpos($district->getName(), 'Brno-město') !== false) {$selectPlaceValues[] = ['name' => 'Brno','url' => 'brno'];continue;}if (strpos($district->getName(), 'Plzeň-jih') !== false|| strpos($district->getName(), 'Plzeň-sever') !== false) {continue;}if (strpos($district->getName(), 'Plzeň-město') !== false) {$selectPlaceValues[] = ['name' => 'Plzeň','url' => 'plzen'];continue;}$selectPlaceValues[] = ['name' => $district->getName(),'url' => $district->getUrl()];}return $selectPlaceValues;}#[Route(path: ['/autobazary/{url}/kontakt','/autobazary/{url}/kontakty',], name: 'page_dealer_detail_redirect_contact', methods: ['GET'])]public function dealerDetailRedirectContact(string $url): Response{return $this->redirectToRoute('page_dealer_detail', ['url' => $url], Response::HTTP_MOVED_PERMANENTLY);}#[Route('/autobazary/{url}/vozidla', name: 'redirect_autobazary_vozidla', methods: ['GET'], priority: 10)]public function redirectAutobazaryVozidla(string $url): Response{return $this->redirect(sprintf("/autobazar/%s/vozidla", $url), Response::HTTP_MOVED_PERMANENTLY);}#[Route(path: ['/autobazary/{url}/{urlManufacturer}',], name: 'page_dealer_detail_redirect', methods: ['GET'])]public function dealerDetailRedirect(string $url, string $urlManufacturer): Response{//http://127.0.0.1:8000/autobazary/ald-automotive/audi$url = '/autobazar/' . $url . '/vozidla/' . $urlManufacturer;return $this->redirect($url, Response::HTTP_MOVED_PERMANENTLY);}#[Route('/autobazar/{url}', name: 'page_dealer_detail', methods: ['GET'])]public function dealerDetail(string $url,VehicleRepository $vehicleRepository,DealerOpenHourRepository $dealerOpenHourRepository,DealerRepository $dealerRepository,VehicleTipRepository $vehicleTipRepository): Response{$dealer = $dealerRepository->findOneBy(['url' => $url]);if (!$dealer) {throw $this->createNotFoundException('The dealer does not exist');}$date = new DateTime('now', new DateTimeZone('Europe/Prague'));$openTime = $dealerOpenHourRepository->findBy(['dealer' => $dealer, 'summer' => $date->format('I')]);$hasVehicleImport = $dealer->getNameImportVehicle() !== null && !empty($dealer->getIdImportVehicle());if (!$hasVehicleImport) {$vehicles = [];$vehicleTips = $vehicleTipRepository->findRandVisible(6);} else {$vehicles = $vehicleRepository->findBy(['dealer' => $dealer, 'visible' => true], ['createAt' => 'DESC'], 5);$vehicleTips = [];}$dealerType = $dealer->isAuthSeller() ? 'autosalon' : 'autobazar';$seoTitle = sprintf('%s %s %s | Autanet.cz', $dealer->getName(), $dealerType, $dealer->getCity());if (!$hasVehicleImport) {$seoDescription = sprintf('%s %s %s – profil prodejce vozidel s kontaktními údaji, mapou, odkazem na webové stránky a provozní dobou.',$dealer->getName(), $dealerType, $dealer->getCity());} else {$seoDescription = sprintf('%s %s %s - novinky z nabídky inzerce, kontakty, mapa, provozní doba.',$dealer->getName(), $dealerType, $dealer->getCity());}return $this->render('homepage/detailDealer.html.twig', ['dealer' => $dealer,'openTime' => $openTime,'vehicles' => $vehicles,'vehicleTips' => $vehicleTips,'hasVehicleImport' => $hasVehicleImport,'isBasicDealer' => $dealer->isBasicAdvertising(),'seoTitle' => $seoTitle,'seoDescription' => $seoDescription,]);}#[Route('clanky/{urlKind}/{urlManufacturer}', name: 'page_blog_universal', requirements: ['urlManufacturer' => '[a-z0-9\-]+'], methods: ['GET'], priority: 1)]public function blogUniversal(string $urlKind,string $urlManufacturer,BlogKindRepository $blogKindRepository,BlogRepository $blogRepository,VehicleManufacturerRepository $manufacturerRepository,VehicleModelRepository $modelRepository,Request $request,PaginatorInterface $paginator): Response{$blogKind = $blogKindRepository->findOneBy(['url' => $urlKind]);if (!$blogKind) {throw $this->createNotFoundException('The blog kind does not exist');}if (str_contains($urlManufacturer, '-')) {[$manufacturerUrl, $modelUrl] = $this->parseManufacturerAndModel($urlManufacturer, $manufacturerRepository, $blogKindRepository);} else {$manufacturerUrl = $urlManufacturer;$modelUrl = null;}$manufacturer = $manufacturerUrl ? $manufacturerRepository->findOneBy(['url' => $manufacturerUrl]) : null;$model = ($modelUrl && $manufacturer) ? $modelRepository->findOneBy(['url' => $modelUrl, 'vehicleManufacturer' => $manufacturer]) : null;$isTestyAut = $blogKind->getUrl() === 'testy-aut';$baseParameters = ['visible' => '1', 'urlKind' => $urlKind];$notFoundMessage = null;$activeManufacturer = null;$activeModel = null;if (!$isTestyAut || !$manufacturer) {$pagination = $paginator->paginate($blogRepository->findQuery($baseParameters),$request->query->getInt('page', 1), 20);if (!$manufacturer) {$notFoundMessage = "Testy pro požadovanou značku nebyly nalezeny. Zobrazujeme všechny testy aut.";}} else {$manufacturerParameters = array_merge($baseParameters, ['manufacturer' => $manufacturer->getId()]);$manufacturerResults = $blogRepository->findQueryWithManufacturer($manufacturerParameters);if (empty($manufacturerResults)) {$pagination = $paginator->paginate($blogRepository->findQuery($baseParameters),$request->query->getInt('page', 1), 20);$notFoundMessage = "Testy pro požadovanou značku nebyly nalezeny. Zobrazujeme všechny testy aut.";} else {$activeManufacturer = $manufacturer;$paginateResults = $manufacturerResults;$notFoundMessage = $modelUrl ? "Testy pro hledaný model nebyly nalezeny. Zobrazujeme všechny testy této značky." : null;if ($model) {$modelParameters = array_merge($manufacturerParameters, ['model' => $model->getId()]);$modelResults = $blogRepository->findQueryWithManufacturerAndModel($modelParameters);if (!empty($modelResults)) {$activeModel = $model;$paginateResults = $modelResults;$notFoundMessage = null;}}$pagination = $paginator->paginate($paginateResults, $request->query->getInt('page', 1), 20);}}$manufacturers = $manufacturerRepository->findByBlogKind($blogKind);$models = $manufacturer ? $modelRepository->findByManufacturerAndBlogKind($manufacturer, $blogKind) : [];$data = ['blogs' => $pagination,'blogKind' => $blogKind,'manufacturers' => $manufacturers,'models' => $models,'activeManufacturer' => $activeManufacturer,'activeModel' => $activeModel,'notFoundMessage' => $notFoundMessage,];return $this->render('homepage/blog.html.twig', $data);}#[Route('clanky/{urlKind}', name: 'page_blog', methods: ['GET'], priority: 0)]public function blog(string $urlKind, BlogKindRepository $blogKindRepository,BlogRepository $blogRepository, VehicleManufacturerRepository $manufacturerRepository,Request $request, PaginatorInterface $paginator): Response{if ($urlKind == 'vsechny-clanky') {$parameters = ['visible' => '1','urlKind' => '',];$blogKind = false;} else {$parameters = ['visible' => '1','urlKind' => $urlKind,];$blogKind = $blogKindRepository->findOneBy(['url' => $urlKind]);if (!$blogKind) {throw $this->createNotFoundException('The blog kind does not exist');}}$pagination = $paginator->paginate($blogRepository->findQuery($parameters), /* query NOT result */$request->query->getInt('page', 1), /*page number*/20 /*limit per page*/);$manufacturers = [];$models = [];if ($blogKind && $blogKind->getUrl() === 'testy-aut') {$manufacturers = $manufacturerRepository->findByBlogKind($blogKind);}return $this->render('homepage/blog.html.twig', ['blogs' => $pagination,'blogKind' => $blogKind,'manufacturers' => $manufacturers,'models' => $models,'activeManufacturer' => null,'activeModel' => null,'notFoundMessage' => null,]);}#[Route(path: ['/autobazar/{url}/vozidla','/autobazar/{url}/vozidla/{urlManufacturer}','/autobazar/{url}/vozidla/{urlManufacturer}/{urlModel}'], name: 'page_dealer_vehicle', defaults: ['urlManufacturer' => null, 'urlModel' => null], methods: ['GET'])]public function dealerVehicles(string $url,string|null $urlManufacturer,string|null $urlModel,Request $request,PaginatorInterface $paginator,VehicleRepository $vehicleRepository,VehicleManufacturerRepository $manufacturerRepository,VehicleModelRepository $vehicleModelRepository,DealerRepository $dealerRepository): Response{$dealer = $dealerRepository->findOneBy(['url' => $url]);if (!$dealer) {throw $this->createNotFoundException('The dealer does not exist');}$parameters = ['visible' => '1','dealer' => (string)$dealer->getId(),];$manufacturer = null;if ($urlManufacturer) {$manufacturer = $manufacturerRepository->findOneBy(['url' => $urlManufacturer]);if (!$manufacturer) {throw $this->createNotFoundException('The manufacturer does not exist');}$manufacturerId = $parameters['manufacturer'] = $manufacturer->getId();}$model = null;if ($urlModel) {$model = $vehicleModelRepository->findOneBy(['url' => $urlModel]);if (!$model) {throw $this->createNotFoundException('The model does not exist');}$parameters['model'] = $model->getId();}$pagination = $paginator->paginate($vehicleRepository->findQuery($parameters), /* query NOT result */$request->query->getInt('page', 1), /*page number*/10 /*limit per page*/);$dealerType = $dealer->isAuthSeller() ? 'autosalon' : 'autobazar';$vehicleCount = $pagination->getTotalItemCount();if ($manufacturer && $model) {$seoTitle = sprintf('%s %s - nabídka vozidel %s %s | Autanet.cz',$dealer->getName(), $dealer->getCity(), $manufacturer->getName(), $model->getName());$seoDescription = sprintf('Nabídka %d vozidel %s %s z %su %s %s. Vybírejte z nabídky vozidel značky %s %s a dalších modelů.',$vehicleCount, $manufacturer->getName(), $model->getName(), $dealerType, $dealer->getName(), $dealer->getCity(),$manufacturer->getName(), $model->getName());} elseif ($manufacturer) {$seoTitle = sprintf('%s %s - nabídka vozidel %s | Autanet.cz',$dealer->getName(), $dealer->getCity(), $manufacturer->getName());$seoDescription = sprintf('Nabídka %d vozidel %s z %su %s %s. Vybírejte z nabídky vozidel značky %s a dalších.',$vehicleCount, $manufacturer->getName(), $dealerType, $dealer->getName(), $dealer->getCity(), $manufacturer->getName());} else {$seoTitle = sprintf('%s %s - nabídka vozidel | Autanet.cz', $dealer->getName(), $dealer->getCity());$topManufacturers = $manufacturerRepository->findByDealerActive($dealer);$manufacturerNames = array_slice(array_map(fn($m) => $m->getName(), $topManufacturers), 0, 5);$manufacturerList = implode(', ', $manufacturerNames);$seoDescription = sprintf('Nabídka %d vozidel z %su %s %s. Vybírejte z vozidel značek %s a dalších.',$vehicleCount, $dealerType, $dealer->getName(), $dealer->getCity(), $manufacturerList);}if ($manufacturer && $model) {$seoH1 = sprintf('Nabídka vozidel %s %s %s', $manufacturer->getName(), $model->getName(), $dealer->getName());} elseif ($manufacturer) {$seoH1 = sprintf('Nabídka vozidel %s %s', $manufacturer->getName(), $dealer->getName());} else {$seoH1 = sprintf('Nabídka vozidel %s', $dealer->getName());}return $this->render('homepage/vehicleDealer.html.twig', ['dealer' => $dealer,'activeManufacturer' => $manufacturer,'activeModel' => $model,'manufacturer' => $manufacturerRepository->findByDealerActive($dealer),'model' => $vehicleModelRepository->findByDealerActive($dealer, $manufacturer?->getId()),'vehicles' => $pagination,'seoTitle' => $seoTitle,'seoDescription' => $seoDescription,'seoH1' => $seoH1,]);}#[Route(path: ['/nova/{urlKind}','/nova/{urlKind}/{urlManufacturer}','/nova/{urlKind}/{urlManufacturer}/{urlModel}',], name: 'app_search_redirect', defaults: ['urlManufacturer' => null, 'urlModel' => null], methods: ['GET'])]public function redirectSearch(string $urlKind, string|null $urlManufacturer, string|null $urlModel): Response{if ($urlManufacturer and $urlModel) {return $this->redirectToRoute('page_vehicle_search', compact('urlKind', 'urlManufacturer', 'urlModel'), Response::HTTP_MOVED_PERMANENTLY);} elseif ($urlManufacturer) {return $this->redirectToRoute('page_vehicle_search', compact('urlKind', 'urlManufacturer'), Response::HTTP_MOVED_PERMANENTLY);} else {return $this->redirectToRoute('page_vehicle_search', compact('urlKind'), Response::HTTP_MOVED_PERMANENTLY);}}#[Route(path: ['/{urlKind}','/{urlKind}/{urlManufacturer}','/{urlKind}/{urlManufacturer}/{urlModel}',], name: 'page_vehicle_search', defaults: ['urlManufacturer' => null, 'urlModel' => null], methods: ['GET'])]public function vehicleSearch(string $urlKind, string|null $urlManufacturer, string|null $urlModel, Request $request, PaginatorInterface $paginator,VehicleRepository $vehicleRepository,VehicleKindRepository $vehicleKindRepository,VehicleCategoryRepository $vehicleCategoryRepository,VehicleManufacturerRepository $manufacturerRepository,VehicleModelRepository $vehicleModelRepository,VehicleBodyRepository $vehicleBodyRepository,VehicleFuelRepository $vehicleFuelRepository,RegionRepository $regionRepository,DistrictRepository $districtRepository,VehiclePartKindRepository $vehiclePartKindRepository): Response{$parameters = ['visible' => '1',];$vehicleKind = null;$models = [];$vehicleCategory = null;$manufacturer = null;$mileageValues = ['0-10000' => 'do 10000 km','10000-30000' => '10 000 - 30 000 km','30000-50000' => '30 000 - 50 000 km','50000-100000' => '50 000 - 100 000 km','100000-150000' => '100 000 - 150 000 km','150000-200000' => '150 000 - 200 000 km','200000-300000' => '200 000 - 300 000 km','300000-10000000' => '300 000 a více km',];$powerValues = ['0-40' => 'do 40 kW','40-60' => '40 - 60 kW','60-80' => '60 - 80 kW','80-100' => '80 - 100 kW','100-125' => '100 - 125 kW','125-150' => '120 - 150 kW','150-200' => '150 - 200 kW','200-300' => '200 - 300 kW','300-2000' => 'nad 300 kW',];$vehiclePartKindValues = [];if ($urlKind) {if ($urlKind == 'obytna-vozidla') {$powerValues = ['0-60' => 'do 60 kW','60-80' => '60 - 80 kW','80-100' => '80 - 100 kW','100-125' => '100 - 125 kW','125-150' => '125 - 150 kW','150-200' => '150 - 200 kW','200-300' => '200 - 300 kW','300-2000' => 'nad 300 kW',];}if ($urlKind == 'nakladni-vozidla') {$powerValues = ['0-100' => 'do 100 kW','100-150' => '100 - 150 kW','150-200' => '150 - 200 kW','200-300' => '200 - 300 kW','300-400' => '300 - 400 kW','400-2000' => 'nad 400 kW',];}if ($urlKind == 'motorky-skutry') {$mileageValues = ['0-10000' => 'do 10000 km','10000-30000' => '10 000 - 30 000 km','30000-50000' => '30 000 - 50 000 km','50000-100000' => '50 000 - 100 000 km','100000-150000' => '100 000 - 150 000 km','150000-1000000' => '150 000 a více km',];$powerValues = ['0-25' => 'do 25 kW','25-50' => '25 - 50 kW','50-75' => '50 - 75 kW','75-100' => '75 - 100 kW','100-125' => '100 - 125 kW','125-150' => '125 - 150 kW','150-2000' => 'nad 150 kW',];}if ($urlKind == 'nahradni-dily' || $urlKind == 'prislusenstvi') {$vehicleCategory = $vehicleCategoryRepository->findOneBy(['url' => $urlKind]);if ($vehicleCategory) {$parameters['category'] = $vehicleCategory->getId();} else {return $this->forward('App\Controller\HomepageController::blogDetail', ['url' => $urlKind,]);}$vehiclePartKindValues = $vehiclePartKindRepository->findActiveCategory($vehicleCategory);} else {$vehicleKind = $vehicleKindRepository->findOneBy(['url' => $urlKind]);if ($vehicleKind) {$parameters['kind'] = $vehicleKind->getId();} else {return $this->forward('App\Controller\HomepageController::blogDetail', ['url' => $urlKind,]);}}}if ($urlManufacturer) {$manufacturer = $manufacturerRepository->findOneBy(['url' => $urlManufacturer]);if ($manufacturer) {$parameters['manufacturer'] = $manufacturer->getId();$models = $vehicleModelRepository->findActive($manufacturer, $vehicleCategory, $vehicleKind);} else {return $this->forward('App\Controller\HomepageController::page', ['url' => $urlKind,]);}}$activeModel = null;if ($urlModel) {$activeModel = $vehicleModelRepository->findOneBy(['url' => $urlModel]);if ($activeModel) {$parameters['model'] = $activeModel->getId();} else {return $this->forward('App\Controller\HomepageController::page', ['url' => $urlKind,]);}}$urlPlace = $request->get('place');if ($urlPlace) {if ('praha' === $urlPlace) {$urlPlace = 'hlavni-mesto-praha';}if ('ostrava' === $urlPlace) {$urlPlace = 'ostrava-mesto';}if ('brno' === $urlPlace) {$urlPlace = ['brno-mesto', 'brno-venkov'];}if ('plzen' === $urlPlace) {$urlPlace = ['plzen-mesto', 'plzen-jih', 'plzen-sever'];}if (!is_array($urlPlace) && $regionRepository->findOneBy(['url' => $urlPlace])) {$parameters['region'] = $urlPlace;} else {$parameters['district'] = $urlPlace;}}if ($request->query->all()) {$parameters += $request->query->all();}$pagination = $paginator->paginate($vehicleRepository->findQuery($parameters), /* query NOT result */$request->query->getInt('page', 1), /*page number*/20 /*limit per page*/);return $this->render('homepage/search.html.twig', ['vehicles' => $pagination,'activeKind' => $vehicleKind,'baseUrl' => $vehicleCategory ? $vehicleCategory->getUrl() : $vehicleKind->getUrl(),'activeCategory' => $vehicleCategory,'activeManufacturer' => isset($parameters['manufacturer']) ? $manufacturerRepository->find($parameters['manufacturer']) : null,'activeModel' => $activeModel,'categories' => $vehicleCategoryRepository->findActive(),'manufacturers' => $manufacturerRepository->findActive($vehicleKind, $vehicleCategory),'models' => $models,'bodies' => $vehicleBodyRepository->findActive($vehicleKind, $manufacturer, $activeModel),'fuels' => $vehicleFuelRepository->findActive(),'gearbox' => $vehicleRepository->findActiveGearBox(),'selectPlaceValues' => $this->getSelectPlaceValues($regionRepository, $districtRepository),'vehicleKind' => $vehicleKind,'mileageValues' => $mileageValues,'powerValues' => $powerValues,'vehiclePartKindValues' => $vehiclePartKindValues]);}#[Route('/detail/{seoSlug}-{id}', name: 'page_vehicle_detail_seo', methods: ['GET'], requirements: ['seoSlug' => '.+', 'id' => '[0-9]+'], priority: 10)]public function vehicleDetailSeo(string $seoSlug, int $id, VehicleRepository $vehicleRepository,VehicleSeoService $vehicleSeoService, DealerOpenHourRepository $dealerOpenHourRepository): Response{$vehicle = $vehicleRepository->find($id);if (!$vehicle) {throw $this->createNotFoundException('Vehicle not found');}if (!$vehicle->getSeoSlug()) {$vehicleSeoService->generateSeoData($vehicle);}if ($vehicle->getSeoSlug() && $seoSlug !== $vehicle->getSeoSlug()) {return $this->redirectToRoute('page_vehicle_detail_seo', ['seoSlug' => $vehicle->getSeoSlug(),'id' => $id], 301);}if (!$vehicle->isVisible()) {$response = $this->render('homepage/detailVehicleDisable.html.twig', compact('vehicle'));$response->setStatusCode(404);return $response;}$date = new DateTime('now', new DateTimeZone('Europe/Prague'));$openTime = $dealerOpenHourRepository->findBy(['dealer' => $vehicle->getDealer(), 'summer' => $date->format('I')]);$vehicleOthers = $vehicleRepository->findOtherDealerBody($vehicle, 4);return $this->render('homepage/detailVehicle.html.twig', compact('vehicle', 'openTime', 'vehicleOthers'));}#[Route(['/detail/{urlManufacturer}/{urlModel}/{id}',], name: 'page_vehicle_detail', defaults: ['urlModel' => null], methods: ['GET'])]public function vehicleDetail(string $urlManufacturer, string $urlModel, int $id, VehicleRepository $vehicleRepository,VehicleManufacturerRepository $vehicleManufacturerRepository,VehicleModelRepository $vehicleModelRepository, DealerOpenHourRepository $dealerOpenHourRepository,VehicleSeoService $vehicleSeoService): Response{if ($urlModel) {$vehicleModel = $vehicleModelRepository->findOneBy(['url' => $urlModel]);}$manufacturer = $vehicleManufacturerRepository->findOneBy(['url' => $urlManufacturer]);if ($urlModel) {$vehicle = $vehicleRepository->findOneBy(['id' => $id, 'visible' => true, 'manufacturer' => $manufacturer, 'model' => $vehicleModel]);} else {$vehicle = $vehicleRepository->findOneBy(['id' => $id, 'visible' => true, 'manufacturer' => $manufacturer]);}if ($urlModel) {$disableVehicle = $vehicleRepository->findOneBy(['id' => $id, 'visible' => false, 'manufacturer' => $manufacturer, 'model' => $vehicleModel]);} else {$disableVehicle = $vehicleRepository->findOneBy(['id' => $id, 'visible' => false, 'manufacturer' => $manufacturer]);}if ($disableVehicle) {$response = $this->render('homepage/detailVehicleDisable.html.twig', ['vehicle' => $disableVehicle,]);$response->setStatusCode(404);return $response;}if (!$vehicle) {throw $this->createNotFoundException('The vehicle does not exist');}if (!$vehicle->getSeoSlug()) {$vehicleSeoService->generateSeoData($vehicle);}if ($vehicleSeoService->shouldRedirectToSeo($vehicle) && $vehicle->getSeoSlug()) {return $this->redirectToRoute('page_vehicle_detail_seo', ['seoSlug' => $vehicle->getSeoSlug(),'id' => $id], 301);}$date = new DateTime('now', new DateTimeZone('Europe/Prague'));$openTime = $dealerOpenHourRepository->findBy(['dealer' => $vehicle->getDealer(), 'summer' => $date->format('I')]);$vehicleOthers = $vehicleRepository->findOtherDealerBody($vehicle, 4);return $this->render('homepage/detailVehicle.html.twig', ['vehicle' => $vehicle,'openTime' => $openTime,'vehicleOthers' => $vehicleOthers,]);}#[Route('/{url}', name: 'page', methods: ['GET'], priority: -2)]public function page(string $url, PageRepository $pageRepository): Response{$page = $pageRepository->findPage($url);if (!$page) {throw $this->createNotFoundException('Page no exist');}return $this->render('homepage/page.html.twig', ['page' => $page,]);}#[Route('/{url}', name: 'page_blog_detail', methods: ['GET'], priority: -1)]public function blogDetail(string $url, BlogRepository $blogRepository, VehicleRepository $vehicleRepository): Response{$blog = $blogRepository->findOneVisibleUrl($url);if (!$blog) {return $this->forward('App\Controller\HomepageController::page', ['url' => $url,]);}$vehicles = $vehicleRepository->findRandActive($blog->getVehicleManufacturer(), $blog->getVehicleModel(), 3);if (!$vehicles) {$vehicles = $vehicleRepository->findRandActive($blog->getVehicleManufacturer(), null, 3);$isVehicleModel = false;} else {$isVehicleModel = true;}$blogOtherManufacturer = $blogRepository->findRandActive($blog->getVehicleManufacturer(), $blog->getVehicleModel(), $blog->getId(), 3);return $this->render('homepage/blogDetail.html.twig', ['blog' => $blog,'vehicles' => $vehicles,'isVehicleModel' => $isVehicleModel,'blogOtherManufacturer' => $blogOtherManufacturer,'blogNew' => $blogRepository->findNewActive(3)]);}#[Route('/', name: 'app_homepage', methods: ['GET'])]public function index(BlogRepository $blogRepository,VehicleTipRepository $vehicleTipRepository,VehicleManufacturerRepository $manufacturerRepository,PartnerRepository $partnerRepository): Response{$manufacturers = [];foreach ($manufacturerRepository->findActive() as $manufacturer) {$manufacturers[] = ['id' => $manufacturer->getId(),'name' => $manufacturer->getName(),'url' => $manufacturer->getUrl(),];}return $this->render('homepage/index.html.twig', ['partners' => $this->getPartners($partnerRepository),'blogs' => $blogRepository->findHomepage(),'vehicleTip' => $vehicleTipRepository->findRandVisible(),'manufacturers' => $manufacturers,]);}/*** @return array<int, array<string, string>>*/private function getPartners(PartnerRepository $partnerRepository): array{$partners = $partnerRepository->findAll();$partnersData = [];foreach ($partners as $partner) {$partnersData[] = [$partner->getUrl(),'img/partner/' . $partner->getLogo()];}shuffle($partnersData);return $partnersData;}/*** Rozdělí URL typu "bmw-rada-3" na výrobce "bmw" a model "rada-3"* Použije přístup: najít všechny možné kandidáty na výrobce a vybrat nejdelší shodu*/private function parseManufacturerAndModel(string $manufacturerAndModel, VehicleManufacturerRepository $manufacturerRepository, BlogKindRepository $blogKindRepository): array{$testyAutKind = $blogKindRepository->findOneBy(['url' => 'testy-aut']);if (!$testyAutKind) {return [null, null];}$manufacturers = $manufacturerRepository->findByBlogKind($testyAutKind);$manufacturerUrls = array_map(fn($m) => $m->getUrl(), $manufacturers);$candidates = [];$urlParts = explode('-', $manufacturerAndModel);$countParts = count($urlParts);for ($i = 1; $i <= $countParts; $i++) {$candidateManufacturer = implode('-', array_slice($urlParts, 0, $i));if (in_array($candidateManufacturer, $manufacturerUrls)) {$candidates[] = $candidateManufacturer;}}if (empty($candidates)) {return [null, null];}usort($candidates, fn($a, $b) => strlen($b) <=> strlen($a));$manufacturerUrl = $candidates[0];if ($manufacturerUrl === $manufacturerAndModel) {return [$manufacturerUrl, null];}$modelUrl = substr($manufacturerAndModel, strlen($manufacturerUrl) + 1);return [$manufacturerUrl, $modelUrl];}}