MovableType プラグインの作り方 - 第4回:その他の機能1

Posted by
ぴろり
Posted at
2006/04/02 14:46
Trackbacks
関連記事 (0)
Comments
コメント (2)
Post Comment
コメントできます
Category
MovableType カテゴリ

 何とか無事に折り返せました。連載4回目です。今回はプラグインの本機能ではないものの、プログラム上重要なエラー処理について説明します。ソフトウェアプログラムの 80% はエラー処理だ、と言われるほど重要なものですが、私の書くプログラムの 80% は遊び心で出来ています(謎)
 ...それと今回は、プラグインの永続化データについても説明します。これを使うことでプラグイン毎に変数の値や設定内容を記憶しておくことができます。揮発してしまう普通の変数とは異なり、データファイルのようにその値を永続的に保持できるという特徴があります。

このエントリーをはてなブックマークに追加  

エラー処理

 MT のにおいて、エラー処理は頻繁にお世話になるものの一つでしょう。 具体的な例を挙げれば、 <$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;

コードの詳細

my $build_count = load_plugindata ('BuildCount');
現在のの永続化データから、BuildCount と云う名前のデータを読み出し、 $build_count に代入します。
$build_count = 0 if (!defined $build_count);
指定された名前の永続化データが無い場合、$build_count を 0 で初期化します。
$build_count++;
save_plugindata ('BuildCount', $build_count);
$build_count を 1 だけ増し、 その値を BuildCount と云う名前で永続化データとして保存します。
use MT::PluginData;
MT::PluginData クラスの使用を宣言します。
sub load_plugindata
MT::PluginData を使用して、現在のの永続化データのうち、 第一引数($key) で指定された名前のデータを取得します。 指定されたデータが無い場合は undef を返します。 このサブルーチンは他にもそのまま流用できそうですね(^^)b
sub save_plugindata
MT::PluginData を使用して、 第二引数($data) で指定されたデータを、 第一引数($key) で指定された名前で永続化データとして保存します。 同じ名前の永続化データがある場合は、新しいデータで上書きされます。 このサブルーチンは他にもそのまま流用できそうですね(^^)b
my $plugindata = MT::PluginData->load ({ plugin => __PACKAGE__, key => $key })
 この(plugin)に割り当てられた、 key と云う名前のデータを読み込みます。 plugin を適当に設定することで、 自分以外の他ので使用されている永続化データを読み込むことも可能です。

 の永続化データは、毎に設定画面のあるものが、その設定内容を記憶しておき、 の動作時にその設定データを使用する場合などに使用されます。

サンプルファイルの

 この記事で使用したのプログラムコードを ダウンロードできます。
このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:MovableType プラグインの作り方 - 第3回:フィルタ

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

寄せられたコメント (全 2 件中、最新 5 件まで表示しています)

Posted by
ぴろりぴろり
at
2006/05/20 15:20
ID
/WKfLhV6
ここで紹介している save_plugindata のコードについて、
MT3.2では正しく動作しますが、MT3.1xでは参照の問題で正しく動作しません。
どうやら変数を参照で渡さないとダメみたいです…
参照渡しにしておけば、何れのバージョンでも動作します。
調査不足です。すみません。
Posted by
はみちゃはみちゃ
at
2006/05/10 09:37
ID
bX1j9u2s
いままで見たどのプラグインの書き方コーナーよりもわかりやすいです。
次回はBigPAPIのようなので期待大!
もう待ちきれません。w

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。