Movable Typeのデータベースに対し任意のフィールドデータを取得できる「Object プラグイン」
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 プラグインのページにある「ダウンロード」をクリックして、プラグインアーカイブをダウンロードします。
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項の説明に一部誤りがありましたので修正しました。
- 小粋空間プラグインのMovable Type8対応状況
- 2013年にリリースしたMovable Type(MT)プラグイン一覧
- 2012年にリリースしたMovable Type(MT)プラグイン一覧
- Movable Typeの記事データをCSV形式でエクスポート・インポートできる「CSVDataImExporterプラグイン」
- 2011年作成のMovable Type(MT)プラグイン一覧
- Movable Typeでブログ権限付与時に親ウェブサイト名を表示する「AssociationBlogDiscriminatorプラグイン」
- Movable Typeで使っているスタイルを表示する「CurrentStyleプラグイン」
- Movable Type 5でお気に入りリストが作れる「Linklistプラグイン」
- Movable Typeのコミュニティ機能などを使ったユーザー登録時、同一メールアドレスのユーザー有無をチェックする「UserEmailCheckerプラグイン」
- ブログ記事削除後の遷移画面を指定できる「ReturnArgsChangerプラグイン」
- Movable Typeの「ユーザー」ロールにコメントの公開権限を与える「ApproveCommentPermissionプラグイン」
- Movable Typeのカスタムフィールドで入力したデータの重複チェックを行う「CustomFieldDataCheckerプラグイン」
- Movable Typeのカスタムフィールドを一覧に表示する「ListingCustomFieldプラグイン」
- CommentAuthorIdentityプラグイン
- 2010年作成のMovable Type(MT)プラグイン一覧
相変わらず、素早いですね。
時々、「この持ってる値を、出力したいんだよ」とか思うので、かなりこのプラグインを使いそうです。
>oscarさん
おはようございます&コメントありがとうございます。
ブロックタグの方は、設定したモディファイアの値を出力条件に取り込めるよう、もう少し作り込んでみたいと思ってます。