Набор шаблонов: оценка шаблонных инструкций внутри блока-оболочки?

#template-toolkit

#template-toolkit

Вопрос:

Хорошо, я просматривал руководство уже более двух часов, также пытался найти решение в книге badger, но не смог придумать ничего, что работало бы.

Ниже приведена оболочка ( body.tt ), ну, вы поняли идею:

 [%- PROCESS 'const.tt' -%]
<?xml version="1.0" encoding="utf-8"?>
Loads of HTML
[%- content -%]
More HTML
  

Обернутые шаблоны выглядят следующим образом:

 [% WRAPPER 'body.tt' %]
Other HTML
[%- bar -%]
More other HTML
[% END %]
  

И, наконец, const.tt выглядит так:

 [% bar = 'foo' %]
  

… и по какой-то причине экземпляр bar внутри обернутого шаблона не оценивается. Есть какие-нибудь идеи, как я мог бы это оценить?

Я пытался:

 [%- content | eval -%]
  

… который не сработал.

Обратите внимание, что в обернутом шаблоне (2-й блок выше) Я хочу иметь возможность вычислять переменную bar из const.tt без необходимости добавлять другую PROCESS 'const.tt' к этому шаблону. В конце концов, переменная должна быть доступна с body.tt .

И я забыл упомянуть: Template Toolkit версии 2.22

Ответ №1:

Вот почему то, что вы пробовали, не работает.

Как http://template-toolkit.org/docs/manual/Directives.html#section_WRAPPER объясняет, что сначала оценивается ваше обернутое содержимое, а затем body.tt обрабатывается с помощью уже оцененного шаблона, переданного как content . Следовательно, content выполняется до content.tt загрузки.

Тем не менее, есть способ сделать это, но это немного некрасиво. Вот ваш контент:

 %- PROCESS 'body.tt' -%]
[%- WRAPPER body -%]
Other HTML
[%- bar -%]
More other HTML
[% END %]
  

Вот body.tt :

 [%- PROCESS 'content.tt' -%]
[% BLOCK body -%]
<?xml version="1.0" encoding="utf-8"?>
Loads of HTML
[%- content -%]
More HTML
[% END -%]
  

И content.tt не изменилось:

 [% bar = 'foo' %]
  

Пока это работает, я не даю никаких обещаний относительно здравомыслия человека, который должен поддерживать его позже.

Комментарии:

1. прежде всего, спасибо за объяснение. 1. Поскольку это доказывает, что нет способа заставить это работать, я также присужду вам награду и соглашусь.