前回は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引数はテンプレートファイル名で、
use MTemplate;
my $html = MTemplate::insert("regist/test", $rhData);
Common::output(¥$html);
第2引数は、
テンプレートファイルの記述方法
MTemplateのテンプレートファイル独自の記述は
変数展開
リスト12は、
$=OPTIONS:NAME$
表記 | 機能 | 詳細 |
---|---|---|
h | HTML特殊文字変換 | 下記のような変換を行う。クロスサイトスクリプティングなどへの対策のため、 " => " < => < > => > & => & |
hn | 改行コード変換 | hの処理に加え |
e | url escape | URLに含めてはならない文字をエスケープする |
b | bypass | 無変換 |
条件分岐
条件分岐のときの記述はリスト13のようになります。これらの条件分岐はネスト
条件文CONDには表5の形式が利用できます。左辺値の変数は、
$ if (COND) { $
$ } elsif (COND1 || COND2) { $
$ } elsif (COND1 && COND2) { $
$ } else { $
$ } $
式 | はたらき |
---|---|
変数=定数 | 文字列比較 |
変数!=定数 | 文字列比較 |
変数 | ne '' ★ |
!変数 | eq '' ★ |
変数>=定数 | 数値比較 |
変数>定数 | 数値比較 |
変数<=定数 | 数値比較 |
変数<定数 | 数値比較 |
ループ
ループはリスト14の形式になります。ループの中にループを記述することもできます。
$ loop (NAME) { $
$ } $
たとえば、
my @fruits = ( {name => 'apple', price => '100'},
{name => 'orange', price => '120'},
{name => 'melon', price => '500'},
);
$rhData->{List} = \@fruits;
$ loop (List) { $
$=h:name$ は $=h:price$ 円!
$ } $
apple は 100 円! <br> orange は 120 円! <br> melon は 500 円! <br>
共通要素の読み込み
先述した変数展開や制御構造以外に、
$INC:NAME$
$CON:NAME$
$STY:NAME$
- $INC:NAME$…template/
_inc_ html. txtの内容をインクルード テンプレートファイルに$INC:header$と記述すると、
template/ _inc_ html. txtファイルの$INCDEF:header$と$/INCDEF$で囲まれた部分が挿入されます。 - $CON:NAME$…template/
_const. txtの定数定義を使用 template/
_const. txtファイルに 「title : MobaSiF」 と書かれている場合、 テンプレートファイルに$CON: title$と記述すると、 MobaSiFに置換されます。 - $STY:NAME$…template/
_style. txtのスタイル定義を使用 template/
_style. txtファイルにリスト18のような記載があるとします。 その場合、リスト18 スタイル定義の例 default { attr-body: color-disable: #999999 color-base: #ff6633 }
<div style="backgroud-color:$STY:color-base$">
は
<div style="backgroud-color:"#ff6633">
となります。
キャリア単位の出し分け
接続元のキャリアによる表示の出し分けは、
$DOM:DOMAINS$
特定のキャリアからの接続時のみ表示する部分
$/DOM$
$DOM:d,v$
ドコモとソフトバンクモバイルの端末のみ表示
$/DOM$
その他の機能
- $ENC:STRING$
文字列STRINGをURLエスケープします。URL中に日本語を入れる場合などに便利です
(リスト21)。 - ::TIME(YYYY/[M]M/[D]D [H]H:II)
unixtimestampの数値に変換され、
主にif分の定数部分に利用されます (リスト22)。
<a href="_search?query=$ENC:キーワード$">
$ if (CurrentTime >= ::TIME(2005/9/16 18:00) { $
サンプルアプリケーションの紹介
MobaSiFには、
おわりに
本特集では、
MobaSiFにはここで取り上げた以外の機能もありますが、
- SourceForge.
jp上のプロジェクトページ - URL:http://
sourceforge. jp/ projects/ moba/ - DeNA技師のメモ
- URL:http://
d. hatena. ne. jp/ tokiharu/