はじめての DynamicMTML #03 - スタティックパブリッシングで DynamicMTML を使う書き方

今回は、いよいよ DynamicMTML を Movable Type のテンプレートで使う方法を紹介します。

利用するテーマは、デフォルトテーマの「クラシックウェブサイト」と「クラシックブログ」です。また、特に説明がない限り、テンプレートの [公開] は「スタティック」に設定してあるものとします。

DynamicMTML をスタティックパブリッシングで利用する

DynamicMTML は、ページにアクセスがあったときに、そのファイルに含まれている MT タグを動的に展開してその結果をユーザーに返すものです。

したがって、スタティックパブリッシングのテンプレートで DynamicMTML を利用するには、テンプレートを再構築する際に、部分的に MT タグを展開しないで MT タグを残したままの状態でページを生成する必要があります。

DynamicMTML には、これを実現するために、主に次の2つの正式な方法と、1つの裏技的な方法があります。

  1. MTDynamicMTML というブロックタグでテンプレートを囲む方法
  2. MTML というファンクションタグで MT タグ自体を出力する方法
  3. replaec する裏技的な方法

MTDynamicMTML タグでテンプレートを囲む方法

MTDynamicMTML タグは、その囲んだ部分に含まれる MT タグを展開せずに、そのまま出力します。さっそくサンプルで見てみましょう。

まず、サンプルサイトは次のような構成になっています。

  • はじめての DynamicMTML
    http://www.tinybeans.info/first_dynamic/
    • はじめての DynamicMTML ブログ
      http://www.tinybeans.info/first_dynamic/blog1/
    • はじめての DynamicMTML 日記
      http://www.tinybeans.info/first_dynamic/blog2/ 

現在のウェブサイトのトップページのメインコンテンツ部分は下図のようになっています。

startup-dymtml-10

ここで、ウェブサイト配下の「はじめての DynamicMTML ブログ」に「ブログ記事#02」というタイトルのブログ記事を追加してみます。

しかし、ブログ記事を公開したあとにウェブサイトをリロードしても変化はありません。MultiBlog プラグインの「再構築トリガー」を設定しない限り、ウェブサイトは自動的には再構築されないので、ウェブサイトのトップページに「ブログ記事#02」は表示されません。

ここに DynamicMTML を導入し、ウェブサイトのメインコンテンツの部分のみを動的に再構築するようにすれば、「再構築トリガー」を設定しなくても、追加したブログ記事が反映されるはずです。

テンプレートのカスタマイズ

ウェブサイトのインデックステンプレート「メインページ」の以下の部分をカスタマイズします。

<div id="alpha">
<div id="alpha-inner">
<mt:Entries include_blogs="children">
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mt:Include module="ブログ記事の概要" display_blog_name="1"$>
</mt:Entries>
</div>
</div>

上記テンプレートの MTEntries タグの外側を MTDynamicMTML タグで囲みます。

<div id="alpha">
<div id="alpha-inner">
<mt:DynamicMTML>
<mt:Entries include_blogs="children">
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mt:Include module="ブログ記事の概要" display_blog_name="1"$>
</mt:Entries>
</mt:DynamicMTML>
</div>
</div>

テンプレートを [保存と再構築] します。その後、ウェブサイトをリロードしてみると、先ほど追加した「ブログ記事#02」が表示されます。でもこれは先ほど追加した記事なので、DynamicMTML のおかげで表示されたか分かりません。

startup-dymtml-11

したがって、今度は「はじめての DynamicMTML 日記」ブログに、「日記#02」というブログ記事を追加してみます。

「日記#02」を公開したら、ウェブサイトをリロードしてみてください。ウェブサイト側を再構築しなくても、「日記#02」が追加されているはずです。

startup-dymtml-12

さて、実際にサーバー上に出力されたファイルの該当箇所を見てみましょう。

<div id="alpha">
<div id="alpha-inner">
<MTDynamicMTML>
<mt:Entries include_blogs="children">
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mt:Include module="ブログ記事の概要" display_blog_name="1"$>
</mt:Entries>
</MTDynamicMTML>
</div>
</div>

このように、見事に MTDynamicMTML タグで囲まれた部分が、MT タグのまま出力されていることが分かります。

MTML タグで MT タグ自体を出力する方法

MTML タグは、MT タグ自体を書き出すファンクションタグです。つまり、テンプレートが再構築されるときに MT タグを書き出すので、サーバー上のファイルには MT タグがそのまま出力されることになります。

MTML タグの書式は次のようになります。

<$mtml tag='MTタグ名' params='MTタグに付けるモディファイア'$>

例えば、テンプレートを再構築した日時を日本語フォーマットで表示する MTDate タグを、MTMLタグを用いて書き出すには、次のように書きます。

【出力したい MT タグ】

<$mt:Date language="ja"$>

【MTML タグの書式】

<$mtml tag='mt:Date' params='language="ja"'$>

テンプレートのカスタマイズ

実際にテンプレートで使ってみます。

先ほど MTDynamicMTML タグで MT タグを出力した部分を、MTML タグで書き出すようにしてみると、次のようになります。

<div id="alpha">
<div id="alpha-inner">
<mtml tag='mt:Entries' params='include_blogs="children"'>
<mt:Ignore><!-- Use the Entry Summary module for each entry published on this page --></mt:Ignore>
<$mtml tag='mt:Include' params='module="ブログ記事の概要" display_blog_name="1"'$>
<mtml tag='/mt:Entries'>
</div>
</div>

このテンプレートを保存すれば、この部分は先ほどと同様にダイナミックに処理されます。

さて、こちらもサーバー上に出力されたファイルを見てみます。

<div id="alpha">
<div id="alpha-inner">
<mt:Entries include_blogs="children">

<mt:Include module="ブログ記事の概要" display_blog_name="1">
</mt:Entries>
</div>
</div>

先ほどと比較してみてください。MTEntries タグの下にあった MTIgnore タグがありません。つまり、MTIgnore タグは、再構築時にきちんと解釈されて出力しなかったことになります。

このように、MTML タグは、ピンポイントで MT タグを書き出すことができます。もちろん、ブロックタグの閉じタグの出力していますね。

replace する裏技的な方法

これから紹介する方法は、裏技的な方法ですが、いつの日か役に立つ日がくるかもしれません。

例えば、次ようように、MT タグの接頭辞を「tb:」に書き換えたテンプレートを書いてみます(「tb:」はtinybeans の略です。「mt」が付かなければなんでもOKです)。

<div id="alpha">
<div id="alpha-inner">
<tb:Entries include_blogs="children">
<tb:Include module="ブログ記事の概要" display_blog_name="1">
</tb:Entries>
</div>
</div>

このブログを再構築すると、出力されたファイルにもそのまま出力されます。意味不明ですね。

しかし、この部分を次のように MTUnless タグで囲んでみます。name モディファイアに指定している「for_dynamic」という変数は、定義されていない変数であれば何でもかまいません。name モディファイアを付けなくても良いのですが、この部分の意味がなんのための MTUnless か分かるように付けています。

<mt:Unless name="for_dynamic" replace="tb:","mt:">
<div id="alpha">
<div id="alpha-inner">
<tb:Entries include_blogs="children">
<tb:Include module="ブログ記事の概要" display_blog_name="1">
</tb:Entries>
</div>
</div>
</mt:Unless>

このテンプレートを再構築すると、次のように、ちゃんと MT タグとして出力されます。

<div id="alpha">
<div id="alpha-inner">
<mt:Entries include_blogs="children">
<mt:Include module="ブログ記事の概要" display_blog_name="1">
</mt:Entries>
</div>
</div>

この方法の使いどころは、「MT タグに MT タグを入り組ませて直感的に書ける」ところにあります。例えば、次のように、「最終的に MT タグとして出力される」部分のモディファイアにそのまま MT タグを書いて設定しています(この例はあまり意味がないかもしれませんが)。

<$mt:SetVar name="mod" value="ブログ記事の概要"$>
<mt:Unless name="for_dynamic" replace="tb:","mt:">
<div id="alpha">
<div id="alpha-inner">
<tb:Entries include_blogs="children">
<tb:Include module="<$mt:Var name="mod"$>" display_blog_name="1">
</tb:Entries>
</div>
</div>
</mt:Unless>

サーバー上に出力されたファイルには、次のように何もなかったように普通のテンプレートタグが出力されます。

<div id="alpha">
<div id="alpha-inner">
<mt:Entries include_blogs="children">
<mt:Include module="ブログ記事の概要" display_blog_name="1">
</mt:Entries>
</div>
</div>

以上です。

  • このエントリーをはてなブックマークに追加
Just a second...