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"/> <!-- вызовет ошибку "неопределенной переменной" -->