diff --git a/assets/js/lieu.js b/assets/js/lieu.js index 27721b9..8c87c81 100644 --- a/assets/js/lieu.js +++ b/assets/js/lieu.js @@ -8,9 +8,11 @@ document.addEventListener('DOMContentLoaded', function () { const longitudeLabel = document.getElementById('longitude-value'); if (villeSelect && lieuSelect) { + // Listener pour la ville villeSelect.addEventListener('change', function () { const villeId = villeSelect.value; + // Réinitialisation des options de lieu lieuSelect.innerHTML = ''; lieuSelect.disabled = true; @@ -23,12 +25,13 @@ document.addEventListener('DOMContentLoaded', function () { return response.json(); }) .then(data => { + // Mise à jour des options dans le menu déroulant lieuSelect.innerHTML = ''; data.forEach(lieu => { const option = document.createElement('option'); - option.value = lieu.id; - option.textContent = lieu.nom; - option.dataset.details = JSON.stringify(lieu); + option.value = lieu.id; // ID pour soumettre au backend + option.textContent = lieu.nom; // Nom affiché + option.dataset.details = JSON.stringify(lieu); // Stocker les détails pour affichage lieuSelect.appendChild(option); }); @@ -40,20 +43,27 @@ document.addEventListener('DOMContentLoaded', function () { } }); + // Listener pour le lieu lieuSelect.addEventListener('change', function () { const selectedOption = lieuSelect.options[lieuSelect.selectedIndex]; if (selectedOption && selectedOption.dataset.details) { const lieuDetails = JSON.parse(selectedOption.dataset.details); + // Mise à jour des labels avec les détails du lieu sélectionné rueLabel.textContent = lieuDetails.rue || 'Non renseignée'; codePostalLabel.textContent = lieuDetails.codePostal || 'Non renseigné'; latitudeLabel.textContent = lieuDetails.latitude || 'Non renseignée'; longitudeLabel.textContent = lieuDetails.longitude || 'Non renseignée'; + + console.log('Lieu sélectionné:', lieuDetails); } else { + // Réinitialisation des labels si aucun lieu n'est sélectionné rueLabel.textContent = 'Renseigner avec le lieu'; codePostalLabel.textContent = 'Renseigner avec le lieu'; latitudeLabel.textContent = 'Renseigner avec le lieu'; longitudeLabel.textContent = 'Renseigner avec le lieu'; + + console.log('Aucun lieu sélectionné.'); } }); } else { diff --git a/src/Controller/SortieController.php b/src/Controller/SortieController.php index 6b97eb5..2c4afb1 100644 --- a/src/Controller/SortieController.php +++ b/src/Controller/SortieController.php @@ -4,8 +4,9 @@ namespace App\Controller; use App\Entity\Sortie; use App\Form\SortieType; +use App\Repository\EtatRepository; use App\Repository\LieuRepository; -use App\Repository\VilleRepository; +use App\Repository\ParticipantRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -17,29 +18,75 @@ use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInt class SortieController extends AbstractController { #[Route('/creates', name: 'create', methods: ['GET', 'POST'])] - public function create(Request $request, EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage): Response - { + public function create( + Request $request, + EntityManagerInterface $entityManager, + TokenStorageInterface $tokenStorage, + LieuRepository $lieuRepository, + ParticipantRepository $participantRepository, + EtatRepository $etatRepository // Ajout du repository pour les états + ): Response { $sortie = new Sortie(); - // Créez le formulaire sans options spéciales + // Récupérer l'utilisateur connecté + $token = $tokenStorage->getToken(); + $userConnect = $token?->getUser(); + + if (!$userConnect) { + $this->addFlash('error', 'Vous devez être connecté pour créer une sortie.'); + return $this->redirectToRoute('app_login'); + } + + // Créer le formulaire $form = $this->createForm(SortieType::class, $sortie); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - // Sauvegarde dans la base de données + // Récupérer l'ID du lieu depuis le formulaire + $lieuId = $form->get('lieu')->getData(); + $lieu = $lieuRepository->find($lieuId); + + if (!$lieu) { + $this->addFlash('error', 'Le lieu sélectionné est invalide.'); + return $this->redirectToRoute('sortie_create'); + } + + // Associer le lieu à la sortie + $sortie->setLieu($lieu); + + // Associer le site à partir de l'utilisateur connecté + $participant = $participantRepository->find($userConnect->getIdParticipant()); + + if (!$participant) { + $this->addFlash('error', 'Impossible de déterminer le site de l\'utilisateur.'); + return $this->redirectToRoute('sortie_create'); + } + + $sortie->setSite($participant->getSite()); + $sortie->setParticipant($participant); + + // Récupérer l'état "en création" avec l'ID donné + $etat = $etatRepository->find('019349ba-38ca-7a39-93c3-62f046671525'); + if (!$etat) { + $this->addFlash('error', 'État non trouvé.'); + return $this->redirectToRoute('sortie_create'); + } + + // Associer l'état à la sortie + $sortie->setEtat($etat); + + // Sauvegarder la sortie $entityManager->persist($sortie); $entityManager->flush(); $this->addFlash('success', 'La sortie a été créée avec succès.'); - return $this->redirectToRoute('sortie_create'); + return $this->redirectToRoute('home'); } - $token = $tokenStorage->getToken(); - $userConnect = $token?->getUser(); + return $this->render('sortie/create.html.twig', [ 'profile' => $userConnect, 'form' => $form->createView(), ]); } - } diff --git a/src/Entity/Sortie.php b/src/Entity/Sortie.php index 3479552..0b7e2d7 100644 --- a/src/Entity/Sortie.php +++ b/src/Entity/Sortie.php @@ -18,13 +18,13 @@ class Sortie #[ORM\Column(length: 255)] private ?string $nom = null; - #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] private ?\DateTimeInterface $dateHeureDebut = null; #[ORM\Column(nullable: true)] private ?int $duree = null; - #[ORM\Column(type: Types::DATE_MUTABLE, nullable: true)] + #[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)] private ?\DateTimeInterface $dateLimiteInscription = null; #[ORM\Column(nullable: true)] diff --git a/src/Form/SortieType.php b/src/Form/SortieType.php index efc3f92..8746166 100644 --- a/src/Form/SortieType.php +++ b/src/Form/SortieType.php @@ -64,8 +64,8 @@ class SortieType extends AbstractType 'class' => Lieu::class, 'choice_label' => 'nom', 'label' => 'Lieu', - 'placeholder' => 'Sélectionnez une ville d\'abord', - 'choices' => [], + 'placeholder' => 'Sélectionnez un lieu', + 'required' => true, 'attr' => ['id' => 'lieu-select'], ]); } diff --git a/templates/main/index.html.twig b/templates/main/index.html.twig index 7e41c3c..33729f3 100644 --- a/templates/main/index.html.twig +++ b/templates/main/index.html.twig @@ -2,6 +2,7 @@ {% block head %}
+
- Date de début : {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}
- Durée : {{ sortie.duree }} minutes
- Inscriptions max : {{ sortie.nbInscriptionsMax }}
- Infos : {{ sortie.infosSortie }}
-
+ Date de début : {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}
+ Durée : {{ sortie.duree }} minutes
+ Inscriptions max : {{ sortie.nbInscriptionsMax }}
+ Infos : {{ sortie.infosSortie }}
+