3

Dancerを使用するときにテンプレートツールキットにvmethodを追加するにはどうすればよいですか?

方法がない場合、関数を追加するにはどうすればよいですか/トークンに追加された関数への参照を実行する方法/?

4

3 に答える 3

2

DancerのTTにカスタムvmethodを追加するには、直接TTパッケージ変数を少しいじる必要があります。Dancer::Templateオブジェクトが基になるテンプレートオブジェクトへのアクセスを提供することを望みます。

ダンサールートに入る可能性のあるスニペットは次のとおりです。

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::TTmydancerapp::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、出力に次のように表示されます。:)

于 2011-10-18T14:43:43.710 に答える
1

vmethodを追加するかどうかはわかりませんが、2番目のことは次のように実行できると思います。

hook 'before_template' => sub {
    my $tokens = shift;
    $tokens->{myfunction} = sub { ... };         #  OR ...
    $tokens->{otherfunction} = \&other_func;
};
于 2011-09-22T14:25:40.090 に答える
0

Dancer2では、次のことができます。

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

    $app->template_engine->engine->context->define_vmethod( 'list' => 'uc_first' => sub {
        my $list = shift;
        return [ map { ucfirst } @$list ];
    });
};
于 2016-02-13T19:44:23.727 に答える