技術情報提供ブログ
テンプレート・タグ(コンテナ・タグ) プラグインの開発
シックス・アパートの柳下(やぎした)です。時間があいてしまいましたが、第5回目の今回は、MTEntriesのようなコンテナ・タグの開発についてお話したいと思います。コンテナ・タグは、テンプレート内でループ処理を実行するため、エントリーやコメントの一覧を表示できます。今回は、テンプレートのリストに対して処理するコンテナ・タグ、MTTemplatesを開発することとしましょう。
テンプレート・タグの引数とstashメソッド
最初に、テンプレート・タグの引数について解説します。変数タグやコンテナ・タグを処理するサブルーチンには、次の引数がわたされます。
| No. | 引数名 | 解説 |
|---|---|---|
| 1 | $ctx | MT::Template::Contextオブジェクト |
| 2 | $args | 属性に関するハッシュ(連想配列) |
| 3 | $cond | トークンを解釈する条件のリスト(オプションの引数)詳細は、MT::Builderのbuildを参照してください。 |
たとえば、<MTEntries lastn="15">と指定した場合、$args->{lastn}と記述することで、15を取得できます。
テンプレート・タグ内で、現在処理中のMovable Typeのオブジェクトにアクセスするには、MT::Template::Contextのstashメソッドを利用します。たとえば、$ctx->stash('blog')と記述すると、MT::Blogオブジェクトにアクセスできます。また、コンテナ・タグ内で有効な変数タグで、後から利用できるように、自身の情報を格納しておくこともできます。
早速、これらを使ってコンテナ・タグを開発してみましょう。
コンテナ・タグ: MTTTemplatesの開発
コンテナ・タグの例として、特定のブログのテンプレートのリストに対して処理するコンテナ・タグMTTemplatesを作ってみましょう。
コンテナ・タグの登録は、MT::Template::Contextのadd_container_tagメソッドを利用します。
MT::Template::Context->add_container_tag(
Templates => \&templates);
MTTemplatesタグの処理について、解説します。次のソースをご覧ください。

- 2行目
引数を取得します。各引数の解説は、上の表のとおりです。
- 3-4行目
MT::Template::Contextのstashメソッドを利用し、トークンのリストと、MT::Builderオブジェクトを取得します。コンテナ・タグは一般的にループを実現するために用います。このため、サブルーチン内では、何らかの要素リストに関してループさせるループ構造を用意し、コンテナ・タグの内側で、各要素に対する表示を行うようなテンプレート・タグを用意することになります。こうした内側のテンプレート・タグは、トークン・リストとしてコンパイルされているため、MT::Builderオブジェクトを用いるだけで、このトークン・リストをスカラー文字列に変換し、出力に追加することができます。
- 5-6行目
load_iterメソッドを利用し、MT::Templateオブジェクトを取得します。オブジェクトを取得する際に、blog_idを指定することで、特定のブログを対象にします。また、取得したオブジェクトについて、名前(name)でソートしています。 load_iterメソッドの詳細は、MT::Objectを参照してください。
MT::Templateオブジェクトに格納されているテンプレートの種類は、次の表のとおりです。
種別 解説 index メインページなどのインデックス・テンプレート individual エントリー・アーカイブ category カテゴリー・アーカイブ archive 日付アーカイブ comment_preview システム・テンプレート(コメント・プレビュー) search_template システム・テンプレート(検索結果) comment_pending システム・テンプレート(コメント・保留) comment_error システム・テンプレート(コメント・エラー) popup_image システム・テンプレート(画像のポップアップ・ウィンドウ) comments システム・テンプレート(コメントの一覧) dynamic_error システム・テンプレート(ダイナミック・ページのエラー) pings システム・テンプレート(トラックバックの一覧) custom テンプレート・モジュール load_iterメソッドでオブジェクトを取得する際に、ブログIDの他にテンプレートの種類typeをindexと指定することで、MTIndexListタグと同等の処理になります。
- 8-13行目
取得したMT::Templateオブジェクトを、MT::Template::Contextオブジェクトに格納します。格納する際に、stashのキーとしてtmplを指定します。
11-12行目では、MT::Builderのbuildメソッドを利用し、格納したオブジェクトから出力ページとなるスカラー文字列を構築しています。これにより、他のタグがオブジェクトの値を取得できるようになります。buildメソッドでは、空文字列と数字のメソッドの戻り値として有効なため、未定義(undef)の時のエラー処理を定義しています。
コンテナ・タグ内で有効な変数タグの開発
コンテナ・タグ内で有効な変数タグの例として、テンプレートの名前を出力する変数タグMTTemplateNameを作ってみましょう。一般的な変数タグと異なり、コンテナタグ内で有効な変数タグには、コンテナ外で指定されたときのエラー処理を追加する必要があります。このエラー処理を追加することで、再構築時にエラーとして終了することができ、変数タグの誤った利用を防ぐことができます。次のソースをご覧ください。

- 2行目
引数を取得します。
- 3-4行目
格納しているMT::Templateオブジェクトを取得します。ポイントは、コンテナ外でこのタグが使われているときのエラー処理を4行目で宣言していることです。
エラー処理は、MT::Template::Contextのerrorメソッドを利用します。errorメソッドは、エラーメッセージを表示する簡単なもののため、多言語で表示するために、MT->translateで処理した文字列を指定しています。この例では、汎用的な処理のために、_no_template_errorというメソッドを用意しています。
MTTemplatesタグの動作を確認するために、テスト用のインデックス・テンプレートを新規に作成し、以下のコードを記述して動作を確認します。

次のように出力します。

また、MTTemplateNameタグを、MTTemplatesタグの外で記述し、エラーメッセージを表示してみましょう。再構築の途中で、エラー終了することがわかります。

まとめ
今回は、テンプレート内でループ処理を実行するコンテナ・タグの開発について、以下の内容をご紹介しました。
- テンプレート・タグの引数とstashメソッド
- コンテナ・タグの登録方法について
- コンテナ・タグの開発について
- コンテナ・タグ内で有効な変数タグの開発について
また、今回のサンプルプラグインは、次のようにダウンロードできます。
次回は、条件タグの開発について解説します。
プラグイン開発ステップ・バイ・ステップ インデックス
- 第1回 プラグイン開発のためのファーストステップ (2006.07.25公開)
- 第2回 テンプレート・タグ(変数タグ) プラグインの開発 (2006.08.04公開)
- 第3回 ローカライズ技術の解説 (2006.08.18公開)
- 第4回 フィルター プラグインの開発 (2006.09.01公開)
- 第5回 テンプレート・タグ(コンテナ・タグ) プラグインの開発 (2006.10.05公開)
- 第6回 テンプレート・タグ(条件タグ) プラグインの開発 (2006.10.05公開)
- 第7回 Transformerプラグインの開発 (2006.10.12公開)
- 投稿者 yagishita
- カテゴリー Plugin
トラックバック
トラックバック URL

