PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > PowerCMS 3 > DynamicMTMLのコールバックプラグインで擬似的なアーカイブをみせる

2014年04月02日

DynamicMTMLのコールバックプラグインで擬似的なアーカイブをみせる

DynamicMTMLはスタティックに出力されたHTMLファイルの中のMTタグ(MTML)を実行できるフレームワークですが、そのポテンシャルはMTタグの実行にとどまりません。PHPによってプラグインを作成することで、様々な処理をサイトに追加することができます。

この記事では、DynamicMTMLのコールバックプラグインを使って、擬似的なフォルダアーカイブ(フォルダ配下のページンの一覧を表示させる)例をご紹介します*。他にも以下のような応用例が考えられます。

  • フォルダ配下のページ一覧を表示する
  • ウェブページを時系列で区切ってみせる
  • 検索結果を(擬似的な)静的URLで表示させる

* PowerCMSには標準でフォルダアーカイブが利用可能です。この記事ではあくまでもサンプルとしてご紹介します。

考え方としては、mod_rewrite による処理と似ています。あるURLへのリクエストを別のURLへリライトして処理を継続します。

コールバックプラグインの作成方法

初めて作成される方は、以下の記事を参考にしてください。

処理の流れ

今回のコードは下記にアップしています。mt/plugin/RewriteArchiver/php/config.php にファイルを設置することで動作するようになります。インデックステンプレートとして、/archiver.html を出力しておく必要があります。(このプラグインでは、/archiver.html は mt-config.cgi で指定できるようになっています。ブログカスタムフィールドにするなどの応用も可能です。)

以下の流れで処理されます。

  • コールバックpost_init(DynamicMTMLの初期化終了後)に処理を追加する
  • リクエストファイルが存在するかどうかを判別、ファイルが存在する場合は処理をスキップする
  • リクエストファイルが存在しない場合、特定の条件を満たす場合に /archiver.html へのリクエストとして処理する(DynamicMTMLを騙す * イメージ)
  • 特定の条件を満たす条件は、1. /archiver.html が存在すること、2. パスに該当するフォルダが存在すること

* DynamicMTML($app)の->stash、'file(ファイルパス)'、'request(URLからアプリケーションのプロトコルとFQDNを除いたもの=http://example.com/foo の場合、 /foo)'、'url(URL)'を別のものにセットすることで、DynamicMTMLはリクエストがそのファイル/URLに対して送られたものと解釈して処理を実行するようになります。具体的には、PHPコードの以下の箇所がそれにあたります。

$app->stash( 'file', $new_file );
$app->stash( 'request', $new_request );
$app->stash( 'url', $new_url );

動作を確認する

folder/subfolder を作成します。

サイトURLが、http://www.example.com/ の時、http://www.example.com/folder/subfolder/index.html へアクセスします。/archiver.html の内容が表示されれば、正しく動作していることになります。

インデックス・テンプレート /archive.html のテンプレートをフォルダ配下のウェブページ一覧を表示させるように変更します。

<mt:DynamicMTML>
<MTPages folder="$folder_path">
<MTPageTitle>...
</MTPages>
</mt:DynamicMTML>

プラグインの中の以下のコード箇所で、mt:varの値 folder_path をセットしています。

$ctx->__stash[ 'vars' ][ 'folder_path' ] = $folder;

これにより、テンプレート中では とすることで、folder/sub-folder を取り出すことができます。このテンプレートでは、MTPagesタグの folderモディファイアにそのまま値を渡しているため、このフォルダ以下のウェブページのリストが出力されます。

DynamicMTMLを利用するかどうかを事前によく検討しておく

PowerCMSでは、様々な種類のアーカイブが標準で選択できるようになっていますが、場合によっては標準機能では実現できないようなアーカイビングを行いたいといったケースが出てくる可能性があります。上記応用例でご紹介したようなケースです。

  • フォルダ配下のページ一覧を表示する
  • ウェブページを時系列で区切ってみせる
  • 検索結果を(擬似的な)静的URLで表示させる、等々

他にもURLパラメタによる分岐や、リニューアル時の旧URLからのリダイレクト処理、アクセス制限、ログイン判別など、DynamicMTMLのタグによる処理だけでも様々なことができますが、コールバックプラグインを作成することで、PHPによって様々な見せ方、処理ができることを知っておくと、実現できるサイト表現の幅が広がると思います。

DynamicMTMLを利用する場合、公開サーバーでPHPが動作することや、mod_rewrite が利用できること、公開サーバーにMTのPHPモジュールを設置しなければならない、などの前提条件があるため、後からではなく、最初にしっかり設計して利用するかどうかを決めておく必要がありますが、事前に十分な設計ができない場合や、後から要件変更が想定されるケースなどでは、当初から動作するように環境構築しておき、利用しなかった場合は無効にする(つまり、保険としてのDynamicMTML環境構築)のがお勧めです。


カテゴリー
DynamicMTML
PowerCMS 2
PowerCMS 3
PowerCMS 4
プラグイン
技術情報

Recent Entries