IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Filtrer des voitures en fonction de lieu de départ, la date de départ et de retour et la marque de voiture


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2020
    Messages : 23
    Par défaut Filtrer des voitures en fonction de lieu de départ, la date de départ et de retour et la marque de voiture
    le formulaire de recherche apparait sur la template home ; c'est cette template qui affiche le formulaire ou je veux faire mes filtres

    en suivant un tutoriel ,ce matin j'ai essayé de faire un traitement de ce formulaire pour que je puisse récupérer que les voitures disponible de tel à tel date ayant cette marque en particulier .J'ai créer une entité carSearch ou j'ai défini les critéres: brand, pickdate ,pickLocation et returnDate ( qui sont les mêmes dans l'entité booking) et j'ai fait le traitement dans le controller booking car c'est ce controller qui renvoie le formulaire à la vue home et j'ai fait la requete dans carRepository
    Quand je soumis le formulaire il m'affiche toutes les voitures disponibles dans ma bdd
    RIEN NE FONCTIONNE! je sais que je me trempe en terme de logique!!

    Merci encore d'avoir prendre le temps pour me répondre et me chercher une solution pour ces beugs


    l'entité carSearch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    <?php
     
    namespace App\Entity;
     
    use App\Repository\CarSearchRepository;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * @ORM\Entity(repositoryClass=CarSearchRepository::class)
     */
    class CarSearch
    {
        /**
         * @ORM\Id
         * @ORM\GeneratedValue
         * @ORM\Column(type="integer")
         */
        private $id;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $pickLocation;
     
        /**
         * @ORM\Column(type="date")
         */
        private $pickDate;
     
        /**
         * @ORM\Column(type="date")
         */
        private $returnDate;
     
        /**
         * @ORM\Column(type="string", length=255)
         */
        private $brand;
     
        public function getId(): ?int
        {
            return $this->id;
        }
     
        public function getPickLocation(): ?string
        {
            return $this->pickLocation;
        }
     
        public function setPickLocation(string $pickLocation): self
        {
            $this->pickLocation = $pickLocation;
     
            return $this;
        }
     
        public function getPickDate(): ?\DateTimeInterface
        {
            return $this->pickDate;
        }
     
        public function setPickDate(\DateTimeInterface $pickDate): self
        {
            $this->pickDate = $pickDate;
     
            return $this;
        }
     
        public function getReturnDate(): ?\DateTimeInterface
        {
            return $this->returnDate;
        }
     
        public function setReturnDate(\DateTimeInterface $returnDate): self
        {
            $this->returnDate = $returnDate;
     
            return $this;
        }
     
        public function getBrand(): ?string
        {
            return $this->brand;
        }
     
        public function setBrand(string $brand): self
        {
            $this->brand = $brand;
     
            return $this;
        }
    }
    carSearchType
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
     
    namespace App\Form;
     
    use App\Entity\CarSearch;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    use Symfony\Component\Form\Extension\Core\Type\DateType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
     
    class CarSearchType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('pickLocation', ChoiceType::class, [
                'choices' => [
                    'Bordeaux' => 'Bordeaux',
                    'Paris' => 'Paris',
                    'Lyon'  => 'Lyon'
                ],
                'attr' => [
                    'class' => 'custom-select car-choose'
                ],
                'required' => true
            ])
                ->add('pickDate', DateType::class, [
                    'widget' => 'single_text',
                ])
                ->add('returnDate', DateType::class, [
                    'widget' => 'single_text',
                ])
                ->add('brand', TextType::class, [
                    'required' => false
                ])
            ;
        }
     
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults([
                'data_class' => CarSearch::class,
            ]);
        }
    }
    Booking controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    <?php
     
    namespace App\Controller;
     
    use App\Entity\Booking;
    use App\Entity\Car;
    use App\Entity\Model;
    use App\Form\BookingType;
    use App\Form\CarSearchType;
    use App\Repository\BookingRepository;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
     
    /**
     * @Route("/booking")
     */
    class BookingController extends AbstractController
    {
        /**
         * @Route("/", name="booking_index", methods={"GET"})
         */
        public function index(BookingRepository $bookingRepository): Response
        {
            return $this->render('booking/index.html.twig', [
                'bookings' => $bookingRepository->findAll(),
            ]);
        }
     
        /**
         * @Route("/new/{car}", name="booking_new", methods={"GET","POST"})
         * @IsGranted("IS_AUTHENTICATED_FULLY")
         * @param Car $car
         * @param Request $request
         * @return Response
         */
        public function new(Request $request, Car $car,CarRepository $carRepository): Response
        {
            $booking = new Booking();
            $booking->setCar($car);//lier l'entité car a l'entité booking pour que je puisse récupérer la var car dans le form de booking new
            $form = $this->createForm(BookingType::class, $booking);
            $form->handleRequest($request);
     
            // car search treatement
            $carSearch = new CarSearch();
            $form = $this->createForm(CarSearchType:: class,$carSearch);
            $form->handleRequest($request);
     
     
     
            if ($form->isSubmitted() && $form->isValid()) {
     
     
                # TODO : Vérification de disponibilité du car
                # Le plus simple, vérifier s'il n'existe pas déjà une reservation a cette date.
     
     
                $booking->setUser($this->getUser());
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($booking);
                $entityManager->flush();
     
                return $this->redirectToRoute('booking_index');
            }
     
            return $this->render('booking/new.html.twig', [
                'booking' => $booking,
                'form' => $form->createView(),
            ]);
        }
     
        /**
         * @Route("/{id}", name="booking_show", methods={"GET"})
         */
        public function show(Booking $booking): Response
        {
            return $this->render('booking/show.html.twig', [
                'booking' => $booking,
            ]);
        }
     
        /**
         * @Route("/{id}/edit", name="booking_edit", methods={"GET","POST"})
         */
        public function edit(Request $request, Booking $booking): Response
        {
            $form = $this->createForm(BookingType::class, $booking);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $this->getDoctrine()->getManager()->flush();
     
                return $this->redirectToRoute('booking_index');
            }
     
            return $this->render('booking/edit.html.twig', [
                'booking' => $booking,
                'form' => $form->createView(),
            ]);
        }
     
        /**
         * @Route("/{id}", name="booking_delete", methods={"DELETE"})
         */
        public function delete(Request $request, Booking $booking): Response
        {
            if ($this->isCsrfTokenValid('delete'.$booking->getId(), $request->request->get('_token'))) {
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->remove($booking);
                $entityManager->flush();
            }
     
            return $this->redirectToRoute('booking_index');
        }
    }
    CarRepository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    <?php
     
    namespace App\Repository;
     
    use App\Entity\Car;
    use App\Entity\CarSearch;
    use Doctrine\ORM\Query;
    use App\Form\CarType;
    use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
    use Doctrine\Persistence\ManagerRegistry;
     
    /**
     * @method Car|null find($id, $lockMode = null, $lockVersion = null)
     * @method Car|null findOneBy(array $criteria, array $orderBy = null)
     * @method Car[]    findAll()
     * @method Car[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
     */
    class CarRepository extends ServiceEntityRepository
    {
        public function __construct(ManagerRegistry $registry)
        {
            parent::__construct($registry, Car::class);
        }
     
        // public function findFilter($form)
        // {
        //     $qb = $this->createQueryBuilder('c');
     
        //     if ($form['brand']) {
        //         $qb->andWhere('c.brand = :brand')
        //             ->setParameter('brand', $form['brand']);
        //     }
     
        //     if ($form['year']) {
        //         $qb->andWhere('c.year = :year')
        //             ->setParameter('year', $form['year']);
        //     }
     
        //     if ($form['price']) {
        //         $qb->andWhere('c.price = :price')
        //             ->setParameter('price', $form['price']);
        //     }
     
        //     if ($form['image']) {
        //         $qb->andWhere('c.image= :image')
        //             ->setParameter('image', $form['image']);
        //     }
     
        //     if ($form['isNew']) {
        //         if ($form['isNew'] === 'yes') {
        //             $qb->andWhere('c.isNew = true');
        //         } else {
        //             $qb->andWhere('c.isNew = false');
        //         }
        //     }
     
        //     return $qb->orderBy('c.id', 'ASC')
        //         ->getQuery()
        //         ->getResult()
        //     ;
        // }
     
        public function findAllWithPagination(CarSearch $carSearch) : Query{
     
            $qb = $this->createQueryBuilder('c');
     
            if ($carSearch->getPickLocation()) {
                $qb = $qb->andWhere('c.pickLocation = :pickLocation')
                ->setParameter('pickLocation', $carSearch->getPickLocation());
                }
            if ($carSearch->getPickDate()) {
                $qb = $qb->andWhere('c.pickDate = :pickDate')
                ->setParameter('pickDate', $carSearch->getPickDate());
                 }
            if ($carSearch->getReturnDate()) {
                $qb = $qb->andWhere('c.returnDate = :returnDate')
                ->setParameter('returnDate', $carSearch->getReturnDate());
                }
     
            if ($carSearch->getBrand()) {
                    $qb = $qb->andWhere('c.brand = :brand')
                    ->setParameter('brand', $carSearch->getBrand());
                    }
     
            return $qb->getQuery();
     
        }
     
        // /**
        //  * @return Car[] Returns an array of Car objects
        //  */
        /*
        public function findByExampleField($value)
        {
            return $this->createQueryBuilder('c')
                ->andWhere('c.exampleField = :val')
                ->setParameter('val', $value)
                ->orderBy('c.id', 'ASC')
                ->setMaxResults(10)
                ->getQuery()
                ->getResult()
            ;
        }
        */
     
        /*
        public function findOneBySomeField($value): ?Car
        {
            return $this->createQueryBuilder('c')
                ->andWhere('c.exampleField = :val')
                ->setParameter('val', $value)
                ->getQuery()
                ->getOneOrNullResult()
            ;
        }
        */
    }
    Car controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    <?php
     
    namespace App\Controller;
     
    use App\Entity\Car;
    use App\Entity\CarSearch;
    use App\Form\CarType;
    use App\Repository\CarRepository;
    use Knp\Component\Pager\PaginatorInterface;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    /**
     * @Route("/car")
     */
    class CarController extends AbstractController
    {
        /**
         * @Route("/", name="car_index", methods={"GET"})
         */
        public function index(CarRepository $carRepository, PaginatorInterface $paginatorInterface, Request $request): Response
        {   
            // to use the entity car search in findAllWithPagination function (query treatement)
            $carSearch = new CarSearch();
     
            $cars = $paginatorInterface->paginate(
                $carRepository->findAllWithPagination($carSearch),
                $request->query->getInt('page', 1), /*page number*/
                6 /*limit per page*/
            );
            return $this->render('car/index.html.twig', [
                'cars' => $cars,
     
            ]);
        }
     
        /**
         * @Route("/new", name="car_new", methods={"GET","POST"})
         */
        public function new(Request $request): Response
        {
            $car = new Car();
            $form = $this->createForm(CarType::class, $car);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->persist($car);
                $entityManager->flush();
     
                return $this->redirectToRoute('car_index');
            }
     
            return $this->render('car/new.html.twig', [
                'car' => $car,
                'form' => $form->createView(),
            ]);
        }
     
        /**
         * @Route("/{id}", name="car_show", methods={"GET"})
         */
        public function show(Car $car): Response
        {
            return $this->render('car/show.html.twig', [
                'car' => $car,
            ]);
        }
     
        /**
         * @Route("/{id}/edit", name="car_edit", methods={"GET","POST"})
         */
        public function edit(Request $request, Car $car): Response
        {
            $form = $this->createForm(CarType::class, $car);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $this->getDoctrine()->getManager()->flush();
     
                return $this->redirectToRoute('car_index');
            }
     
            return $this->render('car/edit.html.twig', [
                'car' => $car,
                'form' => $form->createView(),
            ]);
        }
     
        /**
         * @Route("/{id}", name="car_delete", methods={"DELETE"})
         */
        public function delete(Request $request, Car $car): Response
        {
            if ($this->isCsrfTokenValid('delete'.$car->getId(), $request->request->get('_token'))) {
                $entityManager = $this->getDoctrine()->getManager();
                $entityManager->remove($car);
                $entityManager->flush();
            }
     
            return $this->redirectToRoute('car_index');
        }
    }
    la template Home

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    {% extends 'base.html.twig' %}
     
    {% block title %} CAR RENT{% endblock %}
     
    {% block body %}
     
        <!--== SlideshowBg Area Start ==-->
        <section id="slideslow-bg">
            <div class="container">
                <div class="row">
                    <div class="col-lg-12 text-center">
                        <div class="slideshowcontent">
                            <div class="display-table">
                                <div class="display-table-cell">
                                    <h1>Trouvons ensemble la voiture idéale..</h1>
                                    <p>Choisir une de nos voiture et bénificier de 15% DISCOUNT <br> OFFRE RESERVEE AU CLIENTELE</p>
     
                                    <div class="book-ur-car">
                                       {{ form_start(form) }}
                                            <div class="car-choose bookinput-item">
                                              <label>Depart de : </label>
                                                {{ form_widget(form.pickLocation, { 'attr' :{'placeholder':'lieu de départ'}}) }}
                                            </div>
     
                                            <div class="pick-date bookinput-item">
                                               <label>Début de location </label>
                                                {{ form_widget(form.pickDate, { 'attr' :{'placeholder':''}}) }}
                                            </div>
     
                                            <div class="retern-date bookinput-item">
                                               <label>Fin de location </label>
                                                {{ form_widget(form.returnDate, { 'attr' :{'placeholder':''}}) }}
                                            </div>
     
                                            <div class="car-choose bookinput-item">
                                                <label>Marque de voiture</label>
                                                {{ form_widget(form.car, { 'attr' :{'placeholder':'marque de voiture'}}) }}
     
                                            </div>
                                             <div><button type="submit" class="btn"><a href="{{ path('car_index')}}"></a> Rechercher</button></div>
                                       {{ form_end(form) }}
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </section>
    1
    {% endblock %}

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut
    Bonjour,

    Je ne procède pas de la même manière que toi pour les filtres sur mes données, il nous faudrait quelques infos supplémentaires :
    - Sous quelle version de Symfony es tu ?
    - Quel bundle utilises tu pour paginer tes recherches ? (Je ne connais que knplabs/knp-paginator-bundle, qui a peut être une logique différente si tu utilises un autre bundle)
    - Tu utilises la fonction findAllWithPagination, c'est une fonction perso, ou incluse dans le bundle de pagination que tu utilises ?
    - Est ce obligatoire de créer une entité carSearch ?

    Voilà pour commencer, on verra pour la suite...

  3. #3
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Salut,

    Sauf si tu modifies la valeur de l'attribut "action" explicitement (cf. https://symfony.com/doc/current/form...nd-http-method), le formulaire sera soumis via une requête POST vers la route sur laquelle tu te trouves.
    Or si j'ai bien compris, le formulaire de recherche est affiché sur la route /car/, donc la soumission du formulaire envoie les données sur cette même route via une requête POST.

    Si c'est bien le cas, je vois déjà plusieurs raisons qui peuvent expliquer tes problèmes :
    - cette route n'accepte que des requêtes de type GET (ligne 20) or le formulaire envoie du POST
    - tu instancies un CarSearch (ligne 24) sans jamais valoriser ses champs avec les données du formulaire, donc quand tu t'en sers ensuite en argument de findAllWithPagination (ligne 28), tu ne rentres probablement jamais dans tous les if de cette méthode, et donc au final la Query retournée est équivalente à SELECT * FROM car_search; (d'où le fait que tu récupères toujours la liste de toutes les voitures)
    - dans ton contrôleur, tu traites toutes les requêtes pareil (pas de distinction entre un GET pour simplement afficher la page et le POST quand le formulaire est soumis)

    Essaye de t'inspirer des autres méthodes de ton contrôleur, pour comprendre comment détecter que ton formulaire a été soumis, pour gérer les données et hydrater ton objet CarSearch, etc.
    Si besoin je pense que cette partie de la documentation pourra t'aider : https://symfony.com/doc/current/form...ocessing-forms

    Bon courage !

    [EDIT] My bad merou19 avait aussi commencé à te répondre pendant que j'écrivais mon message

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Par défaut
    Citation Envoyé par _Thomas Voir le message
    [EDIT] My bad merou19 avait aussi commencé à te répondre pendant que j'écrivais mon message
    No problemo ! Je n'étais pas allé aussi loin que toi dans l'analyse, bien vu le GET et le POST, j'avais pas vu

  5. #5
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2020
    Messages : 23
    Par défaut
    Citation Envoyé par merou19 Voir le message
    salut
    je te remercie de votre réponse
    j'utilise symfony5
    j'ai crée l'entité carSearch en suivant une vidéo
    oui c'est le meme bundle de pagination que j'ai utilisé knplabs/knp-paginator-bundle

    Citation Envoyé par _Thomas Voir le message
    bonjour
    Merci d'avoir prendre le temps pour me répondre
    le formulaire de recherche est présent dans la route "/" page d'accueil
    je suis un peu perdue dans tout ces fichiers j'avoue!
    j'ai instancié le carSearch dans car controller pour pouvoir l'utiliser dans la fonction findAllWithPagination et j'ai fait le traitement dans un autre controller 'booking controller" .Dans car controller je renvoie la vue car/ index qui va m'afficher la liste des voitures, alors que moi je veux renvoyer un autre vue 'la vue home' car c'est celle ci qui contient le formilaire de recherche c'est pour cela j'ai instancier a nouveau le carSearch le controller booking ou j'ai fait le traitement

    tu parle de get et post je les jamais utilisé sur symfony 5! si tu peux m'expliquer plus ça serait génial! je suis débutante !
    SI TU VEUX DES CLARIFICATIONS POUR MIEUX M'AIDER PLZ TELL ME
    Merci encore Thomas

  6. #6
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Citation Envoyé par loubna06 Voir le message
    tu parle de get et post je les jamais utilisé sur symfony 5! si tu peux m'expliquer plus ça serait génial! je suis débutante !
    En fait GET, POST, etc... font référence à des méthodes HTTP (ce'nest pas spécifique à PHP ou à Symfony) : https://devoper.mozilla.org/fr/docs/...P/M%C3%A9thode

    Pour te représenter les choses (en simplifiant), quand tu ouvres une page web avec un navigateur, ton navigateur fait un GET sur l'URL de la page puis il t'affiche le résultat obtenu.
    Quand tu affiche un formulaire, idem tu fais un GET de la page qui contient ton formulaire. Par contre quand tu soumets ton formulaire, la plupart du temps les données seront transmises via une requête POST vers la page définie dans l'attribut "action" du formulaire (par défaut "action" correspond à la page courant où se trouve le formulaire).

    À noter que tu peux modifier le comportement par défaut en modifiant la valeurs des attributs du formulaire : https://developer.mozilla.org/fr/doc...Form#Attributs

    Pour faire le lien avec Symfony, dans les annotations de tes routes, tu peux explicitement indiquer quel(s) type(s) de requête HTTP seront gérés par telle ou telle route : https://symfony.com/doc/current/rout...g-http-methods
    La plupart du temps matcher que du GET sera suffisant, mais les routes des contrôleurs qui doivent gérer des formulaires devront (presque toujours) gérer également du POST.

    Est-ce que tu y vois un peu plus clair maintenant ?

    Citation Envoyé par loubna06 Voir le message
    le formulaire de recherche est présent dans la route "/" page d'accueil
    Si tu n'a rien changé au comportement de base de ton formulaire, il sera soumis via une requête POST sur la même URL (cf. https://symfony.com/doc/current/form...nd-http-method). Donc soit ça te semble correct, dans ce cas il faudrait nous montrer le code du contrôleur de ta page d'accueil ; soit tu veux modifier ce comportement par défaut, dans ce cas regarde sur la doc comment faire (lien précédent).

  7. #7
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2020
    Messages : 23
    Par défaut
    Bonjour thomas
    j'ai utilisé get et post en php pure mais pas en symfony! en gros en symfony on met get et post dans les annotations
    ce qui me pose probleme c'est le query builder je l'ai mal fait et je ne vois pas comment corriger mes erreurs ! Aprés plusieurs modifications voici mon car repository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
     
     
    <?php
     
    namespace App\Repository;
     
    use App\Entity\Car;
    use App\Entity\CarSearch;
    use Doctrine\ORM\Query;
    use App\Form\CarType;
    use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
    use Doctrine\Persistence\ManagerRegistry;
     
    /**
     * @method Car|null find($id, $lockMode = null, $lockVersion = null)
     * @method Car|null findOneBy(array $criteria, array $orderBy = null)
     * @method Car[]    findAll()
     * @method Car[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
     */
    class CarRepository extends ServiceEntityRepository
    {
        public function __construct(ManagerRegistry $registry)
        {
            parent::__construct($registry, Car::class);
        }
     
        // public function findFilter($form)
        // {
        //     $qb = $this->createQueryBuilder('c');
     
        //     if ($form['brand']) {
        //         $qb->andWhere('c.brand = :brand')
        //             ->setParameter('brand', $form['brand']);
        //     }
     
        //     if ($form['year']) {
        //         $qb->andWhere('c.year = :year')
        //             ->setParameter('year', $form['year']);
        //     }
     
        //     if ($form['price']) {
        //         $qb->andWhere('c.price = :price')
        //             ->setParameter('price', $form['price']);
        //     }
     
        //     if ($form['image']) {
        //         $qb->andWhere('c.image= :image')
        //             ->setParameter('image', $form['image']);
        //     }
     
        //     if ($form['isNew']) {
        //         if ($form['isNew'] === 'yes') {
        //             $qb->andWhere('c.isNew = true');
        //         } else {
        //             $qb->andWhere('c.isNew = false');
        //         }
        //     }
     
        //     return $qb->orderBy('c.id', 'ASC')
        //         ->getQuery()
        //         ->getResult()
        //     ;
        // }
     
        public function findAllWithPagination(CarSearch $carSearch) : Query{
     
            $qb = $this->createQueryBuilder('c');
     
            if ($carSearch->getPickLocation()) {
                $qb = $qb->andWhere('c.pickLocation = :pickLocation')
                ->setParameter('pickLocation', $carSearch->getPickLocation());
                }
     
            if ($carSearch->getPickDate()) {
     
                $qb->andWhere('c.pickDate >= '.date('Y-m-d H:i:s'));
     
     
                 }
            if ($carSearch->getReturnDate()) {
                $qb->andWhere('c.returnDate <= '.date('Y-m-d H:i:s'));
     
                }
     
            if ($carSearch->getBrand()) {
                    $qb = $qb->andWhere('c.brand = :brand')
                    ->setParameter('brand', $carSearch->getBrand());
                    }
     
            return $qb->getQuery();
     
        }
     
        // /**
        //  * @return Car[] Returns an array of Car objects
        //  */
        /*
        public function findByExampleField($value)
        {
            return $this->createQueryBuilder('c')
                ->andWhere('c.exampleField = :val')
                ->setParameter('val', $value)
                ->orderBy('c.id', 'ASC')
                ->setMaxResults(10)
                ->getQuery()
                ->getResult()
            ;
        }
        */
     
        /*
        public function findOneBySomeField($value): ?Car
        {
            return $this->createQueryBuilder('c')
                ->andWhere('c.exampleField = :val')
                ->setParameter('val', $value)
                ->getQuery()
                ->getOneOrNullResult()
            ;
        }
        */
    }
    Mon home controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
     
    <?php
     
    namespace App\Controller;
    use App\Entity\Booking;
    use App\Form\BookingType;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Routing\Annotation\Route;
     
    class HomeController extends AbstractController
    {
        /**
         * @Route("/", name="home")
         */
     
        public function index(Request $request)
        {
            $booking = new Booking();
            $form = $this->createForm(BookingType::class, $booking);
            $form->handleRequest($request);
     
            if ($form->isSubmitted() && $form->isValid()) {
                $entityManager = $this->getDoctrine()->getManager();
                $booking->setUser($this->getUser());
                $entityManager->persist($booking);
                $entityManager->flush();
     
                // $this->addFlash(
                //     'success',
                //     "Votre réservation  a été prise en compte avec succès!"
                // );
     
     
                return $this->redirectToRoute('car_index');
            }
     
     
            return $this->render('home/index.html.twig', [
                'form' => $form->createView(),
            ]);
        }
     
    }

    Ma vue home je l'ai déja partagé
    Merci pour ton aide

  8. #8
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Par défaut
    Citation Envoyé par loubna06 Voir le message
    j'ai utilisé get et post en php pure mais pas en symfony! en gros en symfony on met get et post dans les annotations
    Alors pour être précis, par défaut les routes matchent tous les types de requêtes HTTP, l'option methods permet d'être plus strict et de restreindre certaines routes à certains types de requêtes. La conséquence est la suivante : imaginons une route dont le path est /test et qui ne matche que les requêtes GET, si une requête POST est envoyée sur /test, elle ne matchera pas la route et donc le contrôleur sous-jacent ne sera pas exécuté (et tu obtiendras une erreur 404 si aucune autre route ne matche).

    Pour info tu peux obtenir des informations sur tes routes avec la commande suivante : php bin/console debug:router

    Mais tout concerne uniquement la logique du router, ensuite pour manipuler les requêtes et leurs données : https://symfony.com/doc/current/comp...g-request-data
    Sur cette page de la doc, tu as la liste des informations contenues dans un objet de type Request ainsi que des méthodes pour les manipuler.

    Bref, revenons à ton code...

    1. Tu débutes sur ta route "home" (/) qui visiblement affiche un formulaire de type BookingType.
    2. Quand le formulaire est soumis, une requête POST est envoyée sur la même route.
    3. Le contrôleur sous-jacent est à nouveau exécuté mais cette fois handleRequest alimente les propriétés du Booking à partir des données renseignées dans le formulaire.
    4. Cette fois isSubmitted et isValid retourne true (en faisant l'hypothèse qu'il n'y a pas d'erreur de validation), l'objet Booking est persisté
    5. On est redirigé vers la route "car_index", dont le contrôleur affiche une vue à partir du template "car/index.html.twig".

    Est-ce que jusqu'ici ces points fonctionnent correctement ? Peux-tu nous partager le code de "car/index.html.twig" ? (à mon avis mon premier message devrait t'aider à déboguer, surtout si tu y vois maintenant un peu plus clair sur l'enchaînement des choses)

    Par ailleurs, deux remarques sur ton code :
    - dans "home/index.html.twig" à la ligne 40, à mon avis le lien <a href="{{ path('car_index')}}"> n'est pas nécessaire/utile
    - dans "src/Controller/HomeController.php" à la ligne 25, tu récupères l'EntityManager directement depuis le conteneur de services, or Symfony recommande d'utiliser l'injection de dépendances (cf. ici et ici)

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/01/2015, 16h34
  2. Filtrer des données en fonction d'un champ
    Par lucazzo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/12/2012, 18h08
  3. Filtrer + résultat associé en fonction des combinaisons
    Par clairejp dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/09/2012, 19h41
  4. Comment filtrer des doublon en fonction d'une variable
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2012, 19h18
  5. Filtrer une recherche en fonction des caractères saisies
    Par FreeAccess dans le forum Contribuez
    Réponses: 0
    Dernier message: 15/07/2008, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo