2009-08-16 2 views
4

Я пытаюсь вызвать внешний модуль Perl в файле .tt-файла Template Toolkit. Модуль, который я хочу использовать, - Util, и я хочу позвонить Util::prettify_date. Я смог включить этот модуль с помощью интерфейса плагина Template Toolkit: я настроил функцию загрузки, новой и ошибки (как описано здесь: http://template-toolkit.org/docs/modules/Template/Plugin.html) и включил ее, используя [% USE Util %].Вызов внешних модулей в Template Toolkit без плагинов?

Это прекрасно работает, но мне было интересно, есть ли способ для USE Perl-модулей в Template Toolkit без необходимости подключать их. Основная проблема с созданием плагинов заключается в том, что я должен сделать все функции в Util объектно-ориентированными (т. Е. Принимает $ self как первый аргумент), что на самом деле не имеет смысла.

ответ

6

Вы пробовали use Модуль в блоке [% PERL %]?

Теперь я лично напишу плагин, который передает, скажем, MyOrg::Plugin::Util->prettify_date в Util::prettify_date после избавления от первого аргумента. Вы можете автоматизировать процесс создания этих методов, а также:

my @to_proxy = qw(prettify_date); 

sub new { 
    my $class = shift; 

    { 
     no strict 'refs'; 
     for my $sub (@to_proxy) { 
      *{"${class}::${sub}"} = sub { 
       my $self = shift; 
       return "My::Util::$sub"->(@_); 
      } 
     } 
    } 
    bless {} => $class; 
} 
14

Вы также можете передать функции (т.е. подпрограммы.) В шаблон:

use strict; 
use warnings; 
use List::Util(); 
use Template; 

my $tt = Template->new({ 
    INCLUDE_PATH => '.', 
}); 

$tt->process('not_plugin.tt', { 
    divider => sub { '=' x $_[0]   }, 
    capitalize => sub { ucfirst $_[0]   }, 
    sum  => sub { List::Util::sum(@_) }, 
}); 


not_plugin.tt

 
[% divider(40) %] 
Hello my name is [% capitalize('barry') %], how are u today? 
The ultimate answer to life is [% sum(10, 30, 2) %] 
[% divider(40) %] 


будет производить e это:

 
======================================== 
Hello my name is Barry, how are u today? 
The ultimate answer to life is 42 
======================================== 
Смежные вопросы