Partage
  • Partager sur Facebook
  • Partager sur Twitter

Php dans Twig pour faire une condition ?

Symfony 4 et Twig

Sujet résolu
8 octobre 2019 à 14:39:28

ElodieMartin13 a écrit:

Ok, donc je fais ma requête dans le controller, dans mon if et avant le manager->persist(loc), c'est bien celà ?

C'est à ça que je pensais, oui.

-
Edité par Ymox 8 octobre 2019 à 14:40:16

  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2019 à 17:35:07

Ok, alors du coup dans baliseRepository je fais ma requête :

public function chooseBaliseForLoc ($idLoueur) {
        
        $query = $this->createQueryBuilder('bal'); 
        $query  -> select('PARTIAL bal.{id, loueur_id}')
                -> where($query->expr()->eq('bal.fonctionnel', $query->expr()->literal(true)))
                -> andWhere('bal.loueur_id', $idLoueur)
                -> setParameter ('idLoueur', $idLoueur);
        $results = $query -> getQuery() -> getResult();
       
         // returns an array of Product objects
        return $results;
    }

Que j'appel dans mon controller :

  /**
     * @Route("/loc", name="loc")
     * @param \integer[] $idLoueur
     */
    public function form(Location $loc = null, $idLoueur = null, Request $request, ObjectManager $manager) {
        
        dump($request);
       
        $loc = new Location();

        $form = $this -> createForm(LocationType::class, $loc);
        $form -> handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            chooseBaliseForLoc($idLoueur);

            $manager->persist($loc);
            $manager->flush();

            return $this->redirectToRoute('index');
        }

        return $this->render('loc/index.html.twig', [
            'controller_name' => 'LocController',
            'formLoc' => $form->createView(),
          
        ]);
    }

Je ne suis pas certaine de l'ecriture de @param
Et comment je fais passer mon this.value à mon controller :

 var rad = document.getElementsByName("location[loueur]");
                //console.log(rad);
                var prev = null;
                for (var i = 0; i < rad.length; i++) {
                    rad[i].addEventListener('click', function() {
                        (prev) ? console.log(prev.value): null;
                        if (this !== prev) {
                            prev = this;
                        }
                        document.getElementById("location_loueur").innerHTML = '<option value=' + this.value + '>' + this.value + '<option>';
                        document.getElementById("location_loueur").value = this.value;
                        //console.log(this.value)    
                    });

Dois-je utiliser une route comme celle-ci :

 doc.open("GET", "/loc/form/" + idLoueur, false);






-
Edité par ElodieMartin13 9 octobre 2019 à 14:36:15

  • Partager sur Facebook
  • Partager sur Twitter
8 octobre 2019 à 18:46:41

L'ID du loueur, tu l'as directement depuis l'objet Location dans $loc après le test de validité du formulaire  ^^
En fait, il nous faudra probablement l'entier de l'objet, ce qui ne change pas grand chose au final, vu que pour avoir l'ID du loueur, on aurait dû passer par l'objet loueur lié à la location…

Attention, dans ta requête, il faudra aussi avoir les paramètres de date, sans quoi tu vas avoir des réservations multiples pour les mêmes dates. J'avais bien dit que ce serait presque la même que dans l'autre sujet, mais qu'il n'y aurait plus de regroupement et qu'il y aurait le loueur en paramètre. La seule chose à laquelle je n'avais pas pensé, c'est qu'il faudra quand-même adapter pour que cette requête retourne bien les balises et non plus les loueurs, mais ce ne devrait être qu'une jointure de moins dans la requête.

-
Edité par Ymox 8 octobre 2019 à 18:47:08

  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2019 à 14:35:12

Ma requete :

  public function chooseBaliseForLoc ($idLoueur, $dateDebutLoc, $dateFinLoc) {
        
        $query = $this->createQueryBuilder('bal'); 
        $query  -> select('PARTIAL bal.{id, loueur_id}')
                -> leftJoin('bal.locations',
                'loc',
                \Doctrine\ORM\Query\Expr\Join::WITH,
                    $query->expr()->orX(
                        $query->expr()->between(':dateDebutLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'),
                        $query->expr()->between(':dateFinLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc')
                    ))
                -> where($query->expr()->eq('bal.fonctionnel', $query->expr()->literal(true)))
                -> andWhere($query->expr()->isNull('loc.dateDebutLoc'))
                -> andWhere('bal.loueur_id', $idLoueur)
                -> setParameter ('idLoueur', $idLoueur)
                -> setParameter ('dateDebutLoc', $dateDebutLoc)
                -> setParameter ('dateFinLoc', $dateFinLoc);
        $results = $query -> getQuery() -> getResult();
       
         // returns an array of Product objects
        return $results;
    }

Mon Controller :

public function form(Location $loc = null, Request $request, ObjectManager $manager) {
        
        dump($request);
       
        $loc = new Location();

        $form = $this -> createForm(LocationType::class, $loc);
        $form -> handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $idLoueur = $loc -> loueur_id;
            $dateDebutLoc = $loc -> date_debut_loc; 
            $dateFinLoc = $loc -> date_fin_loc ;
            $nbLoue = $loc -> nb_loue;
            $idBalise = $loc -> id;

            chooseBaliseForLoc($idLoueur, $dateDebutLoc, $dateFinLoc);

            for ($i = $nbLoue; i < $idBalise.length; $i++) {
                
            }

            $manager->persist($loc);
            $manager->flush();

            return $this->redirectToRoute('index');
        }

        return $this->render('loc/index.html.twig', [
            'controller_name' => 'LocController',
            'formLoc' => $form->createView(),
          
        ]);
    }


Et maintenant ?

-
Edité par ElodieMartin13 9 octobre 2019 à 14:36:51

  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2019 à 16:08:57

Ben tu ajoutes les balises à la location. Il me semble que c'était ce qu'on souhaitait faire : dire exactement quelles balises sont louées.

Je me trompe ?

  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2019 à 16:52:55

Oui c'est exactement ce que je souhaite faire sauf que le résultat n'est pas là.

EDIT :

if ($form->isSubmitted() && $form->isValid()) {
            dump($loc);
            $idLoueur = $loc -> getLoueur() -> getId();
            $dateDebutLoc = $loc -> getDateDebutLoc(); 
            $dateFinLoc = $loc -> getDateFinLoc() ;
            $nbLoue = $loc -> getNbLoue();
           
            $listeBalises = $repo -> chooseBaliseForLoc ($idLoueur, $dateDebutLoc, $dateFinLoc);
            
            for ($i = $nbLoue; i < $listeBalises.length; $i++) {

            }

            $manager->persist($loc);
            $manager->flush();

            return $this->redirectToRoute('index');
        }

Message d'erreur :

Warning: get_class() expects parameter 1 to be object, integer given


Je ne comprends pas pourquoi il me dit que le premier paramètre de ma requête doit être un objet...



-
Edité par ElodieMartin13 10 octobre 2019 à 11:44:15

  • Partager sur Facebook
  • Partager sur Twitter
9 octobre 2019 à 23:54:41

Avec ce que j'ai, la ligne 14 du code de ta nouvelle requête n'est pas correcte, mais comme tu as avancé entre temps, il faudrait que j'aie la dernière version. L'erreur que tu mentionnes ne me paraît pas coïncider avec ce que je vois.

La ligne 10 de ton action maintenant, ça ne va pas le faire. Tu y fais une boucle qui commence au nombre de balises louées jusqu'au nombre de balises disponibles pour le loueur choisi. Mettons qu'on veuille louer 6 balises et que le loueur en a 10 de libres, tu ne vas en louer effectivement que de 6 (compris) à 10 (non compris), donc 4. Ceci sans parler du problème de syntaxe pour déterminer le nombre de balises effectivement disponible pour le loueur choisi : l'opérateur ., c'est pour une concaténation, pas pour accéder à une méthode/propriété comme en JavaScript  ;)

La boucle devrait simplement te permettre de lier — et ce autant de fois que voulu pour la location, donc de 0 à $nbDialLoue — une balise parmi celles récupérées juste avant la boucle à la location.

Note que tu n'as probablement pas besoin de variables intermédiaires, tu peux utiliser $loc->get*() directement comme paramètres de ta méthode chooseBaliseForLoc() et à la place de $listeBalises.length.

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2019 à 10:48:17

Voici ma nouvelle requête, mais comme je ne pense pas y avoir touché, la ligne 14 (donc mon andWhere sur loueur_id) ne doit toujours pas être correcte :

Je dois bien faire un tri sur l'id du Loueur, non ? A moins que ce ne soit la syntaxe qui ne soit pas bonne...

public function chooseBaliseForLoc ($idLoueur, $dateDebutLoc, $dateFinLoc) {
        
        $query = $this->createQueryBuilder('bal'); 
        $query  -> select('PARTIAL bal.{id, loueur_id}')
                -> leftJoin('bal.locations',
                'loc',
                \Doctrine\ORM\Query\Expr\Join::WITH,
                    $query->expr()->orX(
                        $query->expr()->between(':dateDebutLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc'),
                        $query->expr()->between(':dateFinLoc', 'loc.dateDebutLoc', 'loc.dateFinLoc')
                    ))
                -> where($query->expr()->eq('bal.fonctionnel', $query->expr()->literal(true)))
                -> andWhere($query->expr()->isNull('loc.dateDebutLoc'))
                -> andWhere('bal.loueur_id', $idLoueur)
                -> setParameter ('idLoueur', $idLoueur)
                -> setParameter ('dateDebutLoc', $dateDebutLoc)
                -> setParameter ('dateFinLoc', $dateFinLoc);
        $results = $query -> getQuery() -> getResult();
       
         // returns an array of Product objects
        return $results;
    }

EDIT :

Voici mon action :

 if ($form->isSubmitted() && $form->isValid()) {
            //dump($loc);
            $idLoueur = $loc -> getLoueur() -> getId();
            $dateDebutLoc = $loc -> getDateDebutLoc() -> format('Y-m-d'); 
            dump($dateDebutLoc);
            $dateFinLoc = $loc -> getDateFinLoc() -> format('Y-m-d');
            dump($dateFinLoc);
            $nbLoue = $loc -> getNbLoue();
           
            $listeBalises = $repo -> chooseBaliseForLoc ($idLoueur, $dateDebutLoc, $dateFinLoc);
            dump($listeBalises);
            die();
            
            for ($i = 0; $i < $nbLoue; $i++) {
                $balise = $listeBalises[$i] -> getId();

            }

            $manager->persist($loc);
            $manager->flush();

            return $this->redirectToRoute('index');
        }

J'ai bien noté que je n'avais pas besoin de paramètres intermédiaires sauf que si ma syntaxe est bonne, je prefererais rester ainsi. Je comprends que tu fais un get() sur tous les paramètres de $loc mais je suis plus à l'aise ainsi.



-
Edité par ElodieMartin13 10 octobre 2019 à 11:43:55

  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2019 à 13:47:48

Alors pour la requête, trois points.

  1. A la ligne 14, tu as une contrainte d'égalité sur une colonne de base de données, alors que Doctrine ORM te demande une propriété d'entité. C'est bal.loueur, la propriété loueur_id n'existant pas dans ce que tu peux manipuler.
  2. Toujours à la ligne 14, tu donnes deux paramètres à andWhere(). Je pense que c'est accepté, mais que ça ne fonctionne pas comme tu t'y attendrais. Il faudrait que l'argument soit du même style que ce qu'il y a ligne 12 avec eq(), et le second paramètre peut rester un simple marqueur, vu que tu lies la valeur à la ligne 15.
  3. Conséquence du premier point, il faut que tu passes l'entier de l'objet Loueur de ta location à ta méthode, et pas juste son ID. Comme tu vas dire que bal.loueur est égal à quelque chose et que tu ne peux pas dire qu'un objet Loueur est égal à son ID, c'est la raison de ce changement.

Pour l'action maintenant.

  1. Actuellement, tu ne fais que mettre un ID dans une variable que tu écrases à chaque boucle… Il faut vraiment que tu ajoutes la balise (et pas juste son ID) à la location, donc quelque chose comme $loc->addBalise($listeBalises[$i]) — et là, je viens de te mâcher et même pré-digérer le travail.
  • Partager sur Facebook
  • Partager sur Twitter
10 octobre 2019 à 14:36:45

Merci tout fonctionne nickel !!! oufff !!!
  • Partager sur Facebook
  • Partager sur Twitter