Template Toolkit, проверка последней итерации во вложенном цикле

Я использую инструментарий шаблона для формирования простого ответа JSON (см. код ниже). Мне нужно поставить запятую после всех элементов ответа, кроме последнего.

Я считаю, что мне нужно использовать итератор TT, однако я не понимаю его правильно.
В этом коде запятая все еще печатается в конце последнего элемента.

Проблема заключается в разделе, который содержит

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

это должно добавить запятую, если только внешний и внутренний циклы не находятся на последней итерации.

Любая помощь в том, что я ошибаюсь, очень ценится.

{ "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 ~%]
] }

person mark    schedule 01.11.2012    source источник


Ответы (2)


Вы пробовали использовать метод join v? Вы можете создать список и соединить его запятой:

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

Сказав это, вы также можете взглянуть на Template::Plugin::SimpleJson. Вы можете создать хэш, а затем передать его этому плагину. Как бы вы ни решили это сделать, вы, вероятно, не хотите беспокоиться о цитировании вашего JSON в фактическом файле шаблона, и использование чего-то подобного может избавить вас от душевной боли в будущем.

Также есть возможность создать JSON вне самого шаблона, но это выходит за рамки вашего вопроса.

person oalders    schedule 01.11.2012
comment
Я хотел бы повторить то, что сказал Оалдерс об использовании плагина. Лично мне нравится Template::Plugin::JSON::Escape, но важно избегать ручной генерации кода. Вы значительно увеличиваете риск того, что неожиданное условие/значение приведет к взрыву вашего шаблона во время выполнения. - person RET; 02.11.2012

Это работает для меня:

[% IF loop.last %]}[% ELSE %]},[% END %]
person Twistar    schedule 15.11.2012