何とか無事に折り返せました。連載4回目です。今回はプラグインの本機能ではないものの、プログラム上重要なエラー処理について説明します。ソフトウェアプログラムの 80% はエラー処理だ、と言われるほど重要なものですが、私の書くプログラムの 80% は遊び心で出来ています(謎)
...それと今回は、プラグインの永続化データについても説明します。これを使うことでプラグイン毎に変数の値や設定内容を記憶しておくことができます。揮発してしまう普通の変数とは異なり、データファイルのようにその値を永続的に保持できるという特徴があります。
<$MTCalendarDay$>
変数タグが
<MTCalendar>
コンテナタグの外で使われた場合や、
タグの動作に必須のパラメータが指定されていなかったり、
パラメータに指定された値が範囲外であった場合など、
異常の発生をユーザに知らせるために重要な役割を果たします。次のコードは無条件でエラーを発生させる変数タグです(sample_4_1.pl)。 エラーの発生方法が異なるので、エラーメッセージの表示のされ方が異なります。
package MT::Plugin::myplugin_4_1; use MT::Template::Context; MT::Template::Context->add_tag (Error => &error); MT::Template::Context->add_tag (ErrorUndef => &error_undef); MT::Template::Context->add_tag (ErrorDie => &error_die); sub error { my ($ctx, $args) = @_; return $ctx->error ('*** Error Messages ***'); } sub error_undef { my ($ctx, $args) = @_; return undef; } sub error_die { die '*** Error Messages ***'; } 1;これらの変数タグで発生させたエラーは、それぞれ下のように表示されます。
$ctx->error
を使うことで、
発生したエラーの詳細や対処方法などをユーザに知らせることができるので、
通常はこちらを使うのが賢明です。die
によるエラーは、
一般のユーザにしてみれば不親切極まりないですが(笑)、
エラーが発生したファイル名と行番号をプリントしてくれるので、プラグインの開発中は有用でしょうか。
MT::PluginData
を使用して、データを永続化しておく必要があります。<MTBuildCount>
変数タグのサンプルです(sample_4_2.pl)。
現在までの構築回数を MT::PluginData
を使用して永続化しています。
package MT::Plugin::myplugin_4_2; use MT::Template::Context; MT::Template::Context->add_tag (BuildCount => &build_count); sub build_count { my ($ctx, $args) = @_; my $build_count = load_plugindata ('BuildCount'); $build_count = 0 if (!defined $build_count); $build_count++; save_plugindata ('BuildCount', $build_count); return $build_count; } use MT::PluginData; sub load_plugindata { my ($key) = @_; my $plugindata = MT::PluginData->load ({ plugin => __PACKAGE__, key => $key }) or return undef; return $plugindata->data; } sub save_plugindata { my ($key, $data) = @_; my $plugindata = MT::PluginData->load ({ plugin => __PACKAGE__, key => $key }); if (! $plugindata) { $plugindata = MT::PluginData->new; $plugindata->plugin (__PACKAGE__); $plugindata->key ($key); } $plugindata->data ($data); $plugindata->save; } 1;
BuildCount
と云う名前のデータを読み出し、
$build_count
に代入します。
$build_count
を 0 で初期化します。
$build_count
を 1 だけ増し、
その値を BuildCount
と云う名前で永続化データとして保存します。
MT::PluginData
クラスの使用を宣言します。
MT::PluginData
を使用して、現在のプラグインの永続化データのうち、
第一引数($key
) で指定された名前のデータを取得します。
指定されたデータが無い場合は undef
を返します。
このサブルーチンは他にもそのまま流用できそうですね(^^)b
MT::PluginData
を使用して、
第二引数($data
) で指定されたデータを、
第一引数($key
) で指定された名前で永続化データとして保存します。
同じ名前の永続化データがある場合は、新しいデータで上書きされます。
このサブルーチンは他にもそのまま流用できそうですね(^^)b
plugin
)に割り当てられた、
key
と云う名前のデータを読み込みます。
plugin
を適当に設定することで、
自分以外の他のプラグインで使用されている永続化データを読み込むことも可能です。
プラグインの永続化データは、プラグイン毎に設定画面のあるものが、その設定内容を記憶しておき、 プラグインの動作時にその設定データを使用する場合などに使用されます。
寄せられたコメント (全 2 件中、最新 5 件まで表示しています)
MT3.2では正しく動作しますが、MT3.1xでは参照の問題で正しく動作しません。
どうやら変数を参照で渡さないとダメみたいです…
参照渡しにしておけば、何れのバージョンでも動作します。
調査不足です。すみません。
次回はBigPAPIのようなので期待大!
もう待ちきれません。w