本システムでは、 ブラウザに出力する HTML をコアの部分から切り離しています。 この切り離されたファイルを、テンプレートファイルと呼びます。 テンプレートファイルは、コアと独立した HTML として扱われるため、 スタイルシート や JavaScript を使ったり、 Java アプレットを埋め込むことを自由にできます。
テンプレートファイルは、HTML の中に Perl のスクリプトを 埋め込むようにして記述します(この点で PHP に似ているかもしれません)。 必要な情報は、全て Perl の変数にアクセスする形で読み込みます。
厳密には正しくありませんが、イメージ的には、 テンプレートファイル中のタグ <% ... %> で囲まれた部分が、 Perl のスクリプトとして展開され、 それ以外の部分は通常の HTML と同様にそのまま出力されます。
テンプレートファイルは、まず DBIPgSystem::DB::decode_template メソッドによってデコードされます。 デコードの処理では、 タグ <% ... %> で囲まれた部分には何も行わず、 タグ <% ... %> で囲まれていない部分を ("'", "\" をエスケープして)シングルクォートで囲み、 print 関数の引数とします。 <% ... %> をネストさせることはできません。 テンプレートファイルは、デコードされると Perl のコードとみなすことが できるようになります。 次に、デコードされたテンプレートを Perl のコードとみなして一度に評価します。
本システム付属のスクリプト dbipg_decode_template を利用すれば、テンプレートファイルの内容が実際にどのようにデコードされるかを 知ることができます。 また、データ定義ファイルの $self->{template}{decoded} が true の場合は、 dbipg_install を実行する (通常 make install)と、 $self->{template}{dir} で指定したディレクトリにデコードされたファイルが 生成されています。 テンプレートファイルに文法エラーがあったときに利用すると便利かもしれません。
テンプレートファイルは DBIPgSystem::DB::print_template メソッド で解析されます。
Perl のコード中では、デフォルトのファイルハンドルに出力した文字列が 出力されます。 例えば、変数 $var{misc}{test} の値を出力するには 次のように記述します :
次のように print や write に STDOUT と明記して記述してはいけません :
my で宣言したプライベート変数を <% ... %> タグをまたいで利用することや、次のような記述を行うことができます :
Perl でブロック内に置いたコードと同様に、 <% ... %> で囲まれたコードの 一番最後のセミコロンは省くことができます。
Perl のコード中にコメントを置くことができます。 ただし行コメント中の "%>" は、コメントとはみなされません。 例えば次の記述では、"123" と出力されます :
テンプレート内に、他のテンプレートファイルを埋め込むことが できます。ファイル名 "template.html" のファイルを埋め込むには、 次のように記述してください。
この場合、タグ <% ... %> の中には 他の Perl のコードを書かないでください。最後のセミコロンは省略できます。 埋め込まれるテンプレートファイルから、 さらにファイルを埋め込むこともできます。
読み込まれたテンプレートファイル全体は、 (ラベルのない単体の)ブロックで囲まれます。 従って、埋め込まれたテンプレート内で my で宣言された変数は外部に漏れませんし、 last を使ってブロックを抜け出すことができます。
print_template メソッドの呼び出し時に渡した引数を利用できます。 (DBIPgSystem モジュールにある API を利用した場合は、 通常戻り値の 2番目の要素を直接 print_template メソッドに渡すはずです。) この引数は、$var{...} や $nvar{...} の形でテンプレートから参照できます。
例えば DBIPgSystem::search メソッドの戻り値の 2番目の要素を print_template に渡した場合、 $nvar{page}, $var{page} にページ番号が格納されます。 どのような変数が利用できるかを知りたい場合は、 関連する API を参照してください。
$nvar{...} と $var{...} の違いは、 $nvar{...} が引数の値そのものを表すのに対し、 $var{...} は CGI.pm の escapeHTML を通った後の値であることです。 '<', '>' 等の文字がエスケープされますので、 特に理由がない限り $var{...} を利用されることをお薦めします。
ただし、$nvar{...} が役に立つ場合も幾つかあります。 DBIPgSystem::DB::print_error から呼び出されるテンプレートの $nvar{errmsg}や、 DBIPgSystem::DB::fatal_error 用のテンプレートの $nvar{apology}、 メンテナンス用のテンプレートの $nvar{maintenance_msg}、 検索時のエラーを出力するための $nvar{errmsg} は、 変数の中でしばしば(安全であるべき)タグが使われるため、 $nvar{...} のほうが便利です。 また、後述する $nvar{sys} には、対応する $var{...} がありません。
さらに、変数をクエリーとしてURIに付加する場合には $nvar{...} から生成したほうが簡単な場合もありますし、 アプリケーションによっては他に有用な使い方があるかもしれません。 しかし、この場合は、 変数がエスケープされていないことに細心の注意を払ってください。
テンプレートは DBIPgSystem::DB パッケージ内で評価されます。 このため、同パッケージのメソッドや変数を使うことができます。 print_template の引数以外で、 利用すると便利な変数をいくつか紹介します。
コアで準備されており、テンプレートファイル中で利用すると便利な、 いくつかの有用なメソッドを紹介します。
テンプレートファイル中で値が代入されることを期待している 特殊な変数が 1個だけあります。 column 変数は、"フォームからのファイルの追加/修正" が複数ページある場合、 各カラムの入力フォームが何ページ目にあるかを知らせる役割があります。 (入力フォームのある位置の近くで設定できるようにするため、 このような仕様になっています。) テンプレートファイルが評価される前は この変数は空の配列へのリファレンスになっています。 カラム 'column_name1' の入力フォームが書かれている位置の近くで、 次のように記述してください (文字列が ':' で始まる場合は、主テーブルのカラムを表します) :
一方、関連テーブルの入力フォームを複数ページに置くことはできません。 関連テーブル 'rel_table1' の入力フォームがあるテンプレートファイルには、 次のように記述してください (文字列が ':' で始まらない場合は、関連テーブルを表します) :