最近の案件で、サービスページ内にてスケジュール表を表示する話がありました。
MTを利用するのが最適と判断したので、構築を行っていたのですが構築をしていくと、MTの仕様に沿わない様々な問題が発生してしまいました。
MT4.1以降になって追加されたタグを利用することで解決出来たので、その、解決のための手順を記載しておきます。
まずは今回作成するページの要件を先に挙げておきます。
<要件>
・イベントページTOPで今月のカレンダーをデフォルトで表示
・イベント情報をカレンダーのマス目に表示
・イベントページTOPで今月の主要なイベントのみを一覧表示
・カレンダー上部に、「次の月」「前の月」へ移動するリンク
以上、簡単に要約するとこんな感じになります。
はじめはMTで簡単に構築できるかと思ったのですが、
実際詳細に詰めていくと、以下の問題点が。。
<問題点>
・イベントスケジュールであるので、当然未来の予定が入ってくる。
そのためスケジュールTOPで「次の月」のリンクを表示するケースが出てくるが、現在のMTでは次の月の存在有無を認識してそのリンクの表示/非表示を切り替えるタグが存在 しない。
・今月のイベントのみを抽出してスケジュールTOPに一覧表示するタグが存在しない。
MTでは便利なタグがいろいろ存在していますが、基本はブログツールであることを痛感させられることに。
ただ、MT4.1からは便利な機能が追加されていたようです。
これらのタグを利用することで、かなり自由度の高いエントリーのコントロールが可能になってきました。
・MTSetVarBlock
・・ このタグブロックで囲われた値を変数として定義可能。
・MTIf /
・MTUnless
・・ MTSetVarBlockなどで定義した変数で条件分岐します。
以上のタグを利用して、日付の判定を行い要件に沿うようにスケジュールをコントロールしていきます。
下記に実際のソースサンプルを表示しておきます。
<カレンダー表示部> ※インデックステンプレート
◆解説
ここの要点は、「次の月」、「前の月」のリンクの表示非表示をどのように行うかが鍵になっていきます。
MTの標準タグには前の月や次の月が存在するかを判別する便利な機能が無いので、今回はその判別を"MTSetVarBlock"、"MTUnless"、"MTIf"を使ってコントロールしていきます。
・まず"MTSetVarBlock"タグを使って今月の値を変数"thismonth"として格納しておきます。
・次に"MTArchiveList"タグで月のアーカイブリストを順次取得していきます。
※"MTUnless"タグで変数"prev"が1になるまで繰り返します。
・月のアーカイブリストを取得する度に"MTSetVarBlock"で、そのアーカイブリストの月を変数"prevmonth"に上書いていきます。
・"MTIf"で変数"prevmonth" と "thismonth"を比較し、今月より前の月のアーカイブリストが存在する場合、「前の月」リンクを表示させています。
同様に「次の月」も、今月より未来の月があるかを判別して、「次の月」リンクを表示するようにします。
<今月のイベント一覧> ※インデックステンプレート
◆解説
こちらの要点は、MTのエントリー一覧を表示するタグでは、最新のエントリーを表示することは出来るが、今月のみに該当するエントリーを表示させるタグや、プロパティが無いことである。
こちらも上記と同様に"MTSetVarBlock"、"MTIf"を使って解決出来ます。
・まず"MTSetVarBlock"タグを使って今月の値を変数"thismonth"として格納しておきます。
・次に"MTArchiveList"タグで月のアーカイブリストを順次取得していきます。
・月のアーカイブリストを取得する度に"MTSetVarBlock"で、そのアーカイブリストの月を変数"carrentmonth"に上書いていきます。
・"MTIf"で変数"carrentmonth" と "thismonth"を比較し、一致したら、その月のアーカイブリストを表示していきます。
以上で、最初の要件に合うカレンダーと、今月のイベントリストの表示が可能となりました。
MTでスケジュールを作成するに当たり、上記の対策は有効かと思います。
(将来のバージョンでは、この辺も標準タグとして準備されるのかも。)