PowerCMS X ブログ

2024-01-04

PowerCMS Xで DynamicMTMLを利用する

PowerCMS ver.2から利用できる「DynamicMTML」は静的に出力されたファイルに書かれたテンプレートタグをダイナミック処理する機能です。

「部分的に動的」生成が可能になるため、静的生成のメリットである高速配信と状態に応じた表示の分岐(パラメタや会員ログインの判別など)などの動的生成でしかできない処理を組み合わせるのに適しています。テンプレート・タグだけで書けるため、プログラミングの知識を必要としません。PowerCMS Xは標準でこの機能をサポートしています。

.htaccessによるリライトの設定

例えば拡張子「html」へのリクエストを DynamicMTMLで処理させるためには以下のようにしてリライトの設定を行います。

RewriteCond %{REQUEST_URI} \.html$ [NC]
RewriteRule ^ <mt:websitepath><mt:constant name="DIRECTORY_SEPARATOR">pt-view.php [L]

pt-view.phpのカスタマイズ

テーマに同梱されている pt-view.php では、以下のように、GET以外のリクエストとパラメタ付きリクエストを動的処理するようになっています。
「force_dynamic」指定があると静的ファイルの有無に関わらずページ全体がダイナミック処理になってしまうため、パラメタ付きリクエストで DynamicMTMLを使いたい場合は以下の部分をカスタマイズしてください。

if ( $app->request_method != 'GET' || $app->query_string ) {
    $app->force_dynamic = true;
}
// ↓
if ( $app->request_method != 'GET' ) {
    $app->force_dynamic = true;
}

ビューの記述方法

テンプレートの書き方は PowerCMSと変わりません(唯一、rawmtmlタグは使えません)。

<mt:dynamicmtml>
<mt:date>
</mt:dynamicmtml>

ファイル出力時にはこの部分は評価されず、出力ファイル内に以下のテンプレート・タグが残ります。ページへのリクエストがあった時にこの部分は評価されます。

<mt:date>

Membersプラグインによる会員サイトの場合、たとえば以下のようにしても分岐が可能です。

<mt:ml tag="mt:iflogin">
  あなたはログイン済みです。
<mt:ml tag="mt:else">
  ログインしてください。
<mt:ml tag="/mt:iflogin">

これは、出力ファイル内では以下のようになり、ページにアクセスされた時にここ部分のみビルドされます。

<mt:iflogin>
  あなたはログイン済みです。
<mt:else>
  ログインしてください。
</mt:iflogin>

ビルドされたテンプレートはコンパイルキャッシュとしてネイティブの PHPコードに変換され、次回以降はそれが使われますので、非常に高速に動作します。

もちろん、全体を dynamicmtmlブロックで囲うことにより、以下のように会員名を表示させるようなテンプレートにすることもできます。

<mt:dynamicmtml>
  <mt:iflogin>
    <mt:membernickname escape>さん、ようこそ!
  <mt:else>
    <a href="<mt:membersappurl>">ここからログインしてください</a>
  </mt:iflogin>
</mt:dynamicmtml>

最近では RESTful APIなどを使って JavaScriptで動的部分を非同期に処理するような方法を検討することも多くなりましたが、一つの選択肢として、このような方法も取れることを覚えておいてください。

カテゴリー:サイト制作全般 | テンプレート作成Tips | 技術情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ