| Template Toolkit(русская редакция) |  | ||
| 
 | |||
| Синтаксис |  | 
| ОПИСАНИЕ | [ Индекс ] [ Руководство ] [ Наверх ] | 
| Раздел описывает синтаксис, структуру и семантику директив и языка общего представления Template Toolkit. Стиль теговПо умолчанию директивы шаблона заключены между последовательностями символов '[%' и '%]'. Например,     [% PROCESS header %]
    <h1>Hello World!</h1>
    <a href="[% page.next %]"><img src="[% icon.next %].gif"></a>
    [% PROCESS footer %]Вы можете изменить символы тегов с помощью опций конфигурации START_TAG, END_TAG и TAG_STYLE. Также можно использовать внутри шаблона директиву TAGS для определния стиля тегов для текущего файла шаблона. Также вы можете установить опцию INTERPOLATE, чтобы разрешить использовать непосредственно внутри шаблонов обычные (с префиксом '$') ссылки на переменные.     # INTERPOLATE => 0
    <td>[% name %]</td>  <td>[% email %]</td>    # INTERPOLATE => 1
    <td>$name</td>  <td>$email</td>Директивы можно включать в любом месте текста и можно разбивать на несколько строк. Дополнительные пробельные символы внутри директивы в общем случае несущественны.     [% INCLUDE header
       title = 'Hello World'
       bgcol = '#ffffff'
    %]
    [% INCLUDE menu align='right'%]
    Name: [% name %]  ([%id%])КомментарииСимвол '#' используется для обозначения комментария внутри директивы. Если вставить символ сразу за открывающим тегом вся директива целиком будет проигнорирована парсером.     [%# вся директива целиком игнорируется
        вне зависимости от того на сколько строк она разбита
    %]В любом другом месте этот символ указывает, что оставщаяся часть строки является комментарием.     [% # это комментарий
       theta = 20      # so is this
       rho   = 30      # <aol>me too!</aol>
    %]Удаление переводов строкиВы можете добавить '-' или '+' в открывающем или завершающем теге директивы, чтобы управлять удалением переводов строки до и после директивы. Подробности смотрите в описании опций PRE_CHOMP и POST_CHOMP.     [% BLOCK foo -%]		# удаляет замыкающий перевод строки
    This is block foo
    [%- END %]			# удаляет предшествующий перевод строкиНеявные директивы: GET и SETПростейшие директивы GET и SET получают и устанавливают значения переменных соответственно. Ключевые слова GET и SET фактически являются опциональными так как парсер достаточно умен, чтобы распознать их без явного указания (однако обратите внимание на приведенное ниже предупреждение об использовании обратной нотации). Таким образом:     [% SET foo = 10 %]
    [% GET foo %]вы чаще встретите в таком виде:     [% foo = 10 %]
    [% foo %]Также вы можете использовать простейшие логические выражения в неявной директиве GET: [% title or template.title or 'Default Title' %] [% mode == 'graphics' ? "Graphics Mode Enabled" : "Text Mode" %] Все остальные директивы должны начинаться с ключевого слова, записанного в ВЕРХНЕМ РЕГИСТРЕ (исключением является использование опции ANYCASE, смотри далее). Все директивы записываются в ВЕРХНЕМ РЕГИСТРЕ для лучшей визуализации и для того чтобы отличать их от переменных с тем же именем, записанным в другом регистре. Например, совершенно законно использование переменной с именем 'stop' которая полностью отличается от директивы STOP. [% stop = 'Clackett Lane Bus Depot' %] The bus will next stop at [% stop %] # переменная [% STOP %] # директива Блочные директивыТакие директивы как FOREACH, WHILE, BLOCK, FILTER и т.д. обозначают начало блока, который может содержать текст или другие директивы, и который завершается соответствующей директивой END. Вложенность блоков не ограничена. Директивы IF, UNLESS, ELSIF и ELSE также определяют блоки и могут использоваться друг с другом по обычным правилам.     [% FOREACH item = [ 'foo' 'bar' 'baz' ] %]
       * Item: [% item %]
    [% END %]
    [% BLOCK footer %]
       Copyright 2000 [% me %]
       [% INCLUDE company/logo %]
    [% END %]
    [% IF foo %]
       [% FOREACH thing = foo.things %]
	  [% thing %]
       [% END %]
    [% ELSIF bar %]
       [% INCLUDE barinfo %]
    [% ELSE %]
       do nothing...
    [% END %]Блочные директивы также могут использоваться в удобной обратной нотации. [% INCLUDE userinfo FOREACH user = userlist %]     [% INCLUDE debugtxt msg="file: $error.info"
         IF debugging %] [% "Danger Will Robinson" IF atrisk %] Сравните с:     [% FOREACH user = userlist %]
       [% INCLUDE userinfo %]
    [% END %]    [% IF debugging %]
       [% INCLUDE debugtxt msg="file: $error.info" %]
    [% END %]    [% IF atrisk %]
    Danger Will Robinson
    [% END %]Захват вывода блокаВывод директивы может быть захвачен простым присваиванием директивы перменной. [% headtext = PROCESS header title="Hello World" %] [% people = PROCESS userinfo FOREACH user = userlist %] В связке с директивой BLOCK это можно использовать для определения больших блоков текста или другого контента.     [% poem = BLOCK %]
       The boy stood on the burning deck,
       His fleece was white as snow.
       A rolling stone gathers no moss,
       And Keith is sure to follow.
    [% END %]Важное предупреждение относительно использования этого синтаксиса в связке с обратной нотацией. Следующая директива ведет себя не так как можно предполагать: [% var = 'value' IF some_condition %] В данном случае, директива интерпретируется как (для ясности добавлены пробелы)     [% var = IF some_condition %]
       value
    [% END %]а не как     [% IF some_condition %]
       [% var = 'value' %]
    [% END %]Переменной присваивается вывод блока IF, который вернет 'value', если условие выполняется и ничего, если условие ложно. Другими словами, следующая директива всегда будет приводить к очистке переменной 'var'. [% var = 'value' IF 0 %] Для того чтобы добиться ожидаемого поведения, директиву следует записать так: [% SET var = 'value' IF some_condition %] Цепочки фильтровНесколько директивы FILTER могут быть выстроены в цепочку. Они вызываются согласно определенному порядку и выходной поток одного передается на входной поток следующего. [% PROCESS somefile FILTER truncate(100) FILTER html %] В качестве замены FILTER можно использовать символ '|' (pipe). [% PROCESS somefile | truncate(100) | html %] Блоки директивНесколько директив, разделенных символом ';', могут быть заключены между одной парой тегов. Исключение составляет директива TAGS, которая всегда должна быть указана отдельно.     [% IF title;
          INCLUDE header;
       ELSE;
	  INCLUDE other/header  title="Some Other Title";
       END
    %]Сравните с:     [% IF title %]
       [% INCLUDE header %]
    [% ELSE %]
       [% INCLUDE other/header  title="Some Other Title" %]
    [% END %] | 
| АВТОР | [ Индекс ] [ Руководство ] [ Наверх ] | 
| Энди Уардли (Andy Wardley <abw@andywardley.com>) | 
| ВЕРСИЯ | [ Индекс ] [ Руководство ] [ Наверх ] | 
| Template Toolkit версия 2.14, дата релиза - 4 октября 2004. | 
| АВТОРСКИЕ ПРАВА | [ Индекс ] [ Руководство ] [ Наверх ] | 
| Copyright (C) 1996-2004 Andy Wardley. All Rights Reserved. Copyright (C) 1998-2002 Canon Research Centre Europe Ltd. Этот модуль является свободно-распространяемым программным обеспечением; вы можете распространять и/или модифицировать его на тех же условиях, что и Perl. |