PowerCMS ブログ

2012年09月15日

DynamicMTMLのコールバックプラグインでブログ記事をJSON形式で返す

PowerCMSをブラウザベースのスマートフォンアプリのバックエンドで利用する、といったケースも増えてきました。元々Movable Type/PowerCMSではテンプレートによって静的/動的にJSON形式のデータを生成してパブリッシュすることが標準機能で可能ですが、DynamicMTMLのコールバックプラグインを作成することで、PHPによってJSONデータを生成してブラウザに返すことが簡単にできます。

http://example.com/entry_permalink.html?to_json=1

上記のように、ブログ記事のパーマリンクにパラメタ to_json=1 を付与してリクエストするとブログ記事の各カラムの値をキーバリューの形でJSONにして返すものです。カスタムフィールド、カテゴリ、タグにも対応しています。

※9月18日追記: インデックス/カテゴリ/月別年別/エントリに対応したプラグインを公開しました。

  • plugins/Entry2json/php/config.php
<?php
class Entry2json extends MTPlugin {

    // http://example.com/entry_permalink.html?to_json=1

    var $registry = array(
        'name' => 'Entry2json',
        'callbacks' => array(
            'pre_build_page' => 'pre_build_page'
        ),
    );

    function pre_build_page ( $mt, $ctx, &$args ) {
        $app = $ctx->stash( 'bootstrapper' );
        if ( $app->param( 'to_json' ) ) {
            $entry = $ctx->stash( 'entry' );
            if (! $entry ) {
                return;
            }
            $get_fields = $app->load( 'Field', array(
                            'obj_type' => $entry->class,
                            'blog_id' => array( 0, $entry->blog_id ) ) );
            $get_categories = $entry->categories();
            $get_tags = $app->fetch_tags( $entry );
            // $get_tags = $ctx->mt->db()->fetch_entry_tags( array( 
            //     'entry_id' => $entry->id,
            //     'blog_id' => $entry->blog_id,
            //     'class' => $entry->class ) );
            $json = $entry->GetArray();
            if ( $get_fields ) {
                foreach ( $get_fields as $field ) {
                    $column_name = 'field.' . $field->basename;
                    $field_val = $entry->{ $entry->_prefix . $column_name };
                    $json[ $column_name ] = $field_val;
                }
            }
            if ( $get_categories ) {
                $categories = array();
                foreach ( $get_categories as $category ) {
                    $category = $category->GetArray();
                    array_push( $categories, $category );
                }
                $json[ 'entry_categories' ] = $categories;
            }
            if ( $get_tags ) {
                $tags = array();
                foreach ( $get_tags as $tag ) {
                    $tag = $tag->GetArray();
                    array_push( $tags, $tag );
                }
                $json[ 'entry_tags' ] = $tags;
            }
            $json = json_encode( $json );
            $file = $app->stash( 'file' );
            $app->send_http_header( 'application/json; charset=UTF-8', filemtime( $file ), strlen( $json ) );
            echo $json;
            exit();
        }
    }

}
?>

このプラグインでは、全てのカラムのデータをそのまま返すため、通常は使わないような恐らく不要なデータもそのまま返してしまい、実用性といった点では荒削りな面はありますが、テンプレートを書くまでもなくこういった形でデータを処理することができる例としてご紹介しました。

pre_build_pageコールバックが呼ばれる時点で、$ctx にブログ記事等のコンテクストがセットされていますので、実際にページがビルドされる直前に割り込ませてこのような処理を行うことができます。

カテゴリー
DynamicMTML
PowerCMS 3
技術情報

ページの先頭へ