Template Toolkit: Вопросы: Часто задаваемые вопросы

Template Toolkit

(русская редакция)

[ Пособия ] [ Руководство ] [ Модули ] [ Библиотеки ] [ Утилиты ] [ Вопросы ] [ Релиз ] [ Perl-ресурсы ] Форум ]
 
Поиск
Template Toolkit | Вопросы | FAQ | Часто задаваемые вопросы

Часто задаваемые вопросы

Часто задаваемые вопросы о Template Toolkit.

Оглавление

ОПИСАНИЕ

Индекс ] [ Наверх ]

Раздел содержит список часто задаваемых вопросов по использованию Template Toolkit. Более точно, пока что довольно небольшой раздел, в котором планируется разместить FAQ.

Язык Template Toolkit

Индекс ] [ Наверх ]

Почему [% a = b IF c %] работает не как ожидается?

Потому что парсер интерпретирует это следующим образом:

    [% a = (b IF c) %]

Вместо этой используйте следующую запись:

    [% SET a = b IF c %]

Я использую TT для вывода TT шаблона. Есть ли хороший способ для квотирования [% и %]?

Можно сделать так: [% stag = "[\%" etag = "%\]" %] затем: [% stag; 'hello'; etag %]

Или так:

  [% TAGS [- -] %]
  [- INCLUDE foo -]   # директива
  [% INCLUDE foo %]   # не директива, обычный текст, пропускается парсером

Как осуществить циклический перебор хеша?

Это описано в разделе руководства Template::Manual::VMethods. Список всех ключей хеша можно получить с помощью виртуального метода 'keys'. После этого можно циклически обойти хеш, используя каждый из ключей для получения соответствующего значения.

    [% FOREACH key = product.keys %]
       [% key %] => [% product.$key %]
    [% END %]

Плагины

Индекс ] [ Наверх ]

Как заставить плагин Table выводить данные не сверху вниз, а слева направо?

Нужно вывести данные построчно:

     Steve     Karen     Jeff
     Brooklyn  Nantucket Fairfax
     NY        MA        VA

    [% USE table(data, rows=3) %]

Затем выполняем цикл по колонкам:

    [% FOREACH column = table.cols %]

И, наконец, выводим каждый элемент колонки построчно:

    [% FOREACH item = column %]
	<td>[% item %]</td>
    [% END %]

Доступ к cookies

Джефф Боз (Jeff Boes <jboes@nexcerpt.com>) спрашивает:

    Существует ли простой способ получить доступ к
    cookies из шаблонов?

Джонас Лильегрен (Jonas Liljegren) отвечает:

    [% USE CGI %]

    <p>Значение ключика [% CGI.cookie('cookie_name') | html %]

Расширения Template Toolkit

Индекс ] [ Наверх ]

Можно ли запрашивать шаблоны из базы данных?

Коротко: да, Крис Нандор (Chris Nandor) сделал это для Slash. Вам нужен производный класс Template::Provider. Более подробный ответ ищите в архивах списка рассылки.

Можно ли запрашивать шаблоны через http?

Для того чтобы правильно выполнить эту задачу вам нужно создать производный от Template::Provider класс Template::Provider::HTTP и использовать опцию конфигурации PREFIX_MAP, чтобы связать префикс в имени шаблона 'http' с соответсвующим поставщиком (вы можете поискать дополнительную информацию о PREFIX_MAP в файле Changes около версии 2.01 - возможно она все еще нигде больше правильно не задокументирована). Например (код не тестировался ввиду отсутствия класса поставщика HTTP - патчи приветствуются!):

    use Template::Provider::HTTP;
    my $file = Template::Provider( INCLUDE_PATH => [...] );
    my $http = Template::Provider::HTTP->new(...);
    my $tt2  = Template->new({
	LOAD_TEMPLATES => [ $file, $http ],
	PREFIX_MAP => {
	    file    => '0',	# file:foo.html
	    http    => '1',	# http:foo.html
	    default => '0',	# foo.html => file:foo.html
	}
    });

Теперь шаблон, указанный следующим образом:

    [% INCLUDE foo %]

будет предоставлен поставщиком 'file' (по умолчанию). В противном случае, можно явно указать префикс:

    [% INCLUDE file:foo.html %]
    [% INCLUDE http:foo.html %]
    [% INCLUDE http://www.xyz.com/tt2/header.tt2 %]

Аналогичный принцип можно использовать при создании поставщика шаблонов DBI. Например:

    [% INCLUDE dbi:foo.html %]

Но, увы, и поставщика DBI как части Template Toolkit у нас пока нет. В списке рассылки был разговор о попытках разработки поставщиков DBI и/или HTTP, но пока дальше обсуждения дело не сдвинулось...

В настоящий момент сообщение Крейга (Craig) в списке рассылки содержит ряд полезных указаний, как этого достичь с использованием существующих модулей:

    To: Adam Theo <adamtheo@theoretic.com>
    From: Craig Barratt <craig@arraycomm.com>
    Date: Fri, 18 May 2001 17:06:59 -0700

    > i was wondering if there is anyway to fetch a file using http:// or
    > ftp:// and include that?

    Here's one way.  Set the LOAD_PERL option:

    	use Template;

    	my $template = Template->new({
    	    LOAD_PERL => 1
    	});
    	$template->process("example.tt", { stdout => *STDOUT })
    				     || die $template->error();

    and then use LWP::UserAgent and HTTP::Request:

    	[%
    	    USE ua = LWP.UserAgent;
    	    ua.proxy("http", "http://your_proxy/");
    	    USE req = HTTP.Request("GET", "http://www.cpan.org");
    	    ua.request(req).content;
    	-%]

    For FTP use Net::FTP:

    	[%
    	    USE ftp = Net.FTP("ftp.cpan.org");
    	    x = ftp.login("anonymous", "me@here.there");
    	    x = ftp.cwd("/");
    	    x = ftp.get("welcome.msg", stdout);
    	    x = ftp.quit;
    	-%]

    Normally ftp.get would write the file into the current directory.
    Instead we pass stdout as a second argument so that it is written
    to stdout.  We set stdout to STDOUT in the variables we pass to
    process.

    Craig

Разное

Индекс ] [ Наверх ]

Каким образом сконфигурировать переменные для каждого отдельного шаблона?

Один из простых способов - определить один шаблон PRE_PROCESS, который подгружает другие файлы конфигурации в зависимости от значений определенных переменных или других условий.

Например, я обычно включаю настройки следующим образом:

    PRE_PROCESS => 'config/main'

config/main:

    [%  DEFAULT  style   = 'text'
                 section =  template.section or 'home';
        PROCESS  config/site
              +  config/urls
              +  config/macros
              + "config/style/$style"
              + "config/section/$section"
              + ...
    %]

Это позволяет мне контролировать с помощью установки единственной переменной 'style', какой файл конфигурации использовать для установки стиля (цвета, пути к картинкам и т.п.). Например:

config/style/basic:

    [%  style = {
	    name = style    # сохраним существующую переменную 'style' как 'style.name'
	    # определяем различные переменные стиля....
            col = {
		back => '#ffffff'
		text => '#000000'
		# ... и т.д. ...
	    }
	    logo = {
		# ... и т.д. ...
	    }
	    # ... и т.д. ...
	}
    %]

В каждом шаблоне можно объявить, в каком разделе он находится, через директиву META:

  [% META
       title   = 'General Information'
       section = 'info'
  %]
  ...

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

config/section/info:

    [%  section = {
	    name   = section  # сохраним переменную 'section' как 'section.name'
	    title  = 'Information'
	    menu   = [ ... ]
	    # ... и т.д. ...
	}
    %]

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

АВТОР

Индекс ] [ Наверх ]

Энди Уардли (Andy Wardley <abw@andywardley.com>)

http://www.andywardley.com/

ВЕРСИЯ

Индекс ] [ Наверх ]

2.70, поставляется в составе 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.