CakePHPで楽天WEBサービスを使う(ページング処理)

なんだか、CakePHPの初心者の私には、いきなり難しいことから始めてしまったような気がしないでもない、と思う今日この頃(^^;)

このシリーズはカテゴリーとしてまとめているので、過去の記事はこちらを見てください。


ということで。

次はページング処理を付けてみた。

今回開発で使用しているCakePHPのバージョンは1.2RC3で、1.2から標準でページング処理ができるみたいなのですが、どうもそのページ処理をしようと思うと、データベースに接続しようとするのです。今回の場合、WEB APIを使っているので、データベースは使いません。困ったあげく、PEAR:Pagerを使うことにしました。。。。標準のページングも使えるよ、というのをご存じの方がいらっしゃいましたら教えてください(^^;)

ということで、コントローラーを以下のようにしてみました。

class ItemsController extends AppController {

var $name = 'Items';
var $uses = 'Item';

var $conditions = array();    //リクエスト用パラメータ

//デフォルト商品表示
function index($page = 1){

//リクエスト用パラメータ
$conditions = array(
'developerId' => DEV_ID,
'affiliateId' => AFF_ID,
'operation' => 'ItemSearch',
'version' => '2008-09-01',
'keyword' => MAINKWD,
'hits' => PERPAGE,
'page' => $page,
);

//モデルからデータ取得
$data = $this->Item->findAll($conditions);

//商品配列
$this->set('items', $data['Items']['Item']);

//所得アイテム総数
$this->set('count',$data['count']);

//ページング処理
require_once ('Pager.php');

//Pager用パラメータ
$p_options = array(
"totalItems" => $data['count'],
"perPage" => PERPAGE,
'urlVar' => 'page',
'path' => FULL_BASE_URL.'/tokoton/items/',
'fileName' => '%d',
'append' => false,
'currentPage' => $page,
);

$pager =& Pager::factory($p_options);
$navi = $pager -> getLinks();
$this->set('navi',$navi["all"]);

}

}

ちなみにモデルは以下のような感じです。

class Item extends AppModel {

var $name = "Item";

function findAll($conditions = array()) {
//APIのリクエストURI
$req = 'http://api.rakuten.co.jp/rws/1.12/rest?';
uses('Xml');
$req .= http_build_query($conditions);
$xml = new XML($req);
$xml_array = Set::reverse($xml);
return $xml_array['Response']['Body']['ItemSearch'];
}
}

これで「http://localhost/tokoton/items/2」とやれば、次ページが表示される!

と思いきや、

Error: The action 2 is not defined in controller ItemsController
Error: Create ItemsController::2() in file: app\controllers\items_controller.php.

とエラーが。。。。

2というメソッドがない。。と。

そりゃそうか。

で、上記のようなURLでアクセスできないかと調べていると、routesを設定すればいいということらしい。

ということで、「app/config/routes.php」に以下を追加。

app/config/routes.php

Router::connect('/items/*', array('controller' => 'Items', 'action' => 'index'));

これで上記のURLの形式でページング処理ができようになりました。

う~ん。。。難しい。。。というか俺の頭が全然イケてないだけなのか。。。(^^;)


CakePHP ポケットリファレンス (Pocket Reference)