Catalyst::View::TT

Catalyst::View::TT - Template View класс

Ваше приложение следует объявить как подкласс этого модуля.
Создать вид TT по имени Web:
$ script/myapp_create.pl view Web TT

Создаст MyApp::View::Web.pm модуль в lib директории.
Можно использовать разные Виды $c->stash->{current_view}
Catalyst::Action::RenderView  - для дополнительной информации о формировании Вида.

Настройка
Три способа настройки:

package MyApp::View::Web;
use Moose;
extends 'Catalyst::View::TT';
__PACKAGE__->config({
    PRE_PROCESS  => 'config/main',
    WRAPPER      => 'site/wrapper',
});


.. inside MyApp.pm ..
__PACKAGE__->config(
    'View::Web' => {
        INCLUDE_PATH => [
            __PACKAGE__->path_to( 'root', 'templates', 'lib' ),
            __PACKAGE__->path_to( 'root', 'templates', 'src' ),
        ],
    },
);

или в файле конфигурации
# MyApp_local.conf (Config::General format)
<View Web>
  WRAPPER "custom_wrapper"
  INCLUDE_PATH __path_to('root/templates/custom_site')__
  INCLUDE_PATH __path_to('root/templates')__
</View>

Динамический INCLUDE_PATH
Добавить путь во время выполнения можно так:
$c->stash->{additional_template_paths} = [$c->config->{root} . '/test_include_path'];

push( @{ $c->view('Web')->include_path }, qw/path/ ); 
добавит в конец INCLUDE_PATH
Но лучше проверить путь перед добавлением, чтобы не было дубликатов:
@{ $c->view('Web')->include_path } = qw/path another_path/;

Если вы вызываете render напрямую, то вы можете точно определить динамические пути, используя ключ additional_template_paths со значениями дополнительных директорий для поиска.

Юникод
Будьте уверены, что установили ENCODING => 'utf-8' и используйте Catalyst::Plugin::Unicode::Encoding если хотите использовать Юникод в своих шаблонах.

Формирование видов
sub message : Global {
    my ( $self, $c ) = @_;
    $c->stash->{template} = 'message.tt2';
    $c->stash->{message}  = 'Hello World!';
    $c->forward( $c->view('Web') );
}
Генерирует шаблон который указан в stash->{template}, а если не указан то ищется шаблон совпадающий с именем метода.

Переменные также передаются в Template Toolkit для последующего использования.
Добавленные переменные для использования
c      Ссылка на объект контекста $c
base   URL основа от $c->req->base()
name  имя приложения из $c->config->{ name }

В message.tt2:
The message is: [% message %]
The base is [% base %]
The name is [% name %]
Выходной поток шаблона хранится в  $c->response->body
Если вы хотите использовать выходной поток шаблона для других целей, который отображается в ответе, например для посылки сообщения, это возможно используя Catalyst::Plugin::Email и render метод:

sub send_email : Local {
  my ($self, $c) = @_;
  $c->email(
    header => [
      To      => 'me@localhost',
      Subject => 'A TT Email',
    ],
    body => $c->view('Web')->render($c, 'email.tt', {
      additional_template_paths => [ $c->config->{root} . '/email_templates'],
      email_tmpl_param1 => 'foo'
      }
    ),
  );
# Перенаправляет или отображает сообщение
}

Анализ шаблона
См. TIMER свойство в конфиг методе.

Методы

new
Конструктор для TT вида. Настраивает поставщик шаблона, и читает конфиг приложения.

process($c)
Формирует шаблон заданный в $c->stash->{template} или $c->action(приватное имя совпавшего действия). Вызывает render для выполнения фактического формирования. Результат находится в $c->response->body.
Возможно переадресовать методу process ТТ вида из Catalyst, таким образом:
$c->forward('View::Web');
Заметка: обычно это выполняется автоматически Catalyst::Action::RenderView.

render($c, $template, \%args)
Формирует данный шаблон и возвращает результат. Выбрасывает объект Template::Exception при ошибке.
Переменные шаблона устанавливаются в %$args если $args - ссылка на хеш или иначе $c->stash. В обоих случаях переменные наращиваются при помощи base устанавливащий $c->req->base, c в $c и name в $c->config->{name}. Поочередно, CATALYST_VAR значения конфигурации могут быть определены чтобы установить имя переменной шаблона из которой можно получить к ссылке на контекст ($c). В этом случае, c, base и name переменные могут быть опущены.

$template может быть всем, чтобы Template::process понимал, как его обработать, включая имя файла шаблона или ссылку на тестовую строку. Смотри Template::process для полного списка поддерживаемых форматов.
Чтобы использовать метод render снаружи вашего Catatyst приложения, просто передайте undef контекст. Это может быть полезно, для тестов например.
Возможно переадресовать метод render TT вида снаружи Catalyst для формирования фрагментов страниц, наподобие:
my $fragment = $c->forward("View::Web", "render", $template_name, $c->stash->{fragment_data});

Обратная совместимость

Метод render просто возвращал объект Template::Exception, предпочтительнее, чем простое выбрасывание исключения. Теперь это запрещено и вместо, render метод выбрасывает исключение для новых приложений.

Это поведение может быть активировано (по умолчанию активировано в каркасе приложения) используя render_die => 1. Если вы полагаетесь на существующее поведение, то будут появлятся предостережения. render_die => 0, выключает предупреждения.

template_vars
Возвращает список ключи/значения, чтобы быть используемы как catalyst переменные в шаблоне.

config
Позволяет вашему подклассу вида передать дополнительные настройки в TT хэш конфигурации, или установить опции, как ниже:

path
Список путей, где будут искать TT шаблоны.

expose_methods
Список методов в вашем классе Вида которые следует сделать соступными в шаблонах.
Например:
expose_methods => [qw/uri_for_css/],
 
...
 
sub uri_for_css {
  my ($self, $c, $filename) = @_;
 
  # additional complexity like checking file exists here
 
  return $c->uri_for('/static/css/' . $filename);
}
Затем в шаблоне:
[% uri_for_css('home.css') %]


CATALYST_VAR
Позволяет изменить имя объекта контекста Catalyst. Если установите, то синонимы base и name будут удалены, так вы можете получить доступ к ним, через <context>
Например, если CATALYST_VAR установлена в "Catalyst", шаблон может содержать:
The base is [% Catalyst.req.base %]
The name is [% Catalyst.config.name %]
 
TIMER
Если вы настроили Catalyst для вывода отладки и включили TIMER настройку, Catalyst::View::TT активирует анализирование обработки шаблона (используя Template::Timer). Это будут встроенные HTML комментарии на выходе из вашего шаблона, такие как:
<!-- TIMER START: process mainmenu/mainmenu.ttml -->
<!-- TIMER START: include mainmenu/cssindex.tt -->
<!-- TIMER START: process mainmenu/cssindex.tt -->
<!-- TIMER END: process mainmenu/cssindex.tt (0.017279 seconds) -->
<!-- TIMER END: include mainmenu/cssindex.tt (0.017401 seconds) -->
 
....
 
<!-- TIMER END: process mainmenu/footer.tt (0.003016 seconds) -->
  

TEMPLATE_EXTENSION
Суффикс, который добавится к названиею шаблона, когда он будет запрошен методом match в Catalyst::Request

Например:
package MyApp::Controller::Test;
sub test : Local { .. }
 
по умолчанию ищет шаблон в <root>/test/test. А если установлен TEMPLATE_EXTENSION в '.tt', то будет искать <root>/test/test.tt.


Поставщики
Позволяет установить шаблон поставщиков, которые будет использовать TT.
MyApp->config(
    name     => 'MyApp',
    root     => MyApp->path_to('root'),
    'View::Web' => {
        PROVIDERS => [
            {
                name    => 'DBI',
                args    => {
                    DBI_DSN => 'dbi:DB2:books',
                    DBI_USER=> 'foo'
                }
            }, {
                name    => '_file_',
                args    => {}
            }
        ]
    },
);

Ключ name должен соответствовать имени класса поставщика, который вы будете использовать. Имя '_file_' специальный случай, который показывает TT файлового поставщика. По умолчанию name будет предваряться 'Template::Provider::'.

Вы так же можете установить 'copy_config' ключ как ссылка на массив, чтобы скопировать те ключи из основного конфига в конфиг провайдера.
DEFAULT_ENCODING    => 'utf-8',
PROVIDERS => [
    {
        name    => 'Encoding',
        copy_config => [qw(DEFAULT_ENCODING INCLUDE_PATH)]
    }
]
 
CLASS
Позволяет вам задать пользовательский класс, чтобы использовать как шаблон, вместо Template.
package MyApp::View::Web;
use Moose;
extends 'Catalyst::View::TT';
 
use Template::AutoFilter;
 
__PACKAGE__->config({
    CLASS => 'Template::AutoFilter',
});
  
Примечание
Если вы используете CGI модуль внутри шаблона, отключите режим отладки, дабы не завис Catalyst сервер, ожидая ввода с терминального окна отладчика CGI.
[% USE CGI('-no_debug') %]