【Movable Type】ブログ一覧をID順で出力する
概要
MT(PowerCMS含む)においてブログ一覧を出力する際に、ブログID順で出力する方法について解説しています。
ブログやウェブサイトの一覧を出力するMTBlogsやMTWebsitesには、MTEntriesにおけるsort_byやsort_orderといったモディファイアが存在せず、一覧の並び順はブログ名を基準とした文字コードの昇順(管理画面のブログ一覧やウェブサイト一覧にデフォルトで表示されている順)で出力されます。
ブログやウェブサイトの一覧をID順で出力するには、ループ出力の部分をハッシュ(連想配列)としてデータ単位で格納し、MTLoop を使用して出力します。
この方法は、以前公開した複数のコンテンツタイプをまとめて出力する記述とおおむね構造は同じです。
構造
ブログ一覧をID順で出力するMTMLは、おおまかに以下の構造です。
<!-- ブログ一覧のループ部分をハッシュに格納する -->
<mt:Blogs blog_ids="[複数のブログID]">
<mt:BlogID zero_pad="[num]" setvar="key">
<mt:SetVarBlock name="menu{$key}">
<!-- 出力する内容 -->
</mt:SetVarBlock>
</mt:Blogs>
<!-- 出力表示部分 -->
<mt:Loop name="menu" sort_by="key">
<mt:Var name="__value__">
</mt:Loop>
MTBlogs内でMTSetVarBlockを利用し、中身はハッシュ(連想配列)としてデータ単位で格納します。ブログID順で出力する場合はMTBlogIDをハッシュのkeyとしますが、格納する桁数を揃えないとうまくソートされないため(ブログIDが3と10の場合、10のあとに3がきます)、グローバルモディファイアのzero_padを利用して桁数を調整します。
MTLoop内の<mt:Var name="__value__">が実際の出力部分です。
MTBlogs内のsetvar="key"のkeyとname="menu{$key}"の{$key}、name="menu{$key}"のmenuとMTLoopのname="menu"のmenuがそれぞれ対応しています。これらの値は任意のもので構いません。
コード例
以下出力例です。先述のとおり、以前公開した複数のコンテンツタイプをまとめて出力する記述とおおむね構造は同じです。
<mt:Blogs blog_ids="children">
<mt:BlogID zero_pad="2" setvar="key">
<mt:SetVarBlock name="menu{$key}">
<li><a href="<$mt:BlogURL$>"><$mt:BlogName$></a></li>
</mt:SetVarBlock>
</mt:Blogs>
<mt:Loop name="menu" sort_by="key">
<mt:If name="__first__">
<ul>
</mt:If>
<mt:Var name="__value__">
<mt:If name="__last__">
</ul>
</mt:If>
</mt:Loop>
コード例ではMTSetVarBlock内を見やすいように改行・インデント処理していますが、エラーとなり処理がうまくいかない可能性があるため、実際のテンプレートでは改行やインデントはせず1行で記述するようにしてください。
解説:MTBlogs部分
以下、MTBlogsのMTMLです。
<mt:Blogs blog_ids="children">
<mt:BlogID zero_pad="2" setvar="key">
<mt:SetVarBlock name="menu{$key}">
<li><a href="<$mt:BlogURL$>"><$mt:BlogName$></a></li>
</mt:SetVarBlock>
</mt:Blogs>
blog_ids="children"としていますが、モディファイアや値は環境に合わせて適宜変更してください。
MTBlogIDをハッシュのkeyに指定していますが、桁数が合わないとうまくソートされないため、zero_padで桁数を調整します。例では2桁になるようにしています。
上記のコードは、以下のハッシュ(連想配列)を生成します(わかりやすいようにPHPなどでの表記に合わせています / 概念的なものとしてご参考ください)
{ "[BlogID]": "<li>(省略)</li>" },
{ "[BlogID]": "<li>(省略)</li>" },
{ "[BlogID]": "<li>(省略)</li>" },
.
.
.
<mt:BlogID zero_pad="2" setvar="key">でブログIDを変数keyとして定義します。ハッシュのkeyの値になります(setvarの値はkey以外でも問題ありません)
今回はブログIDでソートしていますが、ソートに使うkeyの値は他の値でも問題ありません。
<mt:SetVarBlock name="menu{$key}">〜</mt:SetVarBlock>がハッシュのvalueの値です。name="menu{$key}"の$keyは、MTBlogIDで定義したsetvarと同じものを$をつけて指定します。
以下の記述は同じです。どちらで記述するかはお好みで。
name="menu{$key}"(name="menu" key="$key")のmenuの値は任意のもので構いません。
<!-- これと -->
<mt:SetVarBlock name="menu{$key}"></mt:SetVarBlock>
<!-- これは同じ -->
<mt:SetVarBlock name="menu" key="$key"></mt:SetVarBlock>
<mt:SetVarBlock name="menu{$key}">〜</mt:SetVarBlock>の中身は出力する中身にあわせて適宜変更してください。この部分は通常のMTMLの記述と同じです。
MTBlogs部分の記述は以上です。
解説:MTLoop部分
以下はMTLoopのMTMLです。MTBlogsで生成したハッシュ(連想配列)データを出力します。
<mt:Loop name="menu" sort_by="key">
<mt:If name="__first__">
<ul>
</mt:If>
<mt:Var name="__value__">
<mt:If name="__last__">
</ul>
</mt:If>
</mt:Loop>
MTLoopのnameモディファイアの値は、MTBlogs内のMTSetVarBlockで指定したnameモディファイアの値です。
ソートの基準はkey(今回の例では[BlogID])です。降順で出力する場合は、sort_byにreverseを追加で指定します。
MTLoop内ではMTEntriesHeaderのような独自タグが存在しないため、ループ内で最初あるいは最後だけ出力するにはMTIfの予約変数(__first__や__last__)を利用します。
MTBlogsで定義した出力部分は以下です。
<mt:Var name="__value__">
MTLoop部分および本記事の解説は以上です。
公式リファレンスなど
MT
- https://www.movabletype.jp/documentation/appendices/tags/blogs.html
- https://www.movabletype.jp/documentation/appendices/tags/websites.html
Discussion