アルファサード株式会社 代表取締役 野田 純生のブログ


PHPerのための Movable Type 講座(その10)


公開日 : 2014-04-20 11:31:14


今日は東京で何かやってんの? ここ大阪なので、関係ないねー(その10)。 今回は、その他のプラグインについて。

条件タグ、ファンクションタグ、グローバルモディファイア

前回までに、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

mt/php/lib配下には大量のファイルが

1タグ=1ファイルという仕様

と、いうことで、プラグインによるテンプレートタグの拡張についてご紹介しましたが、もうお分かりかと思いますが、MTのダイナミックパブリッシングでは、1タグ=1ファイルです。1モディファイア=1ファイル。1つや2つのタグ作成では問題ないのでしょうが、何十個、何百個も作成するとなると、それはもうカオスなことになります。

実際に mt/php/lib の配下をご覧あれ。

519ファイルです。もう、タグを探すだけで一苦労ですよね。メンテナンス性を高めるためには、機能ごとにプラグインフォルダを分けて管理するなどしないとわけがわからなくなります。

ただ、この方法にはメリットもあって、使っていない(少なくともダイナミック処理で使っていない)タグは、削除(別の場所にバックアップして、削除)することで、初期化の高速化、軽量化が図れます。

ただ、もうちょっと何とかならんのか、単なる関数だし、関数名の重複とか(そのための命名規則ですが)。

そこで、DynamicMTML

続く(かも)。



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ