From f25295ae5c175f10982ec55eeffc3626bc78dc05 Mon Sep 17 00:00:00 2001
From: marvin
Date: Wed, 20 Nov 2024 15:48:32 +0100
Subject: [PATCH 1/2] =?UTF-8?q?forme=20cr=C3=A9ation=20sortie?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
assets/js/lieu.js | 16 +++++--
src/Controller/SortieController.php | 65 +++++++++++++++++++++++++----
src/Entity/Sortie.php | 4 +-
src/Form/SortieType.php | 4 +-
templates/main/index.html.twig | 2 +-
5 files changed, 74 insertions(+), 17 deletions(-)
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 5d63f2f..7e41c3c 100644
--- a/templates/main/index.html.twig
+++ b/templates/main/index.html.twig
@@ -22,7 +22,7 @@
Inscriptions max : {{ sortie.nbInscriptionsMax }}
Infos : {{ sortie.infosSortie }}
- Voir plus
+ Voir plus
From f197db0455b9009fd2c6387c455259be66efb4b0 Mon Sep 17 00:00:00 2001
From: marvin
Date: Wed, 20 Nov 2024 16:03:55 +0100
Subject: [PATCH 2/2] home
---
templates/main/index.html.twig | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
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 %}
+ Liste des sorties
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
{% endblock %}
@@ -9,24 +10,24 @@
{% endblock %}
{% block content %}
-
-
+
+
Liste des sorties
+
+
{% for sortie in sorties %}
-
-
-
-
{{ sortie.nom }}
-
- Date de début : {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}
- Durée : {{ sortie.duree }} minutes
- Inscriptions max : {{ sortie.nbInscriptionsMax }}
- Infos : {{ sortie.infosSortie }}
-
-
Voir plus
-
+
+
{{ sortie.nom }}
+
+ Date de début : {{ sortie.dateHeureDebut|date('d/m/Y H:i') }}
+ Durée : {{ sortie.duree }} minutes
+ Inscriptions max : {{ sortie.nbInscriptionsMax }}
+ Infos : {{ sortie.infosSortie }}
+
+
{% endfor %}
-{% endblock %}
\ No newline at end of file
+{% endblock %}