オブジェクトをグループ分けして出力する

MTQに、「ユーザーをグループに分けて出力したい」といった内容の質問がありました。
この質問に答えます。

1.カスタムフィールドでグループを表す

まず、オブジェクトにグループ分けのためのカスタムフィールドを追加します。
カスタムフィールドはドロップダウン型にして、グループ名をその選択肢にします。

ご質問の例だと、ユーザーをグループに分けたいとのことでした。
この場合だと、ユーザーのオブジェクトに、グループを表すドロップダウン型のカスタムフィールドを追加し、「オプション」の欄に個々のグループ名をカンマ区切りで並べます。
そして、個々のユーザーで、そのカスタムフィールドの値(グループ名)を指定します。

2.グループ名ごとに配列に分ける

次に、テンプレートを組んで、グループごとにオブジェクトを出力できるようにします。
グループ分けしたいオブジェクトをすべて読み込み、グループ名と同名の配列に、出力したい情報を追加していきます。

たとえば、以下のように、ユーザーが5人いて、赤/青/黄の3つのグループに分かれているとします。

ユーザー名グループ名
山田
鈴木
高橋
斎藤
田中

この場合、「赤」という名前の配列は、以下のように作ります。

インデックス内容
0山田さんの情報を出力するHTML等
1高橋さんの情報を出力するHTML等

同様に、「青」の配列と、「黄」の配列は、それぞれ以下のようになります。

「青」の配列

インデックス内容
0鈴木さんの情報を出力するHTML等
1田中さんの情報を出力するHTML等

「黄」の配列

インデックス内容
0斎藤さんの情報を出力するHTML等

また、後で各グループの情報を出力するために、グループ名の情報も必要です。
そこで、グループ名をハッシュに保存します。
ハッシュのキーをグループの名前とし、値を1にします。
こうしておけば、ハッシュのキーを順に取り出すことで、グループ名を得ることができます。

3.情報を出力する

最後に、2.の手順で作った配列とハッシュを元に、各グループの情報を出力します。
グループ名の情報をgroupsというハッシュに保存したとすれば、以下のようなテンプレートで出力できます。

<mt:Loop name="groups">
  グループ名(変数__key__の値)等を出力
  <mt:Loop name="$__key__">
    グループの各オブジェクトの情報(変数__value__の値)等を出力
  </mt:Loop>
</mt:Loop>

外側のMTLoopタグで、ハッシュgroupsの要素を1つずつ取り出しながら繰り返します。
ハッシュのキーをグループ名にしたので、変数__key__の値がグループ名になります。

次に、内側のMTLoopタグで、各グループの配列から、オブジェクトの情報を順に出力します。
配列の名前をグループ名(=ハッシュのキー=変数__key__の値)にしたので、MTLoopタグのnameモディファイアを「$__key__」にしています。

4.事例

質問の事例だと、以下のようにテンプレートを組むと良いでしょう。

<mt:Authors need_entry="0">
  <$mt:AuthorGroup setvar="group"$>
  <$mt:SetVar name="groups" key="$group" value="1"$>
  <mt:If name="group">
    <mt:SetVarBlock name="$group" function="push">
      <p><$mt:AuthorLastname$> <$mt:AuthorFirstname$>
      <img src="<$MTAuthorUserpicURL$>" width="100" height="100" alt="" /></p>
    </mt:SetVarBlock>
  </mt:If>
</mt:Authors>
<mt:Loop name="groups">
  <h1><$mt:GetVar name="__key__"$></h1>
  <mt:Loop name="$__key__">
    <$mt:GetVar name="__value__"$>
  </mt:Loop>
</mt:Loop>

4-1.前半

前半(10行目まで)は、MTAuthosタグのブロックでユーザーを読み込んで、グループ名のハッシュと、各グループの配列を作る処理です。
グループ名のカスタムフィールドでは、テンプレートタグ名を「MTAuthorGroup」にしているものとします。

2行目で、グループ名(MTAuthorGroupタグ)を変数groupに代入します。
3行目で、ハッシュgroupsに、キーが変数groupの値(=グループ名)で、値が1の要素を作ります。
5~8行目では、グループ名(変数groupの値)と同じ名前の配列に、ユーザーの情報を追加します。
ただし、ユーザーによってはグループに割り当てられていない(=変数groupに値がない)こともあり得ますので、4行目のMTIfタグで、グループに割り当てられているユーザーだけ、5~8行目を処理します。

4-2.後半

後半(11行目以降)は、ハッシュと配列から、各グループの情報を出力する処理です。

11行目のMTLoopタグで、ハッシュgroupsの要素を順に取り出しながら繰り返します。
12行目で、変数__key__(=グループ名)を出力します。
13行目のMTLoopタグで、名前が変数__key__の値になっている配列(=各グループの配列)から、要素(=ユーザーの情報を出力するHTML等)を順に取り出しながら繰り返します。
そして、14行目で、各ユーザーの情報を出力します。

5.配列やハッシュは必須

Movable Type 5.1 Webサイト製作ガイドVolume 2この例のように、手の込んだ処理をしようとすると、配列やハッシュを避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、配列やハッシュについて、かなり詳しく解説しています。
「配列やハッシュがよく分からない」という方は、ぜひ拙著をお読みください。

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください