Dancerを使用するときにテンプレートツールキットにvmethodを追加するにはどうすればよいですか?
方法がない場合、関数を追加するにはどうすればよいですか/トークンに追加された関数への参照を実行する方法/?
Dancerを使用するときにテンプレートツールキットにvmethodを追加するにはどうすればよいですか?
方法がない場合、関数を追加するにはどうすればよいですか/トークンに追加された関数への参照を実行する方法/?
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::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
、出力に次のように表示されます。:)
vmethodを追加するかどうかはわかりませんが、2番目のことは次のように実行できると思います。
hook 'before_template' => sub {
my $tokens = shift;
$tokens->{myfunction} = sub { ... }; # OR ...
$tokens->{otherfunction} = \&other_func;
};
Dancer2では、次のことができます。
hook before => sub {
my ( $app ) = @_;
$app->template_engine->engine->context->define_vmethod( 'list' => 'uc_first' => sub {
my $list = shift;
return [ map { ucfirst } @$list ];
});
};