記事一覧ページで会計年度別に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>
余談
mtevalモディファイアを使用しない方法はこちらです。