技術情報提供ブログ

テンプレート・タグ(コンテナ・タグ) プラグインの開発

シックス・アパートの柳下(やぎした)です。時間があいてしまいましたが、第5回目の今回は、MTEntriesのようなコンテナ・タグの開発についてお話したいと思います。コンテナ・タグは、テンプレート内でループ処理を実行するため、エントリーやコメントの一覧を表示できます。今回は、テンプレートのリストに対して処理するコンテナ・タグ、MTTemplatesを開発することとしましょう。

テンプレート・タグの引数とstashメソッド

最初に、テンプレート・タグの引数について解説します。変数タグコンテナ・タグを処理するサブルーチンには、次の引数がわたされます。

引数(変数タグ・コンテナ・タグ)
No.引数名解説
1$ctxMT::Template::Contextオブジェクト
2$args属性に関するハッシュ(連想配列)
3$condトークンを解釈する条件のリスト(オプションの引数)詳細は、MT::Builderのbuildを参照してください。

たとえば、<MTEntries lastn="15">と指定した場合、$args->{lastn}と記述することで、15を取得できます。

テンプレート・タグ内で、現在処理中のMovable Typeのオブジェクトにアクセスするには、MT::Template::Contextstashメソッドを利用します。たとえば、$ctx->stash('blog')と記述すると、MT::Blogオブジェクトにアクセスできます。また、コンテナ・タグ内で有効な変数タグで、後から利用できるように、自身の情報を格納しておくこともできます。

早速、これらを使ってコンテナ・タグを開発してみましょう。

コンテナ・タグ: MTTTemplatesの開発

コンテナ・タグの例として、特定のブログのテンプレートのリストに対して処理するコンテナ・タグMTTemplatesを作ってみましょう。

コンテナ・タグの登録は、MT::Template::Contextadd_container_tagメソッドを利用します。

MT::Template::Context->add_container_tag(
    Templates => \&templates);

MTTemplatesタグの処理について、解説します。次のソースをご覧ください。

MTTemplate(1)
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::Builderbuildメソッドを利用し、格納したオブジェクトから出力ページとなるスカラー文字列を構築しています。これにより、他のタグがオブジェクトの値を取得できるようになります。buildメソッドでは、空文字列と数字のメソッドの戻り値として有効なため、未定義(undef)の時のエラー処理を定義しています。

コンテナ・タグ内で有効な変数タグの開発

コンテナ・タグ内で有効な変数タグの例として、テンプレートの名前を出力する変数タグMTTemplateNameを作ってみましょう。一般的な変数タグと異なり、コンテナタグ内で有効な変数タグには、コンテナ外で指定されたときのエラー処理を追加する必要があります。このエラー処理を追加することで、再構築時にエラーとして終了することができ、変数タグの誤った利用を防ぐことができます。次のソースをご覧ください。

MTTemplate(2)
2行目

引数を取得します。

3-4行目

格納しているMT::Templateオブジェクトを取得します。ポイントは、コンテナ外でこのタグが使われているときのエラー処理を4行目で宣言していることです。

エラー処理は、MT::Template::Contextのerrorメソッドを利用します。errorメソッドは、エラーメッセージを表示する簡単なもののため、多言語で表示するために、MT->translateで処理した文字列を指定しています。この例では、汎用的な処理のために、_no_template_errorというメソッドを用意しています。

MTTemplatesタグの動作を確認するために、テスト用のインデックス・テンプレートを新規に作成し、以下のコードを記述して動作を確認します。

MTTemplate(3)

次のように出力します。

MTTemplate(4)

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

MTTemplate(5)

まとめ

今回は、テンプレート内でループ処理を実行するコンテナ・タグの開発について、以下の内容をご紹介しました。

  • テンプレート・タグの引数とstashメソッド
  • コンテナ・タグの登録方法について
  • コンテナ・タグの開発について
  • コンテナ・タグ内で有効な変数タグの開発について

また、今回のサンプルプラグインは、次のようにダウンロードできます。

次回は、条件タグの開発について解説します。

プラグイン開発ステップ・バイ・ステップ インデックス

  • 投稿者 yagishita
  • カテゴリー Plugin

トラックバック

トラックバック URL

このページのトップへ