CakePHPで楽天WEBサービスを使う(商品コード検索)

ちょっとここで一息?ついて、商品コード検索を実装してみることにした。

前回までの構築で、以外と簡単に商品コード検索は実装することができた。

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


まずは、それぞれのコードをのせてみます。まずはモデル。

app/models/Itemcode.php

class Itemcode extends AppModel {

var $name = "Itemcode";
var $api_def = array(
'developerId' => DEV_ID,
'affiliateId' => AFF_ID,
'operation' => 'ItemCodeSearch',
'version' => '2007-04-11',
);

function findAll($conditions = array()) {

$req = 'http://api.rakuten.co.jp/rws/1.11/rest?';
$api_params = array_merge($conditions,$this->api_def);

uses('Xml');

foreach ($api_params as $key => $value){
$req .= '&'.$key.'='.$value;
}

$xml = new XML($req);
$xml_array = Set::reverse($xml);
return $xml_array['Response']['Body']['ItemCodeSearch'];

}
}


続いてコントローラ。

app/controllers/Itemcodes_controller.php

class ItemcodesController extends AppController {

var $name = 'Itemcodes';
var $uses = 'Itemcode';

function index($shopname = null,$codenum = null){

$conditions = array(
'itemCode' => $shopname.':'.$codenum,←※1
);

$data = $this->Itemcode->findAll($conditions);
$this->set('items', $data);

}
}

ビューは以下の通り。

app/views/Itemcodes/index.ctp

<?php foreach ($items as $product): ?>

<?php //商品名を表示
echo $html->link($product['itemName'],$product['affiliateUrl'],null,null,false);
?>
<br />
<?php
echo $html->link($html->image($product['mediumImageUrl']),
$product['affiliateUrl'],
array(
'target' => '_blank' ,
'title' => $product['itemName'],
'alt' => $product['itemName']),
null,false);
?>
<br />
<?php //価格を表示
echo number_format($product['itemPrice']).'円';
?>
<?php
echo $product['reviewCount']."件のレビュー";
echo " 評価:".$product['reviewAverage']."点";
?>

<?php endforeach; ?>

で、ここで一つ注意点だが、※1の部分。

楽天APIの商品コードは「shop:1234」というような書式になっている。しかし、この書式をURLの一部にした場合、たとえば、「/itemcodes/shop:1234」などとやっても、GETデータとしてコロン以下を取得できないみたいだ。。。え?できる方法あるの?教えてください(^^;)

ということで、URLを「/itemcodes/shop/1234」という形式に変更した。

なので、この商品コードページに渡すリンクは以下のようにしてみた。

echo $html->link('商品個別ページ',
FULL_BASE_URL.'/tokoton/itemcodes/'.str_replace(':','/',$product['itemCode']),
array('title'=>$product['itemName'])
);

要するに、やっていることは、「shop:1234」を一度「shop/1234」に変換しURLとして渡し、コントローラ側でもう一度「shop:1234」の書式になおしてAPIに渡す、と言うことをやっている。

う~ん、めんどくさいな~。

「shop:1234」というURL形式が通らないはずはないのだが。。。

なんかうまい方法はないですかね~?(^^;)