2007年10月22日(月) 16:55

MovableTypeの変数タグ プラグインの開発でハマッたメモ

どこかに普通に書いてることかもしれませんが、ハマったのでメモ。

下記のコードは、MovableTypeのテンプレート・タグ(変数タグ) <$MTAddTagTEST$> を処理するプラグインです。

package MT::Plugin::AddTagTEST;

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; という箇所に注目して頂きたいのですが、変数タグに何も出力しない場合は、ここを以下のように記述しなければなりません。

return '';


地味ですが、引数の「''」(シングルクオート2個、もちろんダブルクオート2個でもOK)があるとないとで大違いなのです。
''」がなくてもPerlの文法上問題はないし、プラグインとしても認識されるので気付きにくいですが、MovableTypeの内部的にはエラーで処理が止まるようです。


以下のページからヒントを得ました。

ある条件に基づいては何も挿入したくないということがあるでしょう。そのような場合は、定義されていない値ではなくnull文字列を返さなければなりません。プラグインから返された定義されていない値はエラーとして扱われ、処理を停止させます。


ある条件の時は変数タグに値を設定するけれど、ある条件のときは何も出力しない、という処理を作成する際は注意が必要ですね。


変数タグで何も出力しないコード・サンプル(正しいバージョン)

package MT::Plugin::AddTagTEST;

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;


このエントリーに最初のコメントを書いてみませんか?

名前  クッキーに保存 
エントリーナビ
MovableTypeの変数タグ プラグインの開発でハマッたメモ」は、
Movable Typeの技(3.Xまで) カテゴリーの記事です。


関連エントリー
簡単!Movable Type3テンプレートのモジュール管理
MovableType4対応 dopvSTAR*のログ取得プラグイン
リンクをリダイレクトするプラグイン for Movable Type
Movable Typeを愛でつつむ LOVEプラグイン
タグでブログ内リンク

トラックバック
このエントリーへトラックバックするURL (言及リンクのないトラックバックは無効です)