[Opened] Double foreach dans un template
Posted by Mindiell on 05/27/2011 13:54
Voilà,
Je suis en train de programmer une appli pour m'entrainer encore et encore. Et j'ai une petite question: en sql, je peux sélectionner les parents et les enfants (des obejts quelconques) et renvoyer la liste, dans laquelle je suis capable de savoir qui est enfant et qui est parent.
Ma question est la suivante: Dans le template, puis-je imbriquer deux foreach attaquant la même liste ? Le premier ne s'occuperait que des parents, et le second des enfants...
En attendant, je fournis deux listes : $parents et $enfants, et j'affiche les enfants uniquement si leur parent est le parent en cours.
Mindiell
[Opened] Double foreach dans un template
Posted by muirgen on 05/27/2011 15:16
Salut,
J'ai eu la même question que toi il y a quelques temps, faire une imbrications de deux foreach mais cela ne fonctionnait pas, du fait que le premier foreach était en quelque sorte écrasé par le second. Le test je l'avais fait en version 1.1 de Jelix, peut être que depuis tu peux le faire sans problème.
N'ayant pas fait le test, et pour éviter de reperdre du temps sur ce type de besoin, ce que j'ai fait c'est un appel en requete de résultat pour mon premier foreach dans le template, ensuite pour les secondes données à récupéré, j'ai fait une classe qui permet de récupérer un tableau des infos que je veux avec comme index l'id de ma requête principale.
du coup quand je récupère en template :
<table> {foreach $data as $data} <tr><td>{$data->NOM}</td><td>{$tbloptions[[$data->ID]]}</td></tr> {/foreach} </table>
Voila, après ce n'est qu'un exemple, il y a peut être plus simple, mais je trouve que finalement c'est assez propre puisque tout est traité dans le controller ou la zone et ensuite c'est assez propre aussi au niveau du deploiement dans le template.
[Opened] Double foreach dans un template
Posted by Mindiell on 05/27/2011 16:33
Donc, ton tbloptions est rechargé à chaque foreach ?
Si c'est le cas, je trouve cela un peu moche moche :)
Perso, j'ai fait la même chose, mais en envoyant deux listes, utilisées par deux foreach. Le second foreach fait un if à chaque fois (dans le template) pour vérifier que le fils (ou l'option) est lié au parent :
{foreach $objects as $object} <tr class="row"> <code> <td class="object"> <div class="informations"> <a href="#" class="title">{$object->name}</a> <span class="forum_description">{$object->description}</span> <span class="subobject">Enfants :</span><ul class="subforums">
{foreach $subobjects as $subobject} {if $subobject->parent_id=$object->id}
<li><a href="#"><span class="subobject">{$subobject->name}</span></a></li>
{/if} {/foreach}
</ul> </div> </td></tr> </code>
Ainsi, je ne fais que deux requêtes sql, la deuxième contenant "un peu trop" de résultats (mais juste ce qu'il faut tout de même), et je ne fais que boucler dans mon tableau un peu plus souvent. Ca reste plus léger à mon avis...
Merci de ta réponse en tout cas, au début je croyais que Jelix allait me permettre de tout faire les yeux fermés et un bras en moins, mais il faut quand même bosser un peu en fait :D
Mindiell
[Opened] Double foreach dans un template
Posted by muirgen on 05/27/2011 17:08
Donc, ton tbloptions est rechargé à chaque foreach ?
eeeuuu oui, mais je boucle pas deux fois avec deux foreach ... pas d'imbrications de deux boucles.
Après c'est peut être plus lourd, je ne sais pas trop.
A voir avec d'autres propositions.
[Opened] Double foreach dans un template
Posted by Mindiell on 05/30/2011 10:24
Perso, j'ai pris cette option pour éviter de ré-attaquer la base de données plusieurs fois, ce qui, à mon sens, engendre plus de consommation de ressources. Dans mon cas, on ne fait que tourner dans un tableau un peu plus gros, mais fini.
Mindiell
[Opened] Double foreach dans un template
Posted by laurentj on 05/30/2011 17:51
en général, une seule requête suffit. Il suffit d'ordonner les résultats selon le parent, et ensuite, dans la boucle de tester quand le parent change pour faire ce qui est spécifique au parent.
[Opened] Double foreach dans un template
Posted by Mindiell on 05/30/2011 21:05
Euh, une seule requête suffit pour tout afficher ou pour afficher les enfants de tous les parents ? En même temps, les templates semblent assez puissants, je regarderai demain ce que je peux améliorer. On est d'accord qu'il vaut mieux jouer dans le template que de faire plusieurs requêtes ?
Mindiell
[Opened] Double foreach dans un template
Posted by laurentj on 05/31/2011 08:28
ce n'est pas une histoire de puissance des templates, mais c'est une histoire d'algorithmie, ou même la base de la programmation SQL..
[Opened] Double foreach dans un template
Posted by Mindiell on 05/31/2011 10:46
On est d'accord, seulement dans mon cas, les enfants sont à afficher au milieu du parent. Ce qui m'oblige à faire deux foreach avec deux requêtes SQL. Il y a peut-être possibilité de tout faire en une seule fois (possible en SQL, mais difficile au niveau template), mais je ne vias pas perdre de temps là-dessus pour le moment.
L'optimisation viendra après ;)
Mindiell
[Opened] Double foreach dans un template
Posted by laurentj on 05/31/2011 11:14
les enfants sont à afficher au milieu du parent
Je ne vois pas où est le problème...