WriteToFileプラグインを使った静的ページ分割

先日、「テンプレートの再構築結果を部分的にファイルに出力するプラグイン」(WriteToFile)を公開しました。
このプラグインを使うと、1つのテンプレートから複数のファイルを出力することができます。

このプラグインの応用例の1つとして、ブログのメインページを静的に分割する方法を紹介します。

9月11日 17時50分
もう1つプラグインが必要なことを記述し忘れていました。申し訳ありませんでした。

1.基本的な考え方

WriteToFileプラグインのMTWriteToFileタグは、繰り返し系のブロックタグの中でも使うことができます。
メインページのページ分割では、MTForタグの繰り返しを利用して、メインページのテンプレートを複数回再構築し、それぞれの結果をMTWriteToFileタグで別々のファイルに保存する、という手法を使います。
例えば、メインページを5ページに分割する場合、処理の大まかな流れは以下のようになります。

<MTFor var="page_no" from="1" to="5">
<MTSetVarBlock name="fname">各ページのファイル名を求める</MTSetVarBlock>
<MTWriteToFile name="$fname">
メインページのテンプレート(ページ分割できるように一部書き換えたもの)
</MTWriteToFile>
</MTFor>

2.VarExpandプラグインのインストール

このカスタマイズでは、変数間どうしでやや複雑な計算を行います。
その処理を簡単にするために、拙作のVarExpandプラグインを使います。

VarExpandプラグインのインストール等については、こちらのページを参照してください。

3.メインページのテンプレートの先頭部分の書き換え

それでは、メインページのテンプレートを具体的に書き換える手順を紹介します。
まず、テンプレートの先頭に以下を追加します。

<MTIgnore>1ページあたりのブログ記事数</MTIgnore>
<MTSetVar name="per_page" value="10">
<MTIgnore>分割するページ数の最大値</MTIgnore>
<MTSetVar name="max_page" value="5">
<MTIgnore>分割するページ数を求める</MTIgnore>
<MTSetVarBlock name="page_count"><$MTBlogEntryCount$></MTSetVarBlock>
<MTSetVarFormula name="page_count" formula="int(($page_count - 1) / $per_page) + 1">
<MTIf name="max_page"><MTIf name="page_count" gt="$max_page"><MTSetVar name="page_count" value="$max_page"></MTIf></MTIf>
<MTIgnore>ページ数分繰り返す</MTIgnore>
<MTFor var="page_no" from="1" to="$page_count">
  <MTIgnore>各ページの先頭のブログ記事のオフセットを求める</MTIgnore>
  <MTSetVarFormula name="ofs" formula="($page_no - 1) * $per_page">
  <MTIgnore>出力するファイル名を求める</MTIgnore>
  <MTSetVarBlock name="fname">index<MTIf name="page_no" ne="1">_<$MTGetVar name="page_no"></MTIf>.html</MTSetVarBlock>
  <MTIgnore>1ページ目は通常通り出力し、2ページ目以降をMTWriteToFileタグで出力するようにする</MTIgnore>
  <MTSetVarBlock name="out"><MTIf name="page_no" eq="1">1<MTElse>0</MTIf></MTSetVarBlock>
  <MTSetVarBlock name="no_file"><MTIf name="page_no" eq="1">1<MTElse>0</MTIf></MTSetVarBlock>
  <MTIgnore>各ページを再構築して保存する</MTIgnore>
  <MTWriteToFile file="$fname" out="$out" no_file="$no_file">

この部分では、1ページあたりの記事数を元にして分割後のページ数を求め、その回数分繰り返しを行って、各ページをファイルに出力するようにしています。
2行目の「<MTSetVar name="per_page" value="10">」で、1ページあたりの記事数を指定することができます。
また、4行目の「<MTSetVar name="max_page" value="5">」で、分割後の最大ページ数を指定することができます。

分割後の各ページのファイル名は、1ページ目は「index.html」で、2ページ目以降は「index_2.html」「index_3.html」・・・のようになります。
このファイル名は14行目のMTSetVarBlockタグで変数$fnameに求めています。

なお、4行目のvalueのところを「value="0"」にすると、すべてのブログ記事を対象にページ分割を行うこともできます。
ただ、記事の数が多いブログだと、全記事を再構築することになり、処理時間が長くなりますので、通常は「value="0"」は使わないことをお勧めします。

4.メインページのテンプレートの最後の部分の書き換え

次に、メインページのテンプレートの最後に、以下のタグを追加します。

</MTWriteToFile>
</MTFor>

5.MTEntriesタグの書き換え

メインページのテンプレートの中には、MTEntriesタグで記事の一覧を出力する部分があります。
このMTEntriesタグを、以下のように書き換えます。

<mt:Entries offset="$ofs" lastn="$per_page">

これによって、各ページの先頭の記事(変数$ofs)から、1ページあたりの記事(変数$per_page)が処理対象になります。

6.ページ選択部分の追加

最後に、ページを選択する部分を追加します。

Movable Type 4.2の標準テンプレートセットの場合、以下のようなタグがあって、アーカイブページへのリンクが出力されるようになっています。

<a href="<$mt:Link template="archive_index"$>">アーカイブ</a>

このタグの直前に、以下のようなタグを追加すると、ページ選択のリンクが出力されます。

<MTIf name="page_count" gt="1">
  <MTFor var="page_ctr" from="1" to="$page_count" glue="|">
    <MTIf name="page_ctr" eq="$page_no">
      <MTGetVar name="page_ctr">
    <MTElse>
      <a href="<$MTBlogURL$><MTIf name="page_ctr" gt="1">index_<$MTGetVar name="page_ctr">.html</MTIf>"><MTGetVar name="page_ctr"></a>
    </MTIf>
  </MTFor>
  <br />
</MTIf>

この部分では、ページ数分の繰り返しを行って、各ページへのリンクを「|」で区切って出力しています
ただし、現在表示しているページはリンクにせずに、ページ番号のみ出力するようにしています。