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
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 <?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; } }
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 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, ]); } }
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
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'); } }
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
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() ; } */ }
la template Home
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'); } }
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 %}
Partager