tal:define

Этот атрибут объявляет одну или более переменных, которые затем могут быть использованы в шаблоне.

Объявление переменной, содержащей длинный путь:

<span tal:define="global destname path/to/existing/variable" />

Объявление строки внутри шаблона:

<span tal:define="global destname string:some string" />

Объявление нескольких переменных одновременно:

<span tal:define="global fname string:paul; lname string:dupond" />

Объявление переменной с использованием другой переменной:

<span tal:define="global hello string:hello $fname welcome on this page" />

И маленький трюк с использованием буфера вывода:

<span tal:define="global hello">hello ${fname} welcome on this page</span>

tal:define можно и удобно использовать вместе с другими атрибутами, но он всегда будет обработан первым.

В предпоследнем примере (объявление переменной с использованием другой переменной) тег span не будет отображен, т.к. он и сам пустой, и не содержит tal атрибутов, которые бы назначели его содержание. Даже в последнем примере текст из span не будет показан, т.к. переменная 'hello' его "съедает" (подменяет своим пустым значением)

Но вот другой пример:

<span tal:define="hello string:hello ${fname} welcome on this page"
      tal:content="hello"
/>

Здесь переменная 'hello' будет установлена, а ее содержимое попадет в тег span

однако, следующий пример неверный (точнее, не отобразит никакого содержания внутри span), т.к. tal:define определит содержание переменной 'hello' перед тем, как tal:content использует ее для определения того, что должно быть внутри элемента span. Чтобы не было указано внутри span в шаблоне, это будет проигнорированно (заменено значением переменной 'hello'). Но в нашем случае hello не будет определено, и поэтому возникнет исключение (exception).

<span tal:define="hello" tal:content="hello">
  hello ${fname} welcome on this page
</span>

Кстати, в этом примере мы не использовали слово 'global' перед определением переменной. В PHPTAL переменные бывают глобальными и локальными.

Глобальная переменная будет доступна во всем шаблоне и в вызываемых из него макросов.

<span tal:define="global hello string:hello world"/>
<p tal:content="hello"/>

Локальная же переменная видна только внутри тега, в котором она определена:

<span tal:define="hello string:hello world"/>
<p tal:content="hello"/> <!-- вызовет ошибку "неопределенной переменной" -->