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
- プラグイン
- 技術情報
コメントを投稿する