Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony 5] Problème variable à la vue

    6 octobre 2021 à 11:53:03

    Bonjour,

    je ne comprends pas mon erreur (et pourtant j'ai cherché) j'essaye de passer une variable à ma vue, par l'id. 

    Plus en détail, c'est un site de coachs, avec plusieurs coachs, et plusieurs disponibilités par coach. Dans le select de résa, j'aimerais ramener à la vue uniquement les disponibilités du coach sélectionné. je passe donc en argument de ma fonction $coach_id, et dans ma vue: coach_id.dispo en gros. 

    Ca ne marche pas, ça me met l'erreur suivante: "

    Controller "App\Controller\HomeController::resa()" requires that you provide a value for the "$coach_id" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.

    voici ma vue twig : 

    {% extends 'base.html.twig' %}
    
    {% block title %}Mon coach by Athéon{% endblock %}
    {% block stylesheets %}
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Kaisei+HarunoUmi:wght@400;500;700&display=swap"
     rel="stylesheet">
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link
            href="https://fonts.googleapis.com/css2?family=Kaisei+HarunoUmi:wght@700&family=Oswald:wght@200;300;400;500;600;700&family=Roboto:ital,wght@0,100;0,300;0,400;0,700;1,100;1,900&display=swap"
            rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet"
            integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.3/css/all.css">
    <link href="/css/header.css" rel="stylesheet">
    <link  href="/css/footer.css" rel="stylesheet">
    <link rel="stylesheet" href="/css/general.css">
    
    
    
    {% endblock %}
    {% block body %}
    <section class="container container_resa">
        <h2>Choissez un créneau pour votre cours</h2>
        <div id="card card_select" class="form_select">
    
            <form class="col-12 col-lg-7 form text-center select" method="POST" action="{path('checkout')}">
                    <select class="form-select form-select-lg mb-3" aria-label=".form-select-lg example" name="resa" action="">
    {# {% for dispo in dispos %}  #}  
                            <option>{{dispo.debut|format_datetime()}} -{{dispo.lieu}}</option> 
    {# {% endfor %} #}                
                    </select> 
                    <input type="submit" class="btn envoyer" value="Valider">
            </form>
    
        </div>
    </section>
    {% endblock %}




    <

    Voici mon controller : 

    <?php
    
    namespace App\Controller;
    use App\Entity\Coachs;
    use App\Repository\CoachsRepository;
    use App\Entity\Reservation;
    use App\Entity\Disponibilite;
    use App\Repository\DisponibiliteRepository;
    use App\Repository\ReservationRepository;
    use Doctrine\ORM\Mapping\Id;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    
    class HomeController extends AbstractController
    {
        #[Route('/home', name: 'home')]
        public function index(): Response
        {
            $coachs = $this->getDoctrine()->getRepository(Coachs::class)->findAll();
            return $this->render('home/index.html.twig', [
                'coachs' => $coachs,
            ]);
        }
        #[Route('/', name: 'index')]
        public function coachs(CoachsRepository $coachsRepository): Response
        {
            $coachs = $this->getDoctrine()->getRepository(Coachs::class)->findAll();
            $id = $this->getDoctrine()->getRepository(Coachs::class)->findOneBy([]);
    
            return $this->render('home/index.html.twig', 
                compact('coachs'),
            );
        }
    
        #[Route('/detail_coach/{id}', name: 'detail_coach')]
        public function detail_coach($id): Response
        {
            $repo = $this->getDoctrine()->getRepository(Coachs::class);
            $coach = $repo->find($id);
    
            return $this->render('detail_coach.html.twig', [
                'coach' => $coach,
            ]);
        }
    
    
        #[Route('/page_user', name: 'page_user')]
        public function page_user(ReservationRepository $reservationRepository): Response
        {
            $resas = $this->getDoctrine()->getRepository(Reservation::class)->findAll();
            $id = $this->getDoctrine()->getRepository(Reservation::class)->findOneBy([]);
    
            return $this->render('page_user.html.twig', [
                'resas' => $resas,
                'id' => $id,
            ]);
        }
    
        #[Route('/login', name: 'login')]
        public function login(): Response
        {
            return $this->render('login.html.twig', [
                'controller_name' => 'HomeController',
            ]);
        }
    
        #[Route('/pol_confidential', name: 'pol_confidential')]
        public function pol_confidential(): Response
        {
            return $this->render('pol_confidential.html.twig', [
                'controller_name' => 'HomeController',
            ]);
        }
    
        #[Route('/detail_coach/{id}/reservation', name: 'reservation')]
        public function resa( ReservationRepository $reservationRepository, DisponibiliteRepository $disponibiliteRepository, $coach_id): Response
        {
            $resas = $this->getDoctrine()->getRepository(Reservation::class)->findAll();
            $dispos = $this->getDoctrine()->getRepository(Disponibilite::class)->findAll();
            $repo = $this->getDoctrine()->getRepository(Disponibilite::class);
            $dispo = $repo->find($coach_id);
            $id = $this->getDoctrine()->getRepository(Disponibilite::class)->findOneBy([]);
    
            return $this->render('reservation.html.twig', [
                'dispos' => $dispos,
                'dispo' =>$dispo
            ]);
        }
        #[Route('/detail_coach/{id}/reservation', name: 'reservation')]
        public function formResa(Request $request, ReservationRepository $reservationRepository, DisponibiliteRepository $disponibiliteRepository)
        {
            $form = $this->createForm(ReservationType::class);
            $form->handleRequest($request);
            return $this->render('/Stripe/checkout.html.twig', [
            ]);
        }
        #[Route('/contact', name: 'contact')]
        public function contact(Request $request,\Swift_Mailer $mailer)
        {
            $form = $this->createForm(ContactType::class);
            $form->handleRequest($request);
    
            if ($form->isSubmitted() && $form->isValid()) {
                $contact = $form->getData();
    
                // On crée le message
                $message = (new \Swift_Message('Nouveau message'))
                    // On attribue l'expéditeur
                    ->setFrom($contact['email'])
                    // On attribue le destinataire
                    ->setTo('clubatheon@gmail.com')
                    // On crée le texte dans la vue
                    ->setBody(
                        $this->renderView(
                            'contact.html.twig', compact('contact')
                        ),
                        'text/html'
                    )
                ;
                $mailer->send($message);
    
                $this->addFlash('message', 'Votre message a été transmis, nous vous répondrons dans les meilleurs délais.'); //message flash de renvoi
            }
            return $this->render('contact.html.twig',['contactForm' => $form->createView()]);
        }
    }



    -
    Edité par FrançoisQuelier 6 octobre 2021 à 12:50:01

    • Partager sur Facebook
    • Partager sur Twitter
      6 octobre 2021 à 12:36:46

      Salut,

      Ton code est illisible, utilise </> pour l'insérer

      • Partager sur Facebook
      • Partager sur Twitter
      le bienfait n'est jamais perdu
        6 octobre 2021 à 12:45:47

        Au temps pour moi, c'est corrigé ! merci :)
        • Partager sur Facebook
        • Partager sur Twitter
          6 octobre 2021 à 13:03:42

          Je dirais qu'il manque la valeur de l'id du coach dans ce qui correspond à  path('checkout')
          • Partager sur Facebook
          • Partager sur Twitter
            6 octobre 2021 à 14:17:31

            #[Route('/detail_coach/{id}/reservation', name: 'reservation')]
                public function resa( ReservationRepository $reservationRepository, DisponibiliteRepository $disponibiliteRepository, $coach_id): Response
                {
                    $resas = $this->getDoctrine()->getRepository(Reservation::class)->findAll();
                    $dispos = $this->getDoctrine()->getRepository(Disponibilite::class)->findAll();
                    $repo = $this->getDoctrine()->getRepository(Disponibilite::class);
                    $dispo = $repo->find($coach_id);
                    $id = $this->getDoctrine()->getRepository(Disponibilite::class)->findOneBy([]);
             
                    return $this->render('reservation.html.twig', [
                        'dispos' => $dispos,
                        'dispo' =>$dispo
                    ]);
            C'est par ici que ça me pose problème je crois. le path('checkout') c'est à l'étape d'après, a la validation du form
            • Partager sur Facebook
            • Partager sur Twitter
              6 octobre 2021 à 14:40:08

              c'est dans la page qui appelle l'affichage de cette page qui ne fournit pas le $coach_id.

              En fait, en renommant ta variable $coach_id en $id dans ta déclaration de resa, ça devrait marcher (et en la renommant dans le corps de la fonction aussi)

              public function resa( ReservationRepository $reservationRepository, DisponibiliteRepository $disponibiliteRepository, $id): Response



              -
              Edité par umfred 6 octobre 2021 à 14:44:46

              • Partager sur Facebook
              • Partager sur Twitter
                6 octobre 2021 à 15:38:57

                Quand je mets juste $id ça me renvoie que la résa n°1 (normal, id étant la clé primaire dans cette table) alors que ce que moi je veux renvoyer toutes les résa liées à un coach (d'où coach_id, qui est ma clé étrangère qui relie la table dispos, et la table des coachs), mais ça ne marche pas. Il y a rien de particulier a faire quand c'est une clé étrangère ? Si ?
                • Partager sur Facebook
                • Partager sur Twitter
                  6 octobre 2021 à 15:53:38

                  dans ta route '/detail_coach/{id}/reservation' , le {id} correspond bien à ton coach_id en principe, non ? en tout cas, ça serai la logique (selon moi)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 octobre 2021 à 16:21:08

                    OuI c'est bien ça, mais dans '/detail_coach/{id} on est encore sur la table coach donc oui l'id corresponds bien au coach, mais quand on passe sur /reservation c'est la table 'disponibility' avec un id de réservation, et un coach_id pour la jointure.  

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Symfony 5] Problème variable à la vue

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown