PowerCMS ブログ

2012年09月10日

config.phpでDynamicMTMLのコールバックプラグインを作成する

DynamicMTMLを利用した環境では、テンプレート・タグをPHPで書くことができるだけでなく、コールバックプラグインという仕組みが用意されています。

MT(PowerCMS)のPerlによるプラグインでは、主に管理画面系の処理を追加することができますが、DynamicMTMLのコールバックプラグインではPHPを使って主に表示側のページに対する様々な処理を追加することができます。

コールバックに対応するプラグインは、plugins/PluginDir/php/config.php に記述します。MTPlugin を継承したクラスを作成し、変数 $registry でコールバックを配列の形で定義します。

'callbacks' => array(
    'コールバック名' => 'メソッド名',
    'コールバック名' => 'メソッド名'
    ...
),

以下は、config.php 形式で記述した非常に簡単なコールバックプラグインの例で、初期化開始時にBasic認証をかけるものです。

  • plugins/BasicAuth/php/config.php
<?php
class BasicAuth extends MTPlugin {
    var $app;
    var $registry = array(
        'name' => 'BasicAuth',
        'id'   => 'BasicAuth',
        'key'  => 'basicauth',
        'callbacks' => array(
            'init_request' => 'callback_init_request',
        ),
    );

    function callback_init_request () {
        if ( isset( $_SERVER[ 'PHP_AUTH_USER' ] ) && ( $_SERVER[ 'PHP_AUTH_USER' ]
                === 'username' && $_SERVER[ 'PHP_AUTH_PW' ]
                === 'password' ) ) {
        } else {
            header( 'WWW-Authenticate: Basic realm=""' );
            header( 'HTTP/1.0 401 Unauthorized' );
            exit();
        }
    }
}

例えばコールバックプラグインを作成することで、以下のようなことが実現できます。

  • リクエストされたURLを元に別のURLにリダイレクトさせる。
  • 特定のIPアドレス以外からのアクセスを遮断する、またはBasic認証をかける。
  • テンプレート(通常はファイルの中身)に対して文字列操作する。
  • ビルドされた内容に対して、ブラウザへレスポンスを返す前に文字列操作する。
  • 検索キーワードや流入元情報等をシステムログに保存する。
  • 独自にキャッシュ処理を実装する。

コールバックの詳細については過去のエントリーで紹介していますので参考にしてください(このページにもコールバックプラグインのサンプルがいくつか掲載されています)。 New DynamicMTML(PHPによるMovable Typeの拡張)-2

以下の例は、検索エンジン経由の流入時に、流入元ドメイン、キーワード及びリクエストURLをシステムログに保存するものです。

<?php
class SearchLog extends MTPlugin {
    var $app;
    var $registry = array(
        'name' => 'SearchLog',
        'id'   => 'SearchLog',
        'key'  => 'searchlog',
        'callbacks' => array(
            'post_return' => 'callback_post_return',
        ),
    );

    function callback_post_return ( $mt, &$ctx, &$args, $content ) {
        $app = $ctx->stash( 'bootstrapper' );
        require_once ( 'dynamicmtml.util.php' );
        $keywords   = array();
        $phrase = referral_search_keyword( $ctx, $keywords );
        if ( $phrase ) {
            $app->log( referral_site() . ' : ' . $phrase . ' : ' . $app->base . $app->request );
        }
    }
}

独自にキャッシュを実装する

DynamicMTMLでは標準でキャッシュ機能(ダイナミックパブリッシングで一度閲覧された結果をファイルとして保存し、次回以降のアクセスのレスポンスを上げるしくみ)を持っていますが、マルチデバイス対応等で各デバイスに応じたHTMLを返している場合にキャッシュが使えません。

そこで、PC、スマートフォン、フィーチャーフォンそれぞれについてキャッシュを使えるようにするプラグインを作成しました。

config_settings には通常 mt-config.cgi に記述する環境設定値の初期値を記載します。このプラグインの場合、フィーチャーフォン(携帯)以外でキャッシュを利用する、という初期設定になっています。尚、DynamicMTMLは、config.yaml も読み込むので、config.yamlに記載している場合は、同じものを指定する必要はありません。

<?php
class MultiDeviceCache extends MTPlugin {
    var $app;
    var $registry = array(
        'name' => 'MultiDeviceCache',
        'id'   => 'MultiDeviceCache',
        'key'  => 'multidevicecache',
        'config_settings' => array(
            'EnableMultiDeviceCachePC' => array( 'default' => '1' ),
            'EnableMultiDeviceCacheSP' => array( 'default' => '1' ),
            'EnableMultiDeviceCacheFP' => array( 'default' => '0' ),
            'MultiDeviceCacheTabletIsPC' => array( 'default' => '1' ),
            'MultiDeviceCacheDir' => array( 'default' => 'multidevicecache' ),
        ),
        'callbacks' => array(
            'pre_resolve_url' => 'callback_pre_resolve_url',
            'post_return' => 'callback_post_return',
        ),
    );

    function callback_pre_resolve_url ( $mt, &$ctx, &$args ) {
        // キャッシュが存在すれば、それを返して処理を終了する処理
    }

    function callback_post_return ( $mt, &$ctx, &$args, &$content ) {
        // キャッシュを保存する処理
    }

}

MultiDeviceCacheプラグインでは、キャッシュをクリアするタイミングを再構築処理後としています。これについてはコールバッックが Perlのみとなりますので、キャッシュクリアの処理はPerlで書かれています。

尚、処理によってPerlとPHPを使い分けなければならないのがMTの面倒な部分ではありますが、DynamicMTMLではPHPでもできるだけ同じ書き方でプログラミングできるようになっています。

Perl

my $terms = { blog_id => $blog_id,
              authored_on => [ '20110101000000', '20110131235959' ] };
my $extra = { sort => 'authored_on',
              direction => 'descend',
              range_incl => { authored_on => 1 },
            };
my @entries = MT->model( 'entry' )->load( $terms, $extra );

PHP

$terms = array( 'blog_id' => $blog_id,
                'authored_on' => array( '20110101000000', '20110131235959' ),
                'status'  => 2 );
$extra = array( 'sort' => 'authored_on',
                'direction' => 'descend',
                'range_incl' => array( 'authored_on' => 1 ),
                );
$entries = $app->load( 'Entry', $terms, $extra );
カテゴリー
DynamicMTML
PowerCMS 3
プラグイン
技術情報

ページの先頭へ