PowerCMS ブログ

2017年01月10日

Data API と同じ形式で JSON オブジェクトを静的テンプレート出力する ResourceObject プラグイン

今年になって書いた2つめのプラグイン、ResourceObject プラグインの紹介記事です。ふと思いついて書いたのですが、利用できるシーンは色々ありそうです。

Data APIのパフォーマンス問題と静的JSON作成

Data APIを活用してアプリケーションを公開している時、サイトの規模が大きくなってくると Data API (mt-data-api.cgi)のパフォーマンスが気になってくると思います。Data APIはアクセスがある度に動的にデータを生成しますので、多くのアクセスが集中するようなサイトであれば JSONデータを静的に生成して配信したくなる、といった経験はMT開発者なら一度は経験しているのではないでしょうか。

実はData API以前にもMTの記事などをJSON出力するようなことをやっている方は多くてtinybeansさんの「flexibleSearch.js - 超高速Ajax検索を実現するjQueryプラグイン」などは、もろにこのようなこと(JSONをMTタグで静的出力する)をやっています。

このようなことを実現する実装に対して、Movable Type Advent Calendar 2016でアイデアマンズの宮永さんが以下のようなエントリーを上げていらっしゃいます。

〝 確実に解析し利用できるJSONデータを出力するには、Movable Typeのことをよく理解している必要があります。

 encode_jsonを忘れてしまい、テストデータでは大丈夫だったけどユーザーがダブルクオーテーション使ったりしてJSONが壊れてしまった...とかMTあるあるですね。

 でも、こうは思いませんか? データフォーマットの書式に気を使うのは人間の仕事だろうか、と。〟

確かにJSONフォーマットを人力でMTMLを書いて出力するテンプレート・タグを書くのは人間の仕事ではないような気がします。

ただし、上記のようなプラグインを利用してデータ構造を定義することは、自由なフォーマットを定義できるメリットがある一方で、そもそも「Data API (mt-data-api.cgi)のパフォーマンスが気になって」静的ファイル化を検討しているのに、そのテンプレートをユーザーが書かなければならないというのも何だか変な話だと思いました。Data APIが出力するJSONを組み立てているのだから、MTにデータを組み立ててもらって、そいつを出力すればいいのでは?

ResourceObjectプラグインでJSONデータを簡単出力

このプラグインでは、テンプレート・タグ「MTResourceObject」を利用可能にします(ダイナミックパブリッシングには未対応)。

Data APIのResource定義に沿ってオブジェクトをJSON形式で出力します。stashモディファイア(またはmodelモディファイア)で取得するオブジェクトの datasourceを指定できます(省略時 entry)。versionモディファイアでData APIのバージョンを指定します(省略時3)。以下のテンプレートは、現在のコンテキストに沿った記事をData APIのレスポンスと同じ形で出力します。

<mt:Entries glue="," lastn="0" ><mt:if name="__first__">{
"totalResults":"<mt:EntriesCount>",
"items": [</mt:if>
<mt:ResourceObject stash="entry" version="2">
<mt:if name="__last__">]}</mt:if></mt:Entries>

model、idモディファイアを指定することで特定のオブジェクトをData APIのResource定義に沿ってJSON出力します。

<mt:ResourceObject model="page" id="123" version="2">
カテゴリー
テンプレート作成Tips
プラグイン
技術情報

ページの先頭へ