記事一覧ページで会計年度別にmtevalモディファイアを使用して表示する方法

YYYY年3月期でコンテンツを分類したい。

IRページの実装では「会計年度別」に表示するものがあります。プラグインを使った例もあると思いますが、基本機能のみで実現する方法をご紹介します。

MovableType、PowerCMSで動作します。

■ 2021年3月期
-- yyyy年mm月dd日 決算短信
-- yyyy年mm月dd日 有価証券報告書

■ 2020年3月期
-- yyyy年mm月dd日 決算短信

サンプルテンプレート

記事に登録されているコンテンツの公開日を元に、会計年度別の表示を行います。

<mt:Entries lastn="0">          
    <mt:ignore>04/01以降の記事は次会計年度として扱います。</mt:ignore>
    <mt:EntryDate format="%Y" setvar="archive_year">
    <mt:EntryDate format="%m" setvar="if_entrydate_md">
    <mt:if name="if_entrydate_md" ge="04">
        <mt:Var name="archive_year" op="+" value="1" setvar="archive_year">
    </mt:if>
    <mt:ignore>会計年度を配列に格納します。</mt:ignore>
    <mt:SetVar name="push(years)" key="$archive_year">

    <mt:ignore>コンテンツ部分</mt:ignore>
    <mt:SetVarBlock name="html">
        <tr>
            <th><mt:EntryDate format="%Y年%m月%d日"></th>
            <td><mt:EntryTitle></td>
        </tr>
    </mt:SetVarBlock>

    <mt:ignore>会計年度ごとの配列を作成します。</mt:ignore>
    <mt:SetVarBlock name="MTdummy">
    <EVAL@mt:SetVar name="push(<mt:Var name="archive_year">)" value="$html">
    </mt:SetvarBlock>
    <mt:Var name="MTdummy" replace="EVAL@","" mteval="1">
</mt:Entries>

<mt:ignore>会計年度を出力します。</mt:ignore>
<mt:Loop name="years" sort_by="key reverse">
    <section>
        <h2><mt:Var name="__key__">年3月期</h2>
        <table>
            <tbody>
            <mt:ignore>会計年度別の値を出力します。</mt:ignore>
            <mt:Loop name="$__key__" sort_by="key reverse">
                <mt:Var name="__value__">
            </mt:Loop>
            </tbody>
        </table>
    </section>
</mt:Loop>

解説

MTEntryDate タグで公開日を取得し「年」と「月日」部分をそれぞれ変数に格納します。

格納された値が「04」より多い場合は、「年」の値に1を足し、次会計年度で変数の上書きを行い、配列「years」に追加します。push対象をkeyとすることで、重複する値は登録されません。

<mt:Entries lastn="0">  
    <mt:ignore>04/01以降の記事は次会計年度として扱います。</mt:ignore>
    <mt:EntryDate format="%Y" setvar="archive_year">
    <mt:EntryDate format="%m" setvar="if_entrydate_md">
    <mt:if name="if_entrydate_md" ge="04">
        <mt:Var name="archive_year" op="+" value="1" setvar="archive_year">
    </mt:if>
    <mt:ignore>会計年度をに格納します。</mt:ignore>
    <mt:SetVar name="push(years)" key="$archive_year">
    ・・・省略・・・
</mt:Entries>

会計年度毎に表示したいコンテンツ部分をMTSetVarBlock タグで指定します。

<mt:Entries lastn="0">
    ・・・省略・・・
    <mt:ignore>コンテンツ部分</mt:ignore>
    <mt:SetVarBlock name="html">
        <tr>
            <th><mt:EntryDate format="%Y年%m月%d日"></th>
            <td><mt:EntryTitle></td>
        </tr>
    </mt:SetVarBlock>
    ・・・省略・・・
</mt:Entries>

ここがテンプレートの肝となる部分です。

<mt:Entries lastn="0">
    ・・・省略・・・
    <mt:ignore>会計年度ごとの配列を作成します。</mt:ignore>
    <mt:SetVarBlock name="MTdummy">
        <EVAL@mt:SetVar name="push(<mt:Var name="archive_year">)" value="$html">
    </mt:SetvarBlock>
    <mt:Var name="MTdummy" replace="EVAL@","" mteval="1">

</mt:Entries>

本来は以下のように、作成した会計年度の配列にコンテンツを追加したいのですが、エラーとなり追加できません。

<mt:SetVar name="push($archive_year)" value="$html">

そこで、上記に変更を加えた値を、MTSetVarBlock タグに格納します。

これはMTタグとして実行されないように接頭語に「EVAL@」を付与し、mtタグがテキストとして出力されるように設定します。 「EVAL@」は「mt」意外ならなんでも良いです。

変更前
<mt:SetVar name="push($archive_year)" value="$html">
変更後
<EVAL@mt:SetVar name="push(<mt:Var name="archive_year">)" value="$html">

これをそのまま実行すると下記のようになります。

<EVAL@mt:SetVar name="push(2021)" value="$html">
<EVAL@mt:SetVar name="push(2020)" value="$html">
<EVAL@mt:SetVar name="push(2019)" value="$html">

最後に上記を格納した「MTdummy」からMTタグ動作に不要な「EVAL@」を削除します。

<mt:Var name="MTdummy" replace="EVAL@","" mteval="1">

そして「mteval」モディファイアでMTタグを実行すると、以下のようになり、作成した会計年度の配列にコンテンツを追加することができます。これで会計年度別にコンテンツを格納する配列が完成しました。

<mt:SetVar name="push(2021)" value="$html">
<mt:SetVar name="push(2020)" value="$html">
<mt:SetVar name="push(2019)" value="$html">

最後に配列に格納した「会計年度」をMTLoop タグで実行し、配列に格納した「会計年度」の名前でMTLoop タグを実行すると、「EVAL@」で擬似的に指定したタグが実行され、会計年度別にコンテンツが表示できます。

<mt:ignore>会計年度を出力します。</mt:ignore>
<mt:Loop name="years" sort_by="key reverse">
    <section>
        <h2><mt:Var name="__key__">年3月期</h2>
        <table>
            <tbody>
            <mt:ignore>会計年度別の値を出力します。</mt:ignore>
            <mt:Loop name="$__key__" sort_by="key reverse">
                <mt:Var name="__value__">
            </mt:Loop>
            </tbody>
        </table>
    </section>
</mt:Loop>

余談

サンプルでは会計年度別の分類をMTEntryDateタグ としていますが、実際はIR情報を会計年度内に更新できない場合もありますので、この部分はカスタムフィールドとし、会計年度別の分類と、公開日は分けて設計したほうが良いです。

公開日を会計年度別に日付に合わせるのでは、更新時期が不明となるのでおすすめしません。

mtevalモディファイアを使用しない方法はこちらです。

記事一覧ページで会計年度別に表示する方法