PHPerのための Movable Type 講座(その10)
公開日 : 2014-04-20 11:31:14
今日は東京で何かやってんの? ここ大阪なので、関係ないねー(その10)。 今回は、その他のプラグインについて。
- PHPerのための Movable Type 講座(その1)
- PHPerのための Movable Type 講座(その2)
- PHPerのための Movable Type 講座(その3)
- PHPerのための Movable Type 講座(その4)
- PHPerのための Movable Type 講座(その5)
- PHPerのための Movable Type 講座(その6)
- PHPerのための Movable Type 講座(その7)
- PHPerのための Movable Type 講座(その8)
- PHPerのための Movable Type 講座(その9)
条件タグ、ファンクションタグ、グローバルモディファイア
前回までに、init.foo.php と ブロックタグプラグイン(Smarty形式)の紹介をしました(その8、及びその9)。
その他に、ブロックタグ(条件タグ)、ファンクションタグ、グローバルモディファイアプラグインがあります。
ブロックタグ(条件タグ)
条件タグは、ブロックタグでもあるので(この言い回しが良いかわからんですが)、ファイル命名規則や関数名、引数等のルールは同じです。その5で、$ctx->add_conditional_tag として紹介したやつですね。
注意点としては、タグ名にifを含むこと。
正確にはMTIfからはじめることですが、途中にifがあっても条件タグとして解釈されてしまうのだ(これ、バグと言っていいと思うけど、最新版ではどうなってますかね)。つまり、mtassetexif とかいうタグ(ありそうですよね、Exif情報を出力するタグとかこういう名前にしそう)は条件タグとして解釈されてしまうのでした。これってトリビアになりませんか? (余談でした)
$MT_DIR/
|__ plugins/
|__ MyPluginName/
|__ php/
|_block.mtifmorning.php
9時台までだと、朝だよ、を返す(深夜0時台が朝かよ、とかは気にしない)。
function smarty_block_mtifmorning ( $args, $content, &$ctx, &$repeat ) {
$date = getdate();
if ( $date[ 'hours' ] < 10 ) {
return $ctx->_hdlr_if( $args, $content, $ctx, $repeat, TRUE );
} else {
return $ctx->_hdlr_if( $args, $content, $ctx, $repeat, FALSE );
}
}
テンプレートは以下。
<mt:IfMorning>
朝だよ。
<mt:else>
朝じゃないよ。
</mt:IfMorning>
ファンクションタグ
ブロックタグと比べるとシンプルです。その5で、$ctx->add_tag として紹介したやつです。単に値を返せば良いので。例として、日付に関するタグを紹介します。
- ファイル名は function.mtタグ名.php。ここではfunction.mtgetdate.php
- 引数は、( $args, &$ctx )
- 関数名は、smarty_function_mtタグ名(smarty_function_mtgetdate)。
MTDateがあるじゃないか、という突っ込みは無視の方向で。
$MT_DIR/
|__ plugins/
|__ MyPluginName/
|__ php/
|_function.mtgetdate.php
function smarty_function_mtgetdate ( $args, &$ctx ) {
$name = $args[ 'name' ];
$date = getdate();
return $date[ $name ];
}
<mt:GetDate name="hours"> => 10 とか。
ここでは、単純なファンクションタグを紹介していますが、実際は、ブロックタグで$ctxに動的に値をセットしてループで取り出すとか、そういう使い方が多くなるかと思います。
グローバルモディファイア
その5で、$ctx->add_global_filter として紹介したやつです。
- ファイル名は modifier.mtタグ名.php。ここではmodifier.split.php
- 引数は、( $text, $arg )
- 関数名は、smarty_modifier_モディファイア(smarty_modifier_split)。
例:文字列を指定した値で分割するモディファイア。
$MT_DIR/
|__ plugins/
|__ MyPluginName/
|__ php/
|_modifier.split.php
function smarty_modifier_split ( $text, $arg ) {
$chars = preg_split( '//', $text );
array_shift( $chars );
array_pop( $chars );
return implode( $arg, $chars );
}
<mt:Blogname split=",">
=> PowerCMS => P,o,w,e,r,C,M,S
1タグ=1ファイルという仕様
と、いうことで、プラグインによるテンプレートタグの拡張についてご紹介しましたが、もうお分かりかと思いますが、MTのダイナミックパブリッシングでは、1タグ=1ファイルです。1モディファイア=1ファイル。1つや2つのタグ作成では問題ないのでしょうが、何十個、何百個も作成するとなると、それはもうカオスなことになります。
実際に mt/php/lib の配下をご覧あれ。
519ファイルです。もう、タグを探すだけで一苦労ですよね。メンテナンス性を高めるためには、機能ごとにプラグインフォルダを分けて管理するなどしないとわけがわからなくなります。
ただ、この方法にはメリットもあって、使っていない(少なくともダイナミック処理で使っていない)タグは、削除(別の場所にバックアップして、削除)することで、初期化の高速化、軽量化が図れます。
ただ、もうちょっと何とかならんのか、単なる関数だし、関数名の重複とか(そのための命名規則ですが)。
そこで、DynamicMTML
続く(かも)。