[Symfony2] Transmettre un tableau du controller vers la view

Eléphanteau du PHP | 25 Messages

01 mars 2012, 12:00

Bonjour,

J'ai un petit soucis pour transmettre mes données a mes views.

Un peu de code sera le bienvenu pour l'explication:
for($cpt=0;$cpt!=$resultCount;$cpt++)
       {
            //echo $resultId[$cpt]['livreIdlivre'];// Affichage de l'id du livre.
       
            //Requete pour trouver le titre du livre.
            $req=$this->getDoctrine()->getEntityManager()->createQuery("SELECT c.titre FROM LGBBourseLivresBundle:Livre c WHERE c.idlivre=".$resultId[$cpt]['livreIdlivre']);
            $resultLivre=$req->getResult();//On récupère le titre du livre en question.
            
            $titre=array(NULL);// On déclare un tableau vide.

            // On boucle pour remplir le tableau afin d'isoler chaques titres de livre.
            foreach ($resultLivre as $titre) 
            {
                $titreLivre[$cpt]=$titre['titre'];
            }
            
            //echo $titreLivre[$cpt]; Affichage du titre du livre.
        }
Ici je récupère tout les titres de mes livres dans un tableau.

Ensuite je les envoie de la façon suivante:
return $this->container->get('templating')->renderResponse('LGBBourseLivresBundle:Rachat:facture.html.twig', array('Eleve'=> $eleve , 'Titre'=>$resultLivre));
Ensuite j'éssais de les appeler dans ma view pour voir le résultat:
{% for titre in Titre%}
	<tr>
		<td>{{ titre.titre}}</td>
	</tr>
{% endfor %}
Et la c'est le drame! Je n'ai que le dernier résultât de mon tableau. Avez vous un moyen afin que j'ai chacune de mes cases dans ma view?

C'est surement un truck tout bête mais je coince complétement là.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

01 mars 2012, 13:01

Alors, pour commencer, quelques conseils de débug :
Est-ce que c'est un soucis de rendu ?
A priori non, puisque des données s'affichent

Est-ce que les données sont bonnes ?
Ah, on ne sais pas. Ok, on va donc regarder ça.

Où sont récupérées les données ?
A la sortie de mon for.
Ok, faisons un var_dump() pour voir la tronche de mon tableau.
for($cpt=0;$cpt!=$resultCount;$cpt++)
{
    // Ici, tout ton code
}

var_dump($titreLivre)
Est-ce que ce résultat correspond à ce que j'attends ?
A toi de répondre ;)


Je viens de t'exposer la bonne méthodologie pour résoudre un soucis de ce genre. Car dans ton explication, tu mélanges tout, et tu imagines que le soucis est à un endroit, alors que ce n'est peut-être pas le cas.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 25 Messages

01 mars 2012, 15:16

Désolé si ce que je fais est un peu brouillon.

On avait seulement 2-3 semaines afin de prendre en main symfony, donc c'est un peu difficile de tout comprendre:

Avec le var_dump je vois bien ce que je souhaite.

A chaque passage de boucle la tableau se remplit avec un livre en plus.

Code : Tout sélectionner

array 0 => string 'MATHS Term STI' (length=14) array 0 => string 'MATHS Term STI' (length=14) 1 => string 'PHYSIQUE APPLIQUEE Term. STI - Genie mecanique' (length=46) array 0 => string 'MATHS Term STI' (length=14) 1 => string 'PHYSIQUE APPLIQUEE Term. STI - Genie mecanique' (length=46) 2 => string 'GUIDE PRATIQUE DES SCIENCES ET TECHNOLOGIES INDUSTRIELLES ed 2009' (length=65) array 0 => string 'MATHS Term STI' (length=14) 1 => string 'PHYSIQUE APPLIQUEE Term. STI - Genie mecanique' (length=46) 2 => string 'GUIDE PRATIQUE DES SCIENCES ET TECHNOLOGIES INDUSTRIELLES ed 2009' (length=65) 3 => string 'BROADWAYS, Anglais Term. LV2 et sections techno' (length=47) array 0 => string 'MATHS Term STI' (length=14) 1 => string 'PHYSIQUE APPLIQUEE Term. STI - Genie mecanique' (length=46) 2 => string 'GUIDE PRATIQUE DES SCIENCES ET TECHNOLOGIES INDUSTRIELLES ed 2009' (length=65) 3 => string 'BROADWAYS, Anglais Term. LV2 et sections techno' (length=47) 4 => string 'PHILOSOPHIE series technologiques' (length=33)
J'ai aussi modifié mon return car j'ai vue ou était un de mes problèmes:

return $this->container->get('templating')->renderResponse('LGBBourseLivresBundle:Rachat:facture.html.twig', array('Eleve'=> $eleve , 'Titre'=>$titreLivre));

J'ai placé mon tableau dans le return a la place du résultât de ma requete.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

01 mars 2012, 15:35

Okay, il est donc sur que c'est Twig qui plante alors.

Alors, je me demande si Twig ne serait pas perturbé par toutes tes variables qui s'appellent "Titre" : le tableau que tu passes à Twig, l'élément itératif et la clé du tableau.

Essaye de renommer ta variable "Titre" en "titres" (liste des titres)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 25 Messages

01 mars 2012, 16:01

C'est choses faites, j'avais déjà essayer cette méthode mais ça me retourne une erreur. De plus je n'arrive pas a la résoudre.
Item "titre" for "MATHS Term STI" does not exist in LGBBourseLivresBundle:Rachat:facture.html.twig at line 11
{% for titreLivre in Titre%}
	<tr>
		<td>{{ titreLivre.titre}}</td>
	</tr>
{% endfor %}
J'en deduis donc que c'est le titre de : titreLivre.titre qu'il ne trouve pas.

Mais ce que je ne comprends pas, c'est que il ne trouve pas 'titre' mais il arrive quand même a communiquer avec mon controller vue qu'il affiche quand même la première valeur du tableau dans son erreur. Ou alors c'est que je n'ai pas compris comment communiquait le controller et les views.

En tout cas merci pour ton aide et tes conseils. C'est exactement ce que je recherche ... Des explications et des méthodes :D

Bon j'ai éssayé quelques choses pensant que ça pourrait venir de la mais ça n'a pas avancer, je mets tout de même la suite:
foreach ($resultLivre as $titre) 
            {
                $titreLivre['titre'.$cpt]=$titre['titre'];
            }
J'ai donné un titre a ma case de tableau.

Eléphanteau du PHP | 25 Messages

01 mars 2012, 18:46

Problème /* partiellement */ résolu:

/* je n'ai plus l’erreur :D mais ce n'ai plus stocké dans un tableau pour la vue :( */

Je n'ai plus d'érreur et plus besoin d'y mettre dans un tableau
Solution:
{% for titreLivre in Titre %}
	<li>{{ titreLivre }}</li>
{% endfor %} 
Rendus:

Nom Prenom ID

MATHS Term STI
PHYSIQUE APPLIQUEE Term. STI - Genie mecanique
GUIDE PRATIQUE DES SCIENCES ET TECHNOLOGIES INDUSTRIELLES ed 2009
BROADWAYS, Anglais Term. LV2 et sections techno
PHILOSOPHIE series technologiques