前回はMobaSiFに含まれる個々のPerlモジュールを解説しました。今回は,
テンプレートエンジンMTemplate
MobaSiFに付属するテンプレートエンジンMTemplateは,
- 1つのテンプレートファイルで3キャリアに対応
1つのテンプレートファイルを記述するだけで,
3キャリアに対応できます。また, キャリアごとに表示する内容を変えることもできます。 - 事前コンパイルにてバイナリテンプレート生成
HTTPリクエストを受け付けるたびにテンプレートをparseするのは非効率と考え,
事前コンパイルによりバイナリテンプレートを生成する方式をとっています。 - mmapによる共有メモリの利用
DeNAのサービスで長く使われているFastCGIでは,
プロセス上のメモリキャッシュを利用するとアプリケーションプロセスごとにメモリが利用されてしまい非効率です。そこで, UNIX系のシステムコールであるmmap( )を使い, ファイルをメモリにマップして各アプリケーションプロセスから共通のメモリ領域を利用できるようにしています。 - XSによる高速処理
主要部分がC言語で実装されているため処理が高速です。
MTemplateの利用の流れ
(1)テンプレートファイルの作成
テンプレートファイルはtemplate/
(2)テンプレートファイルのコンパイル
script/
Webサーバ
(3)Webアプリケーションロジック(.pmファイル)から呼び出す
リスト11は,
insert( )の第1引数はテンプレートファイル名で,
リスト11 Webアプリケーションロジックからテンプレートを利用する
use MTemplate;
my $html = MTemplate::insert("regist/test", $rhData);
Common::output(¥$html);
第2引数は,
テンプレートファイルの記述方法
MTemplateのテンプレートファイル独自の記述は
変数展開
リスト12は,
リスト12 変数展開の記述例
$=OPTIONS:NAME$
表4 MTemplateで使用するオプション
表記 | 機能 | 詳細 |
---|---|---|
h | HTML特殊文字変換 | 下記のような変換を行う。クロスサイトスクリプティングなどへの対策のため, " => " < => < > => > & => & |
hn | 改行コード変換 | hの処理に加え |
e | url escape | URLに含めてはならない文字をエスケープする |
b | bypass | 無変換 |
条件分岐
条件分岐のときの記述はリスト13のようになります。これらの条件分岐はネスト
条件文CONDには表5の形式が利用できます。左辺値の変数は,
リスト13 条件分岐の記述例
$ if (COND) { $
$ } elsif (COND1 || COND2) { $
$ } elsif (COND1 && COND2) { $
$ } else { $
$ } $
表5 CONDの形式
式 | はたらき |
---|---|
変数=定数 | 文字列比較 |
変数!=定数 | 文字列比較 |
変数 | ne '' ★ |
!変数 | eq '' ★ |
変数>=定数 | 数値比較 |
変数>定数 | 数値比較 |
変数<=定数 | 数値比較 |
変数<定数 | 数値比較 |
ループ
ループはリスト14の形式になります。ループの中にループを記述することもできます。
リスト14 テンプレートファイル中のループ記述例
$ loop (NAME) { $
$ } $
たとえば,
リスト15 ループに渡すリストの定義例
my @fruits = ( {name => 'apple', price => '100'},
{name => 'orange', price => '120'},
{name => 'melon', price => '500'},
);
$rhData->{List} = \@fruits;
リスト16 リストの各要素を表示するテンプレートファイル例
$ loop (List) { $
$=h:name$ は $=h:price$ 円!
$ } $
図2 実行結果
apple は 100 円! <br> orange は 120 円! <br> melon は 500 円! <br>