2012-11-01 3 views
4

J'utilise un toolkit de template pour former une simple réponse JSON (voir le code ci-dessous). Je dois mettre une virgule après tous les éléments de la réponse sauf le dernier. Je crois que je dois utiliser l'itérateur TTs, mais je ne comprends pas bien.
Avec ce code, une virgule est toujours imprimée à la fin du dernier élément.Template Toolkit, test de la dernière itération dans une boucle imbriquée

Le problème réside dans la section qui contient

[% UNLESS outer.last && loop.last %],[% END %] 

cela devrait ajouter une virgule à moins que les boucles extérieures et intérieures sont sur leur dernière itération.

Toute aide sur ce que je me trompe grandement apprécié.

{ "success": true, "filesdata": [ 
[%~ USE outer = iterator(objects); FOREACH object IN outer; 
    FOREACH rep IN object.reps; 
     IF rep.rep == reptype %] 
{ "id":"[% object.id | xml %]", "url":"[% rep.src | xml %]", "story":"[% object.story | xml %]" }[% UNLESS outer.last && loop.last %],[% END %] 
     [%~ END; 
    END; 
END ~%] 
] } 

Répondre

5

Avez-vous essayé d'utiliser le vmethod de jointure? Vous pouvez créer une liste et s'y joindre par une virgule:

[% items.join(', ') %] 

Cela dit, vous pouvez également regarder Template::Plugin::SimpleJson. Vous pouvez créer un hachage, puis le passer à ce plugin. Quelle que soit la façon dont vous décidez de le faire, vous ne voudrez probablement pas vous soucier de citer votre fichier JSON dans le fichier modèle réel et l'utilisation de quelque chose comme ceci pourrait vous faire économiser un peu de chagrin sur toute la ligne.

Vous avez également la possibilité de créer le JSON en dehors du modèle lui-même, mais cela ne correspond pas à votre question.

+0

Je répète ce que oalders dit au sujet de l'aide d'un plug-in. Personnellement, j'aime Template :: Plugin :: JSON :: Escape, mais l'important est d'éviter la génération de code à la main. Vous augmentez considérablement le risque d'une condition/valeur inattendue provoquant l'explosion de votre modèle au moment de l'exécution. – RET

6

Cela fonctionne pour moi:

[% IF loop.last %]}[% ELSE %]},[% END %] 
Questions connexes