<?php
namespace App\Service;
use Presta\SitemapBundle\Event\SitemapPopulateEvent;
use Presta\SitemapBundle\Service\UrlContainerInterface;
use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
use Pimcore\Model\DataObject\Vehicle;
use Pimcore\Model\DataObject\Vehicle\Listing;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Routing\RouterInterface;
class VehicleSitemapProvider implements EventSubscriberInterface
{
private LoggerInterface $logger;
private RequestStack $requestStack;
private RouterInterface $router;
public function __construct(
LoggerInterface $logger,
RequestStack $requestStack,
RouterInterface $router
) {
$this->logger = $logger;
$this->requestStack = $requestStack;
$this->router = $router;
}
public static function getSubscribedEvents(): array
{
return [
SitemapPopulateEvent::class => 'populate',
];
}
public function populate(SitemapPopulateEvent $event): void
{
$this->logger->info('VehicleSitemapProvider: Starting population');
/** @var UrlContainerInterface $urlContainer */
$urlContainer = $event->getUrlContainer();
try {
$context = $this->router->getContext();
$request = $this->requestStack->getCurrentRequest();
$host = $request ? $request->getHost() : 'timmermanns.de';
$context->setScheme('https');
$baseUrl = sprintf('%s://%s', $context->getScheme(), $host);
$carListing = Vehicle::getList([
"condition" => "object_vehicle.o_published = 1"
]);
$urlContainer->addUrl(
new UrlConcrete(
$baseUrl . '/fahrzeugboerse/fahrzeuge',
new \DateTime(),
UrlConcrete::CHANGEFREQ_DAILY,
0.8
),
'vehicles'
);
// Optionally add conditions for published vehicles if needed
// $listing->setCondition('published = 1');
$this->logger->info('VehicleSitemapProvider: Found ' . $carListing->count() . ' vehicles');
foreach ($carListing as $vehicle) {
if (!$vehicle instanceof Vehicle) {
continue;
}
$urlContainer->addUrl(
new UrlConcrete(
$baseUrl . '/fahrzeugboerse/fahrzeuge?i=' . $vehicle->getInternalVehicleId(),
new \DateTime(),
UrlConcrete::CHANGEFREQ_DAILY,
0.6
),
'vehicles'
);
$this->logger->debug('VehicleSitemapProvider: Added URL for vehicle ID ' . $vehicle->getInternalVehicleId());
}
} catch (\Exception $e) {
$this->logger->error('VehicleSitemapProvider Error: ' . $e->getMessage());
throw $e;
}
}
}