Merge branch 'Marvin'

This commit is contained in:
Olivier PARPAILLON
2024-11-19 14:06:02 +01:00
9 changed files with 344 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class LieuController extends AbstractController
{
#[Route('/lieu', name: 'app_lieu')]
public function index(): Response
{
return $this->render('lieu/index.html.twig', [
'controller_name' => 'LieuController',
]);
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Controller;
use App\Entity\Sortie;
use App\Form\SortieType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/sortie', name: 'sortie_')]
class SortieController extends AbstractController
{
#[Route('/creates', name: 'create', methods: ['GET', 'POST'])]
public function create(Request $request, EntityManagerInterface $entityManager): Response
{
$sortie = new Sortie();
// Créer le formulaire
$form = $this->createForm(SortieType::class, $sortie);
// Traiter la requête
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Sauvegarder dans la base de données
$entityManager->persist($sortie);
$entityManager->flush();
// Rediriger après soumission
$this->addFlash('success', 'Sortie créée avec succès !');
return $this->redirectToRoute('sortie_create');
}
// Afficher le formulaire
return $this->render('sortie/create.html.twig', [
'form' => $form->createView(),
]);
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Controller;
use App\Entity\Ville;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class VilleController extends AbstractController
{
#[Route('/get-lieux/{id}', name: 'get_lieux')]
public function getLieux(Ville $ville): JsonResponse
{
$lieux = $ville->getLieux();
$data = [];
foreach ($lieux as $lieu) {
$data[] = [
'id' => $lieu->getIdLieu(),
'nom' => $lieu->getNom(),
];
}
return new JsonResponse($data);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\DataFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
// $product = new Product();
// $manager->persist($product);
$manager->flush();
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\DataFixtures;
use App\Entity\Etat;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\Uid\Uuid;
class EtatFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
$etats = [
'Créée',
'Ouverte',
'Clôturée',
'En cours',
'Terminée',
'Annulée',
];
foreach ($etats as $libelle) {
$etat = new Etat();
$etat->setLibelle($libelle);
$manager->persist($etat);
}
$manager->flush(); // Enregistrement en base de données
}
}

View File

@@ -0,0 +1,45 @@
<?php
namespace App\DataFixtures;
use App\Entity\Lieu;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Faker\Factory;
class LieuFixtures extends Fixture implements DependentFixtureInterface
{
public function load(ObjectManager $manager): void
{
$faker = Factory::create();
// Exemple : Références pour des villes déjà créées dans VilleFixtures
$villes = [
$this->getReference('ville_Paris'),
$this->getReference('ville_Lyon'),
$this->getReference('ville_Marseille'),
];
foreach ($villes as $ville) {
for ($i = 0; $i < 5; $i++) { // Génère 5 lieux par ville
$lieu = new Lieu();
$lieu->setNom($faker->streetName());
$lieu->setRue($faker->streetAddress());
$lieu->setLatitude($faker->latitude());
$lieu->setLongitude($faker->longitude());
$lieu->setVille($ville); // Associe le lieu à une ville
$manager->persist($lieu);
}
}
$manager->flush();
}
public function getDependencies(): array
{
return [
VilleFixtures::class, // Assure que VilleFixtures est chargée en premier
];
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace App\DataFixtures;
use App\Entity\Ville;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class VilleFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
// Tableau associatif contenant les noms des villes et leurs codes postaux
$villes = [
['nom' => 'Paris', 'codePostal' => '75000'],
['nom' => 'Lyon', 'codePostal' => '69000'],
['nom' => 'Marseille', 'codePostal' => '13000'],
];
foreach ($villes as $villeData) {
$ville = new Ville();
$ville->setNom($villeData['nom']);
$ville->setCodePostal($villeData['codePostal']); // Définit le code postal
$manager->persist($ville);
// Ajoute une référence pour les fixtures de lieux
$this->addReference('ville_' . $villeData['nom'], $ville);
}
$manager->flush();
}
}

76
src/Form/SortieType.php Normal file
View File

@@ -0,0 +1,76 @@
<?php
namespace App\Form;
use App\Entity\Etat;
use App\Entity\Lieu;
use App\Entity\Participant;
use App\Entity\Site;
use App\Entity\Sortie;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SortieType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('nom', TextType::class, [
'label' => 'Nom de la sortie',
])
->add('dateHeureDebut', DateTimeType::class, [
'label' => 'Date et heure de début',
'widget' => 'single_text', // Permet d'utiliser un champ HTML5
'html5' => true,
])
->add('duree', IntegerType::class, [
'label' => 'Durée (en minutes)',
])
->add('dateLimiteInscription', DateType::class, [
'label' => "Date limite d'inscription",
'widget' => 'single_text',
'html5' => true,
])
->add('nbInscriptionsMax', IntegerType::class, [
'label' => 'Nombre maximum de participants',
])
->add('infosSortie', TextareaType::class, [
'label' => 'Informations complémentaires',
'required' => false,
])
->add('site', EntityType::class, [
'class' => Site::class,
'choice_label' => 'nom', // Utilise le nom du site comme libellé
'label' => 'Site organisateur',
])
->add('participant', EntityType::class, [
'class' => Participant::class,
'choice_label' => 'nom', // Utilise le nom du participant
'label' => 'Organisateur',
])
->add('lieu', EntityType::class, [
'class' => Lieu::class,
'choice_label' => 'nom', // Utilise le nom du lieu
'label' => 'Lieu de la sortie',
])
->add('etat', EntityType::class, [
'class' => Etat::class,
'choice_label' => 'libelle', // Utilise le nom de l'état
'label' => 'État de la sortie',
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Sortie::class,
]);
}
}