webservicesでjsonデータを出力する
cakePHPでwebservicesを使うと、ホームページ用にヘッダーやメニューなどのテーマで飾られたページとは別に、rssやxmlなどの生データを出力することができます。
JSON形式はJavascriptのオブジェクト、配列の生データの形式で、よく使われるXMLなどの形式より、javascriptでしか使われることがないと確定している場合には、変換などの必要がなく取扱いが容易になります。
cakePHPではあらかじめ、rest,rss,soap,xml,xmlrpcの各形式に対応していますが、JSONに対応させるためには多少の手間が必要です。(また他のやり方も存在します)
1./cake/libs/router.phpの152行目あたりに、
$this->connect('/json/:controller/:action/*', array('webservices' => 'Json'));
を追加します。
2.
app/controllers/components/json.phpにコントローラーを配置(空でよい)
app/views/helpers/json.phpにヘルパーを配置(空でよい)
app/views/layouts/json/にレイアウトを配置(<{$content_for_layout}>だけでよい)
app/views/(コントローラー名)/json/にアクション名のテンプレートを配置
たとえば商品一覧をテーブルで表示するページのアドレスは、
/items/index/
となりますが、webservicesでは、
/rss/items/index/
というアドレスになります。
商品マスタテーブル「items」のデータを、
$this->set('items', $this->Item->findAll());
で渡されたテンプレート(smartyを使用)の例は以下です
{"Item": [
<{foreach from=$items item=data name=itmloop}>
{"id":<{$data.Item.id}>,
"title":"<{$data.Item.title}>",
"categorye_id":<{$data.Item.categorye_id}>,
"comment":"<{$data.Item.comment}>",
(中略,,,)
"visible":<{$data.Item.visible}>,
"modified":"<{$data.Item.modified}>"}
<{if !$smarty.foreach.itmloop.last }>
,
<{/if}>
<{/foreach}>
]}

