<?php
namespace App\Controller;
use App\Entity\Continent;
use App\Entity\Destination;
use App\Entity\Offer;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class SitemapController extends AbstractController
{
/**
* @Route("/sitemap.xml", name="sitemap", defaults={"_format"="xml"})
*/
public function index(Request $request): Response
{
$em = $this->getDoctrine()->getManager();
$baseUrl = $request->getSchemeAndHttpHost();
$urls = [];
// ── Pages statiques ──
$staticPages = [
['route' => '/', 'priority' => '1.0', 'changefreq' => 'weekly'],
['route' => '/o-circuit', 'priority' => '0.9', 'changefreq' => 'weekly'],
['route' => '/o-escapade', 'priority' => '0.9', 'changefreq' => 'weekly'],
['route' => '/o-roadtrip', 'priority' => '0.9', 'changefreq' => 'weekly'],
['route' => '/o-croisiere', 'priority' => '0.9', 'changefreq' => 'weekly'],
['route' => '/o-tropik-agence-de-voyages-en-guadeloupe','priority' => '0.7', 'changefreq' => 'monthly'],
['route' => '/o-contact', 'priority' => '0.6', 'changefreq' => 'monthly'],
['route' => '/demande-de-devis', 'priority' => '0.8', 'changefreq' => 'monthly'],
['route' => '/mentions-legales', 'priority' => '0.3', 'changefreq' => 'yearly'],
['route' => '/conditions-generales-utilisation', 'priority' => '0.3', 'changefreq' => 'yearly'],
['route' => '/politique-de-confidentialite', 'priority' => '0.3', 'changefreq' => 'yearly'],
];
foreach ($staticPages as $page) {
$urls[] = [
'loc' => $baseUrl . $page['route'],
'changefreq' => $page['changefreq'],
'priority' => $page['priority'],
];
}
// ── Continents ──
$continents = $em->getRepository(Continent::class)->findAll();
foreach ($continents as $continent) {
if (!$continent->getSlug()) {
continue;
}
$urls[] = [
'loc' => $baseUrl . '/continent/' . $continent->getSlug(),
'changefreq' => 'weekly',
'priority' => '0.7',
];
}
// ── Offres publiees ──
$offers = $em->getRepository(Offer::class)->findBy(['isPublish' => true]);
foreach ($offers as $offer) {
if (!$offer->getSlug() || !$offer->getType()) {
continue;
}
$typeName = strtolower($offer->getType()->getName());
$prefix = '/o-circuit';
if (strpos($typeName, 'escapade') !== false) {
$prefix = '/o-escapade/destination';
} elseif (strpos($typeName, 'road') !== false) {
$prefix = '/o-roadtrip';
} elseif (strpos($typeName, 'croisi') !== false) {
$prefix = '/o-croisiere';
}
$urls[] = [
'loc' => $baseUrl . $prefix . '/' . $offer->getSlug(),
'changefreq' => 'weekly',
'priority' => '0.8',
];
}
// ── Generation XML ──
$response = new Response();
$response->headers->set('Content-Type', 'text/xml');
return $this->render('sitemap.xml.twig', [
'urls' => $urls,
], $response);
}
}