<?php
namespace AutomarketBundle\Controller;
use AutomarketBundle\Services\SeoService;
use CoreBundle\Component\CoreFormFactory;
use CoreBundle\Entity\Post;
use CoreBundle\Entity\Vehicles\Vehicle;
use CoreBundle\Model\Vehicles\Repository;
use CoreBundle\Model\Vehicles\VehicleType;
use Doctrine\ORM\EntityManagerInterface;
use PortalBundle\Model\SeoMetaTag;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Yaml\Yaml;
class SiteMapController extends BaseController
{
private SeoService $seoService;
public function __construct(CoreFormFactory $coreFormFactory, RequestStack $requestStack, EntityManagerInterface $em,
SeoMetaTag $seoMetaTag, SeoService $seoService)
{
parent::__construct($coreFormFactory, $requestStack, $em, $seoMetaTag);
$this->seoService = $seoService;
}
public function siteMap(RouterInterface $router, Repository $vehicleRepository, \CoreBundle\Factory\Vehicle $vehicleFactory): Response
{
$root = $this->getParameter('kernel.project_dir');
$routingFile = $root . '/src/AutomarketBundle/Resources/config/routing/sitemap.yml';
$routes = Yaml::parseFile($routingFile);
$result = [];
foreach ($routes as $rName => $route) {
if (
in_array(
$rName,
[
'automarket_car',
'automarket_seo_catalog',
'automarket_vacancy_single',
'automarket_news_single',
'automarket_about_vacancy_id',
'automarket_catalog_vehicle_collections',
'automarket_catalog',
'automarket_catalog_characteristic',
'automarket_catalog_price',
'automarket_catalog_brand',
'automarket_catalog_brand_model',
'automarket_catalog_brand_model_price',
'automarket_catalog_brand_characteristic',
'automarket_catalog_brand_model_characteristic',
'automarket_catalog_brand_model_characteristic_price',
'automarket_vehicle',
'automarket_catalog_characteristic_by_body',
]
)
) {
continue;
}
$result[] = [
'url' => $router->generate($rName),
'priority' => '0.1',
'changefreq' => 'yearly',
];
}
$this->seoService->initModelRangePage();
foreach ($this->seoService->getVehicleDataUrl() as $item) {
if (array_key_exists('model', $item['parameters']) && $item['parameters']['model'] == '') {
continue;
}
$result[] = [
'url' => $router->generate($item['name'], $item['parameters']),
'priority' => '0.8',
'changefreq' => 'daily',
];
}
$vehicles = $vehicleRepository->getUsedVehicles();
/** @var Vehicle $vehicle */
foreach ($vehicles as $vehicle) {
if (!$vehicle->getModel()->getUrl()) {
continue;
}
if (!$vehicle->getState()) {
continue;
}
$vehicle = $vehicleFactory->createByEntity($vehicle);
if (!$vehicle) {
continue;
}
$vehicleTypeData = VehicleType::getTypeDataById($vehicle->getVehicleType());
$result[] = [
'url' => $router->generate('automarket_vehicle', ['state' => 'used', 'type' => $vehicleTypeData['url'], 'brand' => $vehicle->getModel()->getBrand()->getUrl(), 'model' => $vehicle->getModel()->getUrl(), 'id' => $vehicle->getVehicleId()]),
'priority' => '0.8',
'changefreq' => 'daily',
];
}
$post = $this->em->getRepository(Post::class)
->findBy(['dealer' => $this->getDealer(), 'state' => 1]);
/** @var Post $one */
foreach ($post as $one) {
$result[] = [
'url' => $router->generate('automarket_news_single', ['url' => $one->getUrl()]),
'priority' => '0.2',
'changefreq' => 'monthly',
];
}
$response = $this->baseAutomarketRender('@DcSite/sitemap.xml.twig', ['urls' => $result, 'route' => 'ford_sitemap']);
$response->headers->set('Content-Type', 'application/xml');
$response->setCharset('utf-8');
return $response;
}
}