Movable Typeのデータベースに対し任意のフィールドデータを取得できる「Object プラグイン」

Movable Typeのデータベースに対し任意のフィールドデータを取得できる「Object プラグイン」

Posted at November 9,2010 12:55 AM
Tag:[MovableType, Object, Plugin]

Movable Typeのデータベースに対し、任意のフィールドを指定してデータを取得できるプラグインを作ってみました。お遊び的なものですが、提供されていないテンプレートタグの代替テンプレートタグとしての利用が可能かもしれません。

MTQに「アイテムの更新日付を取得するタグを機能追加してほしいです」という要望があり、そこにoscarさんの「MTAssetPropertyタグで出力出来ちゃうみたいです」という回答で閃いて作ってみました。

1.機能

このプラグインは、Movable Typeのオブジェクトデータを取得するためのMTObjectsブロックタグとMTObjectファンクションタグを提供します。具体的な使い方は4項をご覧ください。

例えば、アイテムの更新日時を取得するタグは提供されていませんが、次のようにMTObjectファンクションタグを使えば取得することができます(ただし出力結果の整形は別途必要)。

<mt:Assets>
  <mt:Object name="asset" property="modified_on" />
</mt:Assets>

最初は既存のMTObjectファンクションタグだけにしていたのですが、実験的な意味でMTObjectsブロックタグも付け加えました。ブロックタグ名は複数形の「Objects」にしていますが、ちょっと不自然な感じもするので変更するかもしれません。

2.プラグインのダウンロード

GithubのObject プラグインのページにある「ダウンロード」をクリックして、プラグインアーカイブをダウンロードします。

GithubのObject プラグインのページ

3.プラグインのインストール

プラグインアーカイブを展開し、中にある Object フォルダごと、Movable Type のアプリケーションディレクトリの plugins ディレクトリにアップロードします。

システム管理画面のプラグイン一覧で、「Object~」が表示されればインストール完了です。

システム管理画面のプラグイン一覧

4.テンプレートタグの使い方

ブロックタグのMTObjectsタグにはnameモディファイアを与えます。モディファイアの値にはデータベースのテーブル名から「mt_」を除いた名称(=datasource名)を設定します。これにより、該当のテーブルの内容を取得します。

例えば、記事オブジェクトのテーブルは、「mt_entry」なので、設定する値は「entry」となり、次のように設定します。

<mt:Objects name="entry">
…中略…
</mt:Objects>

MTObjectファンクションタグには、nameモディファイアとpropertyモディファイアの2つのモディファイアを設定します。nameモディファイアの値には、MTObjectsタグのnameモディファイア、またはMTObjectタグを括っているブロックタグのstashのキーを設定し、propertyモディファイアには、テーブルのフィールド名から「datasource名_」を除いた名称を設定します。

例えば、記事タイトルを出力する場合、タイトルに該当するフィールド名は「entry_title」なので、設定する値は「title」となります。

MTObjectタグは、MTObjectsタグで括る方法と既存のブロックタグ(ここではMTEntries)で括る方法の、2通りの書き方が可能です。

<mt:Objects name="entry">
  <mt:Object name="entry" property="title" />
</mt:Objects>
<mt:Entries>
  <mt:Object name="entry" property="title" />
</mt:Entries>

「stash」は、MTの内部処理で異なるテンプレートタグ(ここではブロックタグとファンクションタグ)間でデータを引き継ぐためのメソッドで、記事データであれば、stashメソッドに「entry」というキーを与えることで、記事オブジェクトのデータを取得することができます。

キーの値は(多分)datasource名と等しいと思うので、ソースコードをトレースしなくても大丈夫だと思います。設定値は次項を参照してください。

5.サンプル

各オブジェクトを取得するサンプルを示します。カッコ内はファンクションタグで取得しているフィールドです。

コメント(本文)

<mt:Comments>
  <mt:Object name="comment" property="text" />
</mt:Comments>
<mt:Objects name="comment">
  <mt:Object name="comment" property="text" />
</mt:Objects>

カテゴリ(カテゴリ名)

<mt:Categories>
  <mt:Object name="category" property="label" />
</mt:Categories>
<mt:Objects name="category">
  <mt:Object name="category" property="label" />
</mt:Objects>

アイテム(名前)

<mt:Assets>
  <mt:Object name="asset" property="label" />
</mt:Assets>
<mt:Objects name="asset">
  <mt:Object name="asset" property="label" />
</mt:Objects>

テンプレート(テンプレート名)

<mt:Objects name="template">
  <mt:Object name="template" property="name" />
</mt:Objects>

ユーザー(名前)

<mt:Authors>
  <mt:Object name="author" property="name" />
</mt:Authors>
<mt:Objects name="author">
  <mt:Object name="author" property="name" />
</mt:Objects>

ログ(メッセージ)

<mt:Objects name="log">
  <mt:Object name="log" property="message" />
</mt:Objects>

セッション(データ)

<mt:Objects name="session">
  <mt:Object name="session" property="data" />
</mt:Objects>

次のように特殊変数も使えます。

<mt:Objects name="entry">
  <mt:if name="__first__">first</mt:if>
  <mt:if name="__last__">last</mt:if>
  <mt:if name="__odd__">odd</mt:if>
  <mt:if name="__even__">even</mt:if>
  <mt:var name="__counter__">
  <mt:Object name="entry" property="title" />
</mt:Objects>

繰り返しにになりますが、MTObjectsブロックタグは実験的なものなので、細かい指定はできません。

2010.11.10
4項の説明に一部誤りがありましたので修正しました。

関連記事
zenback
人気エントリー
トラックバックURL


コメント

相変わらず、素早いですね。
時々、「この持ってる値を、出力したいんだよ」とか思うので、かなりこのプラグインを使いそうです。

[1] Posted by oscar logo : November 9, 2010 11:00 PM

>oscarさん
おはようございます&コメントありがとうございます。
ブロックタグの方は、設定したモディファイアの値を出力条件に取り込めるよう、もう少し作り込んでみたいと思ってます。

[2] Posted by yujiro logo : November 10, 2010 9:12 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)