MTCollateのススメ

私は現在、仕事でMovableType(以下MTと略記)を触っています。
MTを利用したブログサイトの構築がメインですが、MTをCMSとして利用した、普通のWebサイトにブログを組み込んだような形の統合型サイトもよくあります。

そうした「一工夫加えたサイト」を構築するときに、便利なプラグインや、標準だとやりにくい手の届かないところに役立つ孫の手のようなプラグインがあります。
使い方を覚えると、便利なもんだから使い回ししちゃうんですよね。

今回は、そんな「孫の手」的なプラグインの紹介。
仮想コレクション(リスト)を生成し、自由な順序で表示(リストアップ)できる、「MTCollate」プラグインです。

ダウンロード・インストール

MTCollate公開サイトの Download リンクをクリックして、"MTCollate.zip"をダウンロードします。
(バージョン:1.1(2006/08/07現在))

解凍すると、ただひとつのファイル MTCollate.pl が生成されます。
これをMTのプラグインフォルダ([MT]/plugins/)にコピー(アップロード)すれば、インストールはOK。
念のため、MTのプラグイン管理画面を開いて MTCollate が表示されることを確認しましょう。

使い方0:基本概念

MTCollateは、まとまった情報をリストアップするためのプラグインです。
↑この日本語の説明だけではわかりにくいかもしれませんので、比較例。
<MTEntries>~</MTEntries>を使用すると、投稿したエントリーの情報が順次取り出せます。
取り出せる情報は、エントリーID、タイトル、内容、追記、投稿日、更新日など、ひとつの「エントリー」に関連づいているさまざまな情報です。
これと同じ感覚に、ある一連の「情報」に対して、それに関連づいたさまざまな情報をリストアップすることができるのが、MTCollateです。

MTCollateプラグインは、いくつかのオリジナルタグをMTに追加します。
つまり、テンプレート構築時に使用するプラグインです。
それらの追加タグは、大きく分けて二種類に分かれます。

  1. 情報を収集し、コレクション(リスト)を作るタグ
  2. リストを列挙し、情報を表示(リストアップ)するタグ

つまり、いきなり<MTEntries>に対応するものからはじめることはできず、その前にリストを自分で作る必要があります。

使い方1:リストを作る

リストを作るタグは、以下の3つです。

<MTCollateCollect>
コレクション(リスト)を定義するコンテナタグ
<MTCollateRecord>
コレクションの1レコード(関連する情報の集まり)を定義するコンテナタグ
<MTCollateSetField>
レコードのフィールド(個々の情報)を定義するコンテナタグ

データベースの知識がある方は、Collectionをテーブル(というよりむしろビュー)、Recordをレコード、Fieldをフィールドに対応付ければ直感的に理解しやすいと思います。
また、Excelでいえば Collection がワークシート、Recordが行(1~65535)、Fieldが列(A~IV)に対応するものだと考えれば理解の助けになるかもしれません。

例として、<MTEntries>から情報を抜き出すコレクションを定義してみます↓

<MTCollateCollect name="RecentEntryModified">
    <MTEntries days="31">   --[1]
        <MTCollateRecord>
            <MTCollateSetField name="SortKey"><$MTEntryModifiedDate format="%Y%m%d%H%M%S"$></MTCollateSetField>
            <MTCollateSetField name="EntryDate"><$MTEntryDate format="%Y/%m/%d"$></MTCollateSetField>
            <MTCollateSetField name="Excerpt"><$MTEntryExcerpt$></MTCollateSetField>
            <MTCollateSetField name="Title"><$MTEntryTitle$></MTCollateSetField>
            <MTCollateSetField name="Permalink"><$MTEntryPermalink$></MTCollateSetField>
        </MTCollateRecord>
    </MTEntries>
</MTCollateCollect>
  • <MTCollateCollect>のname属性は必須ではありません(1つのテンプレートに1つしかコレクションを定義しない場合)が、あとでソースを見てわかりやすいように、常に名前をつけておくことをオススメします。
  • [1] このように<MTCollateCollect>のあとに<MTEntries>等の他のコンテナタグを入れ、その中に<MTCollateRecord>を入れるのが常套手段。
  • フィールドに設定する名前(name属性値)は、このように元となる情報に関連するもの(この場合、情報を取り出す変数タグの共通のprefixを取り除いた名前)にするとわかりやすいです。
  • <MTCollateCollect>の中には<MTCollateRecord>を複数入れることも可能。その際は各<MTCollateRecord>の中の<MTCollateSetField>の構成を同じように(少なくともキーとなるフィールドは共通に)しておくことをオススメ。でも(キーでなければ)必須ではありません。

この例は、最近31日間のエントリーの、更新日時・投稿日・タイトル・概要・固定リンクを収集しています。

使い方2:リストを表示する

リストを表示するタグ(主なもの)は、以下の4つです。

<MTCollateList>
コレクション(リスト)を列挙するコンテナタグ
<$MTCollateField$>
コレクションの現在のレコードに属するフィールドの値を表示する変数タグ
<MTCollateIfHeader>
最初のレコードかどうかを判定する条件タグ
<MTCollateIfFooter>
最後のレコードかどうかを判定する条件タグ

先ほどのエントリーのコレクションを表示する例を示します:

<MTCollateList name="RecentEntryModified" limit="10" sort="SortKey:-">
    <MTCollateIfHeader>
        <ul>
    </MTCollateIfHeader>
    <li><a href="<MTCollateField name="Permalink">"><MTCollateField name="Title"></a>[<MTCollateField name="EntryDate">]<br />
    <MTCollateField name="Excerpt">
    <MTCollateIfFooter>
        </ul>
    </MTCollateIfFooter>
</MTCollateList>
  • <MTCollateList>のname属性には、<MTCollateCollect>で定義した名前(name属性値)を指定します。
  • <MTCollateList>にlimit属性やsort属性を指定することで、かなり細かいソート・抜出ができます。offset属性もあり。
  • <MTCollateSetField>で設定したフィールド値は<$MTCollateField$>で取り出します。この際、name属性に指定した値のフィールドがない(対応する<MTCollateSetField>が存在しない)場合は、空の文字列が出力されます(エラーにはなりません)。

この例は、定義されたコレクションのうち、SortKeyの降順(=更新日時の新しい順)に10件だけデータを表示しています。

前の「リストを作る」から合わせると結果として、この例は、「最近31日のエントリーの中から、最近更新された10件の記事の情報をその順に表示」していることになります。

使い方の発展へのヒント

今回挙げた例はエントリーだったので、「<MTEntries>だけでもできるんじゃない?」て思われた方もいらっしゃるかもしれません。
(実際には、<MTEntries>のdays属性は他の属性と併用すると無効になってしまうので、同じことを<MTEntries>だけでは実現できません。)
でも、ほかにもこんな応用例があります:

  • すべてのエントリーからコメントを取り出して、最近のコメントから順に表示する
  • すべてのエントリーをカテゴリーごとに分けてすべて列挙する
  • 複数のブログからエントリーを抜き出して、ブログの違いにかかわらず最近投稿されたものから順に表示する

これらは、言葉で書くのは簡単ですが、標準のMTタグのみでは実現は困難あるいは不可能です。
こういった場合は、MTCollateプラグインを使用すれば解決することができます。

詳しい使用方法は、MTCollateのサイトを参考にしてください(英語です)。

トラックバックURL

このエントリーのトラックバックURL:
http://www.antimon2.atnifty.com/mt/mt-tb.cgi/29

トラックバック

» MTCollateの落とし穴 from あんちもん2.Lab
MTCollateでソートをする際、日本語の文字列を含むフィールドは要注意。サーバがダウンする可能性があります。 続きを読む

コメントする