拙著「個人投資家は低位株で儲けなさい」が発売されました。
株価が安い「低位株」に投資する方法を解説しています。
自由国民社刊で、定価1,512円(消費税込み)です。
オブジェクトをグループ分けして出力する
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」では、配列やハッシュについて、かなり詳しく解説しています。
「配列やハッシュがよく分からない」という方は、ぜひ拙著をお読みください。
