CGI::Applicationで、セッションオブジェクトをテンプレートエンジンに自動で渡す
スポンサードリンク
CGI::Applicationで、セッションオブジェクトに入れておいたパラメータをそのままテンプレートエンジンに渡すとき、
package TEST; use strict; use warnings; use utf8; use base 'CGI::Application'; use CGI::Session qw(-ip_match); use CGI::Application::Plugin::Session; sub cgiapp_init { my ($self) = @_; $self->session_config( CGI_SESSION_OPTIONS => [ 'driver:File', $self->query, { Directory => 'session_dir' }, ], COOKIE_PARAMS => { -path => '/', -expires => '+1h', }, SEND_COOKIE => 1, ); $self->query->charset('UTF-8'); } sub setup { my $self = shift; $self->start_mode('index'); $self->run_modes( index => 'index', ); $self->header_add( -charset => 'UTF-8'); } sub index { my $self = shift; my $s = $self->session; my $t = $self->load_tmpl( 'index.tmpl' ); $t->param( hoge => 'fuga'); $t->param( $s->param_hashref() ); return $t->output; } 1;
こんな感じで書くことができます。でも、例えばサイトにログイン中はセッションオブジェクトにユーザIDなどが入ってるなどした場合、各RumModeで毎回$t->param( $s->param_hashref() );を書くのは面倒……
そんな時は、テンプレートエンジンのフックを使ってこうしてみましょう。
package TEST; use strict; use warnings; use utf8; use base 'CGI::Application'; use CGI::Session qw(-ip_match); use CGI::Application::Plugin::Session; sub cgiapp_init { my ($self) = @_; $self->session_config( CGI_SESSION_OPTIONS => [ 'driver:File', $self->query, { Directory => 'session_dir' }, ], COOKIE_PARAMS => { -path => '/', -expires => '+1h', }, SEND_COOKIE => 1, ); $self->query->charset('UTF-8'); $self->add_callback('load_tmpl',\&load_tmpl_callback); } sub setup { my $self = shift; $self->start_mode('index'); $self->run_modes( index => 'index', ); $self->header_add( -charset => 'UTF-8'); } sub index { my $self = shift; my $s = $self->session; my $t = $self->load_tmpl( 'index.tmpl' ); $t->param( hoge => 'fuga'); return $t->output; } sub load_tmpl_callback { my ($self, $ht_params, $tmpl_params, $tmpl_file) = @_; my $s = $self->session; $ht_params->{'die_on_bad_params'} = 0; # 各RumModeで$t->param( $s->param_hashref() );する代わり my $s_hashref = $s->param_hashref(); foreach my $key ( keys %$s_hashref ) { next if $key =~ m/^_/; next if $key =~ m/access_token/i; $tmpl_params->{ $key } = $s_hashref->{ $key }; } return; } 1;
セッションオブジェクトの中に、テンプレートエンジンに渡してはならないものもあると思うので、ブラックリストを使って排除するのは必要かなあと思います(next if~を羅列する)。
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3503
コメントする