演習:特定カテゴリ下のサブカテゴリのリストを指定数でグループ化して出力する
Movable Typeのコミュニティサイト、MTQで質問のあったケースの演習をおこないました。
すでに模範解答がでているようですので、詳細はそちらに譲ります。このような場合は剰余演算を使って行なうのが通例のようです。
__counter__、__last__ といった特殊な変数が利用できないケースでは、変数をセットして自前のカウンターを用意する必要があるのでこれがプログラミング的要素がでてきて厄介なのであります。
ここでは、余りを求めないでおこなうというやり方でやってみるという課題にしておきます。
考えたこと
- ループの4回目の先頭に</ul> がつくというルールにすればいい(わりとこういう考え方がポイント)。
- カウント数は変数なので使い回していく
- リストを出力させるごとに、カウンターを 0・1・ 2 ...という具合に振っていく
- カウンターが 3(つぎのグループの先頭) になったら </ul>をつけて カウンター0 からスタートさせる
作成したテンプレートサンプル
- ※テスト環境用のモノなので実際の運用のための最適化をしていません。
- ※先の命題のとおりで、ある親カテゴリ下に属する子カテゴリのみをリスト表示するためだけのテンプレートです。
- ※ 条件判断のMT:Unlessは好みでそうしているだけなので、MT:Ifでnot equal な判断でも同じです
<h3>サブカテゴリのリスト</h3> <mt:Setvar name="cont" value="0"> <MTSubCategories category="サブカテゴリの親のカテゴリ"> <mt:If name="cont" eq="0"> <ul class="group"> </mt:If> <li><$mt:CategoryLabel$> ($contの値=<$mt:Var name="cont"$>)</li> <mt:Unless name="cont" eq="3"><mt:SetVar name="cont" value="1" op="+"></mt:Unless> <mt:If name="cont" eq="3"> <mt:SetVar name="cont" value="0"> </ul> </mt:If> <mt:SubCatIsLast></ul></mt:SubCatIsLast> </MTSubCategories>
処理の流れを文章化してみた
カウンターを 0 にセットしておく ==ここからループ開始 == カウンターが 0 であるか ? Yes -> </ul> をつける ↓ No -> カテゴリラベルを表示 ↓ カウンターが 3 ではない ? Yes -> カウンターに1を足す ↓ カウンターは 3 である(== 4番目のリストである ) ? Yes -> カウンターを 0 にもどす </ul> をつける ↓ No ↓ サブカテゴリリストの最後か? No -> ループのはじめに戻る ==> ↓ Yes -> </ul> をつける。ループの終了
一見、子カテゴリがちょうど3の倍数であったときに、リストの閉じタグ(</ul>)が重複するのでないか、という風に見えますけれども、先にいったとおりに、次のグループの先頭に</ul> を入れるというルールにしてあるので、ループが子カテゴリの最後になったときは次のグループが存在しないために</ul>は振られません。その代わりとしてmt:SubCatIsLast
の条件において</ul>を振るということにしてあります。
但し。。
この方法だと、セットした変数にリセットをかけていますから、カウントの変数の値を使ってユニークなIDを振るといった処理には適用できません。
そのような時は、普通にカウントをインクリメントにして剰余を求めたほうがいいです。
Trackbacks:0
- TrackBack URL for this entry
- https://www.markdiary.com/mt/app-pingback.cgi/76
- Listed below are links to weblogs that reference
- 演習:特定カテゴリ下のサブカテゴリのリストを指定数でグループ化して出力する from maRk lab
Comments:0