MovableType
MTLoopタグで連想配列と多次元配列を作る方法
多次元配列を作る
多次元配列にするには、MTSetHashVar タグで作成した連想配列を、別のハッシュに追加し、MTLoop タグで出力します。
例えば、任意のブログを任意の順番で表示したい場合に使用できます。
サンプルテンプレート
<mt:SetVar name="blog_ids" value="30","10","20">
<mt:Loop name="blog_ids" sort_by="key">
<mt:Blogs blog_ids="$__value__">
<mt:SetVar name="undef(hashEntries)">
<mt:Entries lastn="5">
<mt:EntryDate format="%Y%m%d%H%M%S" setvar="e_key">
<mt:SetVarBlock name="e_value"><li><mt:EntryTitle></li></mt:SetVarBlock>
<mt:SetVar name="hashEntries" key="$e_key" value="$e_value">
</mt:Entries>
<mt:if name="hashEntries">
<mt:SetVar name="undef(hashItems)">
<mt:SetHashVar name="hashItems">
<mt:SetVarBlock name="ブログID"><mt:BlogID></mt:SetVarBlock>
<mt:SetVarBlock name="ブログ名"><mt:BlogName></mt:SetVarBlock>
<mt:SetVarBlock name="アンカーリンク"><li><a href="#<mt:BlogID>"><mt:BlogName></a></li></mt:SetVarBlock>
<mt:SetVar name="記事一覧" value="$hashEntries">
</mt:SetHashVar>
<mt:SetVar name="表示用" key="$__key__" value="$hashItems">
</mt:if>
</mt:Blogs>
</mt:Loop>
<mt:Loop name="表示用" sort_by="key">
<mt:if name="__first__"><ul></mt:if>
<mt:Var name="__value__{アンカーリンク}">
<mt:if name="__last__"></ul></mt:if>
</mt:Loop>
<mt:Loop name="表示用" sort_by="key">
<section id="<mt:Var name="__value__{ブログID}">">
<h2><mt:Var name="__value__{ブログ名}"></h2>
<mt:Var name="__value__{記事一覧}" setvar="記事一覧">
<mt:Loop name="記事一覧" sort_by="key reverse">
<mt:if name="__first__"><ul></mt:if>
<mt:Var name="__value__">
<mt:if name="__last__"></ul></mt:if>
</mt:Loop>
</section>
</mt:Loop>
解説
MTSetVar タグで配列を作成します。valueにカンマ区切りで「ブログID」を「表示順」で設定します。
<mt:SetVar name="blog_ids" value="30","10","20">
MTLoopで「blog_ids」にあるブログIDを、MTBlogsの「blog_ids」に設定します。
<mt:Loop name="blog_ids" sort_by="key">
<mt:Blogs blog_ids="$__value__">
ブログ記事をハッシュに設定する。
公開日順で、ブログ記事の5件を「hashEntries」に設定します。
「undef」で「hashEntries」の初期化を行ってください。
<mt:SetVar name="undef(hashEntries)">
<mt:Entries lastn="5">
<mt:EntryDate format="%Y%m%d%H%M%S" setvar="e_key">
<mt:SetVarBlock name="e_value"><li><mt:EntryTitle></li></mt:SetVarBlock>
<mt:SetVar name="hashEntries" key="$e_key" value="$e_value">
</mt:Entries>
ブログ情報とブログ記事をハッシュに設定する。
ブログごとに出力したい値を、「hashItems」に設定します。nameが「項目名」valueが「値」です。
記事一覧には、上記で作成した「hashEntries」を設定します。
「undef」で「hashItems」の初期化を行ってください。
<mt:if name="hashEntries">
<mt:SetVar name="undef(hashItems)">
<mt:SetHashVar name="hashItems">
<mt:SetVarBlock name="ブログID"><mt:BlogID></mt:SetVarBlock>
<mt:SetVarBlock name="ブログ名"><mt:BlogName></mt:SetVarBlock>
<mt:SetVarBlock name="アンカーリンク"><li><a href="#<mt:BlogID>"><mt:BlogName></a></li></mt:SetVarBlock>
<mt:SetVar name="記事一覧" value="$hashEntries">
</mt:SetHashVar>
<mt:SetVar name="表示用" key="$__key__" value="$hashItems">
</mt:if>
</mt:Blogs>
</mt:Loop>
ハッシュからアンカーリンクのみ出力する。
「表示用」に設定した値を、MTVar name="value{項目名}"で出力します。
<mt:Loop name="表示用" sort_by="key">
<mt:if name="__first__"><ul></mt:if>
<mt:Var name="__value__{アンカーリンク}">
<mt:if name="__last__"></ul></mt:if>
</mt:Loop>
ハッシュから多次元配列を出力する
多次元配列になっている「記事一覧」の箇所は、一度、変数に設定してMTLoopから出力します。
<mt:Loop name="表示用" sort_by="key">
<section id="<mt:Var name="__value__{ブログID}">">
<h2><mt:Var name="__value__{ブログ名}"></h2>
<mt:Var name="__value__{記事一覧}" setvar="記事一覧">
<mt:Loop name="記事一覧" sort_by="key reverse">
<mt:if name="__first__"><ul></mt:if>
<mt:Var name="__value__">
<mt:if name="__last__"></ul></mt:if>
</mt:Loop>
</section>
</mt:Loop>
あとがき
サンプルテンプレートの要件は、MTBlogsタグ を対象の数だけ書いても実現できますが、10個を超えると、テンプレートの可読性が著しく低下します。
メンテナンスの保守性を高めるためにも、複数テンプレートで使用する仕組みは、共通管理できる様に実装するのが良いと思います。
ちなみに、PowerCMSには、任意の項目を任意の順番で出力できる「グループ機能」があるので、もっとシンプルに可読性・保守性の高いテンプレートの作成できます。便利。