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には、任意の項目を任意の順番で出力できる「グループ機能」があるので、もっとシンプルに可読性・保守性の高いテンプレートの作成できます。便利。