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

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    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 habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 155
    Points : 135
    Points
    135
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    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 habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 155
    Points : 135
    Points
    135
    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
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    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
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    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 confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    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)

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    Par défaut
    Bonjour
    j'ai changé l'emplacement de traitement de filtre , comme les attributs de l'entité carSearch sont les mêmes que j'ai utilisé dans l'entité booking donc je vais faire le filtre directement sur cette entité mais pour les requêtes je garde car Repository ( je veux filtrer par date) , mais ma requête ne fonctionne toujours pas!
    je vais voir les doc que tu m'a donner..
    merci thomas
    je te partage le car/index.html.twig

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    {% extends 'base.html.twig' %}
     
    {% block title %}Liste de voitures{% endblock %}
     
    {% block body %}
     
        <section id="page-title-area" class="section-padding overlay">
            <div class="container">
                <div class="row">
                    <!-- Page Title Start -->
                    <div class="col-lg-12">
                        <div class="section-title  text-center">
                            <h2>Nos Annonces</h2>
                            <span class="title-line"><i class="fa fa-car"></i></span>
                            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
                        </div>
                    </div>
                    <!-- Page Title End -->
                </div>
            </div>
        </section>
     
        <div class="container">
            <div class="row">
     
            <br>
                {% for car in cars %}        
                    <div class="col-12 col-lg-12 p-1">
                        <div class="card mb-3">
                            <div class="row no-gutters align-items-center p-2">
                                <div class="col-12 col-md-4">
                                    <img src="{{ asset('uploads/images/cars/')}}{{ car.image }}" class="card-img">                  
                                </div> 
                                <div class="col">
                                    <div class="card-body">
     
                                        <p class="card-text">
                                            <div>Marque : {{car.brand}}</div> 
                                            <div>Année : {{car.year}}</div>
                                            <div>Nombre de places : {{car.seats}}</div>
                                            <div>Transmission : {{car.transmission}}</div>
                                            <div>Prix par jour : {{car.price}} &euro;</div>
                                        </p>
                                        <button class="btn res"><a href="{{ path('booking_new', {'car': car.id})}}">Réserver</a></button>
                                        <button class="btn voir"><a href="{{ path('blog_details', {'id': car.id}) }}">Voir les details</a></button>
     
                                    </div>
                                </div>                  
                            </div>                
                        </div>
                    </div>
                {% endfor %}
            </div>                  
        </div>
     
        <a href="{{ path('car_new') }}">Ajouter une voiture</a>
     
        <div class="navigation text-align-center">
             {{ knp_pagination_render(cars) }}
        </div>
        <br>
        <br>
    {% endblock %}

    Citation Envoyé par _Thomas Voir le message
    j'ai oublié de répondre a ta question! oui jusqu'au soumission de formulaire tout fonctionne bien , pas d'erreurs mais par contre le filtre n'est pas pris en compte donc il m'affiche tout la liste des voiture disponible dans ma bdd

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 155
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    Je reviens dans la discussion juste pour une question svp...

    Loubna06, tu disais que tu t'étais inspiré d'un tutoriel.
    Vu que je ne procède pas de la même manière que toi pour mes filtres (je n'ai pas une entité comme tu fais avec carSearch), j'aimerais voir, pour ma culture générale , comment on peut faire avec ta méthode.
    Peux tu poster le lien vers le tuto que tu avais trouvé stp ?

    Merci d'avance !

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    Par défaut
    bonjour merou

    voila mais je me retrouve pas dans tout ça! peux tu me dire plus sur ta façon de faire les filtres? et si tu as déja filtrer sur des dates?
    Merci

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    Ok.. je ne suis pas certain d'avoir bien compris le début de ton avant avant dernier message.

    En revanche je pense en fait avoir compris ton besoin initial : lorsqu'on est redirigé de la route "home" vers la route "car_index" (point 5), tu voudrais que la liste des Cars utilise les valeurs renseignées dans le formulaire de Booking pour ne récupérer que les Cars correspondant aux critères du Booking (pickLocation, pickDate, returnDate, brand). Est-ce bien ça ?

    Si oui alors il faut que tu réalises qu'en l'état, quand dans ton HomeController tu redirige avec $this->redirectToRoute('car_index'); tu perds la requête originale (celle de type POST qui contient notamment les données transmises par ton formulaire de Booking), car la redirection effectue une nouvelle requête, de type GET, vers la route "car_index" (donc tu ne disposes plus des données dont tu voudrais te servir pour filtrer). Cependant comme tu peux le voir sur cette page de la doc, tu peux passer des paramètres en second argument de la méthode redirectToRoute.

    Par exemple avec $this->redirectToRoute('car_index', ['request' => $request->request->all()], 307);, tu devrais pouvoir effectuer la "même" redirection vers la route "car_index" mais avec en plus un paramètre "request" qui contient la totalité de la requête POST initiale. Le code HTTP 307 permet de faire en sorte que la redirection ne transforme pas la requête POST en GET.

    À partir de là dans ta méthode "index" de ton CarController, $request devrait théoriquement contenir les valeurs de ta requête POST initiale. Il te reste plus qu'à récupérer ces données (cf. https://symfony.com/doc/current/comp...g-request-data) pour hydrater ton objet CarSearch (c'est à dire utiliser ses setters pour définir les valeurs de tes critères de filtre pickLocation, pickDate, returnDate, brand).

    À noter que je ne sais pas si c'est une bonne manière de faire les choses, peut-être qu'il vaut mieux passer par les attributs de la requête ; peut-être même qu'il faut faire complètement autrement et ne pas modifier à la volée la requête (la doc semble le déconseiller ici : https://symfony.com/doc/current/comp...ng-the-request).

  13. #13
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    Par défaut
    c'est exactement ce que je veux faire thomas
    j'ai fait ce que tu m'as dit et j'ai rajouté la méthode POST dans la route /car , quand je veux soumettre le formulaire j'obtiens cette erreur
    [Syntax Error] line 0, col 62: Error: Expected end of string, got '16'

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 155
    Points : 135
    Points
    135
    Par défaut
    Là, le problème, comme le soulève _Thomas, c'est le passage des valeurs de recherches vers une autre page, vu que le formulaire de recherche et la liste affichée ne sont pas sur la même page.
    A l'époque, j'avais eu l'idée de passer mes valeurs par des variables de session, ça fonctionne, mais ça ne fait surement pas partie des bonnes pratiques !

    Sur le principe, je procède de la manière suivante :
    - Je renseigne mon formulaire de recherche dans une entité non liée à la bdd.
    - A sa soumission, je vérifie le formulaire et chaque champ saisi, et si c'est ok, je stock chaque champ en session.
    - Puis je redirectToRoute vers ma fonction qui affiche la liste.
    - Si j'ai en session des champs de recherche avec des valeurs, j'utilise ces valeurs dans les andWhere de ma requête, sinon j'affiche la liste complète.

    Pour toi, si personne ne te propose mieux, tu peux tenter :

    Dans ton controller qui lit le formulaire de recherche (là, je me perd dans ton code, désolé !) : sauvegarder en session les critères de recherches
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            if ($form->isSubmitted() && $form->isValid()) {
                $recherche = $form->getData();
                $session->set('pickLocation', $recherche['pickLocation']);
                // pareil pour les autres champs...
     
                return $this->redirectToRoute('???'); // vers la route qui affiche la liste
            }
    Dans carController : réalimenter ton entité carSearch par chaque valeur en session
    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
        public function index(CarRepository $carRepository, PaginatorInterface $paginatorInterface, Request $request): Response
        {   
            // to use the entity car search in findAllWithPagination function (query treatement)
            $carSearch = new CarSearch();
     
            // alimentation de carSearch
            $session = $request->getSession();
            carSearch->setPickLocation($session->get('pickLocation')->getData());
            // pareil pour les autres champs...
     
            $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,
     
            ]);
        }
    PS : Le temps que j'écrive tout ça, je vois que tu as continué tes recherches et répondu à _Thomas.
    Ma solution fonctionne chez moi, mais ce n'est pas propre.
    Je poste quand même, mais essaie les idées de _Thomas d'abord (qui a de très bonnes idées, dont je m'inspirerai pour mes futurs projets ).

    Bon courage !

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    Si tu tapes l'erreur dans un moteur de recherches, tu verras que ça vient probablement d'un problème de syntaxe dans ton QueryBuilder.

    Peut-être que ça vient du fait que tu ré-assignes $qb dans certains de tes if ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    Je repensais à une chose, plutôt que de faire suivre la requête d'une route à l'autre, tu pourrais aussi retrouver les informations nécessaires en partant de l'utilisateur authentifié : vu que ton Booking est lié à cet utilisateur, dans ton "index" de CarController tu pourrais retrouver ce Booking (théoriquement c'est le plus récent lié à l'utilisateur courant) et utiliser ses informations pour hydrater ton objet CarSearch.

  17. #17
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par merou19 Voir le message
    Merci Loubna06 pour le lien !

    Alors, j'ai regardé la vidéo, et pour moi, ça me semble compréhensible.
    C'est même plus propre que ce que je fais ! A l'époque où j'étais sur ces problèmes, je n'avais pas trouvé de tuto clair comme le tien.

    Là, le problème, comme le soulève _Thomas, c'est le passage des valeurs de recherches vers une autre page, vu que le formulaire de recherche et la liste affichée ne sont pas sur la même page.
    A l'époque, j'avais eu l'idée de passer mes valeurs par des variables de session, ça fonctionne, mais ça ne fait surement pas partie des bonnes pratiques !

    Sur le principe, je procède de la manière suivante :
    - Je renseigne mon formulaire de recherche dans une entité non liée à la bdd.
    - A sa soumission, je vérifie le formulaire et chaque champ saisi, et si c'est ok, je stock chaque champ en session.
    - Puis je redirectToRoute vers ma fonction qui affiche la liste.
    - Si j'ai en session des champs de recherche avec des valeurs, j'utilise ces valeurs dans les andWhere de ma requête, sinon j'affiche la liste complète.

    Pour toi, si personne ne te propose mieux, tu peux tenter :

    Dans ton controller qui lit le formulaire de recherche (là, je me perd dans ton code, désolé !) : sauvegarder en session les critères de recherches
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            if ($form->isSubmitted() && $form->isValid()) {
                $recherche = $form->getData();
                $session->set('pickLocation', $recherche['pickLocation']);
                // pareil pour les autres champs...
     
                return $this->redirectToRoute('???'); // vers la route qui affiche la liste
            }
    Dans carController : réalimenter ton entité carSearch par chaque valeur en session
    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
        public function index(CarRepository $carRepository, PaginatorInterface $paginatorInterface, Request $request): Response
        {   
            // to use the entity car search in findAllWithPagination function (query treatement)
            $carSearch = new CarSearch();
     
            // alimentation de carSearch
            $session = $request->getSession();
            carSearch->setPickLocation($session->get('pickLocation')->getData());
            // pareil pour les autres champs...
     
            $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,
     
            ]);
        }
    PS : Le temps que j'écrive tout ça, je vois que tu as continué tes recherches et répondu à _Thomas.
    Ma solution fonctionne chez moi, mais ce n'est pas propre.
    Je poste quand même, mais essaie les idées de _Thomas d'abord (qui a de très bonnes idées, dont je m'inspirerai pour mes futurs projets ).

    Bon courage !
    je te remercie de cette réponse detaillée merou!
    est ce que je peux utiliser les sessions dans la 5eme version de symfony?

    merci encore

  18. #18
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par _Thomas Voir le message
    Si tu tapes l'erreur dans un moteur de recherches, tu verras que ça vient probablement d'un problème de syntaxe dans ton QueryBuilder.

    Peut-être que ça vient du fait que tu ré-assignes $qb dans certains de tes if ?
    effectivement , cette erreur disparait mais une autre apparait! je vais faire mes recherches pour le résoudre et si j'y arrive pas je te dis
    Thanks thomas

  19. #19
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2020
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    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
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par _Thomas Voir le message
    Je repensais à une chose, plutôt que de faire suivre la requête d'une route à l'autre, tu pourrais aussi retrouver les informations nécessaires en partant de l'utilisateur authentifié : vu que ton Booking est lié à cet utilisateur, dans ton "index" de CarController tu pourrais retrouver ce Booking (théoriquement c'est le plus récent lié à l'utilisateur courant) et utiliser ses informations pour hydrater ton objet CarSearch.
    salut
    j'ai jamais fait l'hydratation ; donc je vois pas de quoi tu parles! je vais regardé la doc sur ça!
    désolée ma compréhension est un peu lente
    nb: je suis une grande débutante en informatique! c'est mon tout premier projet symfony aprés avoir fait une formation intensive dont j'ai fait php/symfony en un mois!

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 351
    Points : 582
    Points
    582
    Par défaut
    Citation Envoyé par loubna06 Voir le message
    j'ai jamais fait l'hydratation ; donc je vois pas de quoi tu parles! je vais regardé la doc sur ça!
    désolée ma compréhension est un peu lente
    nb: je suis une grande débutante en informatique! c'est mon tout premier projet symfony aprés avoir fait une formation intensive dont j'ai fait php/symfony en un mois!
    Pas besoin de t'excuser, c'est tout à fait normal de ne pas tout connaître et on progresse tout à un rythme différent. À mon avis, c'est plutôt une qualité d'être capable de poser des questions quand on ne sait pas (en ayant le réflexe de quand même chercher par soi-même avant), plutôt que de rester bloquer infiniment par orgueil.

    "Hydrater un objet" c'est une expression a priori obscure mais qui résume en fait une idée simple : définir les valeurs des propriétés d'un objet à partir d'une source de données quelconque.

    Un exemple dans ton BookingController : quand tu récupères les données provenant du formulaire de ta page d'accueil pour créer un objet Booking puis le persister en base, sans que tu t'en rende compte $booking a été hydraté à partir des valeurs du formulaire (Symfony l'a fait pour toi via la méthode handleRequest car ton $form est lié au $booking qui est de type Booking).

    Tu aurais pu obtenir le même résultat en hydratant l'objet à la main, donc en utilisant les setters de chaque propriété de ton objet :
    Code php : 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
     ...
        public function index(Request $request)
        {
            $booking = new Booking();
            $form = $this->createForm(BookingType::class); // On ne passe pas le $booking lors de la création du formulaire
            $form->handleRequest($request); // donc Symfony ne peut plus hydrater tout seul l'objet quand "handleRequest" est exécutée
     
            if ($form->isSubmitted() && $form->isValid()) {
                $booking->setPickLocation($form->get('pickLocation')->getData()); // Du coup on hydrate les champs un par un...
                $booking->setPickDate($form->get('pickDate')->getData());
                $booking->setReturnDate($form->get('returnDate')->getData());
                ...
                $entityManager = $this->getDoctrine()->getManager();
                $booking->setUser($this->getUser());
                $entityManager->persist($booking);
                $entityManager->flush();
    ...

    Est-ce que ça te paraît plus clair désormais ?

    Si jamais ça t'intéresse (et que tu as le temps^^) tu peux regarder ces deux playlists sur PHP/la POO en PHP :
    - https://www.youtube.com/playlist?lis...HM_C19dPW1MAMD
    - https://www.youtube.com/playlist?lis...5Df5fnMqY-ec16
    C'est pas mal pour revoir les concepts de base du langage et de la POO qui sont ensuite largement utilisés dans les frameworks comme Symfony.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/01/2015, 17h34
  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, 19h08
  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, 20h41
  4. Comment filtrer des doublon en fonction d'une variable
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2012, 20h18
  5. Filtrer une recherche en fonction des caractères saisies
    Par FreeAccess dans le forum Contribuez
    Réponses: 0
    Dernier message: 15/07/2008, 14h59

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