Вызов внешних сабвуферов и модулей в Template Toolkit без плагинов?

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

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


person Sam Lee    schedule 16.08.2009    source источник


Ответы (3)


Пробовали ли вы 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;
}
person Sinan Ünür    schedule 16.08.2009

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

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 ) %]


создаст это:

========================================
Hello my name is Barry, how are u today?
The ultimate answer to life is 42
========================================
person draegtun    schedule 17.08.2009

Самый простой и опасный способ добиться этого — использовать блок [% PERL %] и принудительно выполнить оценку в пространстве имен main.

[% PERL %]
package main;
# You can now use any variables and subroutines as though this were in the main namespace
[% END %]

Это необходимо, поскольку блок [% PERL %] оценивается в изолированном Template::Perl пространство имен пакета, которое вы переопределяете с помощью package main

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

person Elle Fie    schedule 15.06.2020