プラグイン開発/条件タグについてハマったこと
テンプレートタグの書き方はいろいろあって、例えば
MT::Template::Context に設定する方法と
MT::Plugin の registry に設定する方法がある。
よく、というかあまり多くないプラグイン開発についてのネットの記事や、書籍に載ってるのは前者の方法。
サンプルは下記のようなタグを実装するソース。
<mt:IfPluginTextBlock> <$mt:PluginTestText$> </mt:IfPluginTextBlock>
MT::Template::Context に設定する方法
package MT::Plugin::PluginTest; use strict; use MT; use MT::Plugin; use MT::Template::Context; our $VERSION = '0.1'; @MT::Plugin::PluginTest::ISA = qw(MT::Plugin); my $plugin = shift; $plugin = new MT::Plugin::PluginTest({ name => 'プラグインテスト', version => $VERSION, description => 'プラグインのテストですよ', }); MT->add_plugin($plugin); MT::Template::Context->add_tag(PluginTestText => \&_hdlr_plugin_test_text); MT::Template::Context->add_conditional_tag(IfPluginTextBlock => \&_hdlr_if_plugin_test_block); sub _hdlr_plugin_test_text{ return 'プラグインテスト'; } sub _hdlr_if_plugin_test_block{ return 1; #常に真 } 1;
この方法はよく見かけるので簡単だった。
MT::Plugin の registry に設定する方法
これが難しかった。ただのコンテナタグだったら簡単なんだけど、条件タグについては全然情報が無くて困った。
そこで「困ったときはソースを見よ!」との誰かの言葉を思い出して、MT自体のソースを調べてみたら解決。
package MT::Plugin::PluginTest; use strict; use MT; use MT::Plugin; our $VERSION = '0.1'; @MT::Plugin::PluginTest::ISA = qw(MT::Plugin); my $plugin = shift; $plugin = new MT::Plugin::PluginTest({ name => 'プラグインテスト', version => $VERSION, description => 'プラグインのテストですよ', registry => { tags => { function => { 'PluginTestText' => \&_hdlr_plugin_test_text, }, block => { 'IfPluginTextBlock?' => \&_hdlr_if_plugin_test_block, }, }, }, }); MT->add_plugin($plugin); sub _hdlr_plugin_test_text{ return 'プラグインテスト'; } sub _hdlr_if_plugin_test_block{ return 1; #常に真 } 1;
問題の部分のみ抜粋。
block => { 'IfPluginTextBlock?' => \&_hdlr_if_plugin_test_block, },
IfPluginTextBlock? のようにコンテナタグの最後に「?」をつけると条件タグになるみたい!
一見前者のほうが簡単で良いように見えるけど、もっと多くのタグを作るとなると可読性が後者のほうに軍配が上がる。尚且つ、一度に全て設定してるので速度も速い!?・・・のかな。
perlかMTでベンチマークを計る方法をあとで調べよう。