どこかに普通に書いてることかもしれませんが、ハマったのでメモ。
下記のコードは、MovableTypeのテンプレート・タグ(変数タグ) <$MTAddTagTEST$> を処理するプラグインです。
use strict;
use MT::Template::Context;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'AddTagTEST',
description => 'test of add_tag plugin'
});
MT->add_plugin($plugin);
MT::Template::Context->add_tag(AddTagTEST => \&test);
sub test {
return;
}
1;
しかし、
一見して分かるとおり、いきなり return; しているので実際は何も返さない処理になっています。
なので、<$MTAddTagTEST$>は何も出力されないテンプレートタグとなりそうです。
ところがどっこい、これが、そうはなりません。
太字にしている、return; という箇所に注目して頂きたいのですが、変数タグに何も出力しない場合は、ここを以下のように記述しなければなりません。
地味ですが、引数の「''」(シングルクオート2個、もちろんダブルクオート2個でもOK)があるとないとで大違いなのです。
「''」がなくてもPerlの文法上問題はないし、プラグインとしても認識されるので気付きにくいですが、MovableTypeの内部的にはエラーで処理が止まるようです。
以下のページからヒントを得ました。
ある条件に基づいては何も挿入したくないということがあるでしょう。そのような場合は、定義されていない値ではなくnull文字列を返さなければなりません。プラグインから返された定義されていない値はエラーとして扱われ、処理を停止させます。
ある条件の時は変数タグに値を設定するけれど、ある条件のときは何も出力しない、という処理を作成する際は注意が必要ですね。
変数タグで何も出力しないコード・サンプル(正しいバージョン)
use strict;
use MT::Template::Context;
use base qw( MT::Plugin );
my $plugin = new MT::Plugin ({
name => 'AddTagTEST',
description => 'test of add_tag plugin'
});
MT->add_plugin($plugin);
MT::Template::Context->add_tag(AddTagTEST => \&test);
sub test {
return '';
}
1;
