CGI::ApplicationとCGI::Application::Plugin::TTでPOSTパラメータにアクセスする

CGI::ApplicationでPOSTで受け取ったパラメータを、TTで表示させる時にモタモタしたのでメモ。
CGI::Application::Plugin::TTはtt_process()というメソッドを使って出力させる。


Hoge::App.pm

package Hoge::App;
use strict;
use base qw (CGI::Application);
use CGI::Carp qw(fatalsToBrowser);
use CGI::Application::Plugin::TT;


sub cgiapp_init {
    my $self = shift;
    # TTのディレクトリなどここで設定
    $self->tt_config(
        TEMPLATE_OPTIONS => {
            INCLUDE_PATH => "./template",
        },
    );
    $self->SUPER::cgiapp_init(@_);
}

sub cgiapp_prerun {
    my $self = shift;
    $self->header_props( -charset => "utf-8" );
}

1;


Hoge::Appを継承したHoge::Member.pm (sub setup()など省く)

package Hoge::Member;
use strict;
use base qw (Hoge::App);

sub do_editconf {
    my $self = shift;
    my $q = $self->query;
    my $q_string = $q->query_string;
 
    $self->tt_process('conf.tt', {
            query => $q,
            q_string  => $q_string,
     });
}

1;


conf.tt

    [% USE Dumper %]
    [% Dumper.dump(query) %]
    [% Dumper.dump(q_string) %]


Dumpしたconf.ttの出力結果

$VAR1 = bless( {
 '.parameters' => [ 'name1', 'name2', 'f_size', 'class', 'class_no', 'edit' ],
  'use_tempfile' => 1,
  '.charset' => 'ISO-8859-1',
  '.fieldnames' => {},
  'param' => { 'class_no' => [ '3' ], 'f_size' => [ '22.5' ],  'name2' => [ '女子' ], 'name1' => [ 'テスト' ], 'class' => [ 'B' ] },
  'escape' => 1 }, 'CGI' ); 

$VAR1 = 'name1=%E3%83%86%E3%82%B9%E3%83%88;name2=%E5%A5%B3%E5%AD%90;age=22;height=152;class=B;f_size=22.5;class_no=3;

結果 query.param('param名')で取得できる。

conf.tt

## Member.pm内で、conf.ttに渡された$queryの中のparamのvalueを表示

なまえ:[% query.param('name1') | html %] [% query.param('name2') | html %]
クラス:[% query.param('class') | html %] 
クラス番号:[% query.param('class_no') | html %]



## key,value値をそれぞれ表示したい場合は

 [% FOREACH q IN query.param() %]
      [% q %] [% query.param(q) %]
 [% END %]



## IF文とか

[% IF query.param('class_no') %] 
    [% query.param('class_no') | html %] 組
[% END %]          

追記

tt_processの中で
$params{c} ||= $self;
のようにアプリケーションオブジェクトそのものが c という名前で設定されているので、テンプレート側では
[% c.query.param('name1') | html %]
のように呼び出すこともできるそうです。

id:khashiさんありがとうございます。毎回$qを渡さなくてもよかったんですね^^;



Template::Plugin::FillInFormもすごい便利。
ページを戻ったり再表示した時など、フォームの値を自動で埋めてくれるモジュール。