Как добавить vmethod в набор инструментов шаблона при использовании Dancer? - PullRequest
3 голосов
/ 20 сентября 2011

Как добавить vmethod в набор инструментов шаблона при использовании Dancer?

Если нет способа, как я могу добавить функцию / как выполнить ссылку на функцию, которая добавляется в токены /?

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

Чтобы добавить пользовательский vmethod к TT в Dancer , нужно немного возиться с прямыми переменными пакета TT. Мне бы очень хотелось, чтобы объект Dancer :: Template предоставил доступ к базовому объекту шаблона.

Вот фрагмент, который может пойти по маршруту Dancer:

package mydancerapp;

use Dancer qw(:syntax);

# make sure TT module is loaded since Dancer loads it later in the request cycle
use Template::Stash;

# create list op vmethod, sorry its pretty trivial
$Template::Stash::LIST_OPS->{ uc_first  } = sub {
    my $list = shift;
    return [ map { ucfirst } @$list ];
);

Вероятно, лучше переместить это в свой собственный модуль mydancerapp::TT или mydancerapp::TT::VMethods, а затем загрузить его в свой основной класс приложения.

Затем вы можете использовать его в своих шаблонах, например:

# in route
get '/' => sub {
    template 'index', { veggies => [ qw( radishes lettuce beans squash )] };
};

# in template: views/index.tt
<p>[% veggies.uc_first.join(',') %]</p>

Если все прошло хорошо, вы должны увидеть: Radishes,Lettuce,Beans,Squash в своем выводе. :)

1 голос
/ 22 сентября 2011

Я не уверен насчет добавления vmethod, но я думаю, что второе можно сделать так:

hook 'before_template' => sub {
    my $tokens = shift;
    $tokens->{myfunction} = sub { ... };         #  OR ...
    $tokens->{otherfunction} = \&other_func;
};
0 голосов
/ 13 февраля 2016

В Dancer2 вы можете сделать это:

hook before => sub {
    my ( $app ) = @_;

    $app->template_engine->engine->context->define_vmethod( 'list' => 'uc_first' => sub {
        my $list = shift;
        return [ map { ucfirst } @$list ];
    });
};
...