Home > CakePHPで楽天API > CakePHPで楽天WEBサービスを使う(データ取得をモデルでやってみる)

CakePHPで楽天WEBサービスを使う(データ取得をモデルでやってみる)

PHP初心者、CakePHP初心者の私が、無謀にも楽天WEBサービスをCakePHPで作ってみよう、という試み(^^;)

このシリーズはこちらのカテゴリーで一連の記事を見ることができます。

とりあえずは、CakePHPのインストールや設定等の説明は省きます。

いきなりコーディングできる状態から話を進めていきます。

で、CakePHPで楽天WEBサービス(API)を使ってページを作っていくわけですが、いきなり思いつきで「データ取得はコントローラーではなく、モデルでやりたい」という壁にぶつかってしまいました。

とりあえずできたのですが、まだまだ糞コード(^^;)。詳しい方はどんどんつっこんでくださいね(^^;)

まず、今回はCakePHPで、データベースは使用しないので、モデル全体でデータベースを使用しないことを明記します。以下のファイルを追加します。

app/app_model.php

< ?php

class AppModel extends Model {
var $useTable = false;
}

?>

次に、楽天WEBサービスのうち、商品検索を使用して、データを取得するモデルを作成します。

いちを、findAllのみをオーバーライドして、商品情報を取得しています。

app/models/Item.php

< ?php

class Item extends AppModel {
var $name = "Item";

function findAll() {

uses('Xml');

$reststr = 'http://api.rakuten.co.jp/rws/1.12/rest?'.
'developerId=(デベロッパーID)'.
'&keyword='.urlencode('キーワード').
'&affiliateId=(アフィリエイトID)'.
'&operation=ItemSearch'.
'&version=2008-09-01';

$getxml = new XML($reststr);
$xml_array = Set::reverse($getxml);

return $xml_array['Response']['Body']['ItemSearch']['Items']['Item'];

}
}

?>

次に、コントローラーは以下の感じ。

app/controllers/Items_controller.php

< ?php

class ItemsController extends AppController {
var $name = 'Items';
var $uses = 'Item';

function index(){
$data = $this->Item->findAll();
$this->set('items', $data);
}

}

?>

ビューは以下のような感じ。

app/views/Items/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']."点";
?>
<br />
<br />
< ?php endforeach; ?>

これをブラウザでプレビューしてみると以下のようになります。

う~ん。。。いきなり、ここまでで3日間を費やしてしまった。。。


関連記事

Sponsored Link

Google+

facebook

zenback

Comments:6

kotaro 2009/01/28

初めて人様のブログにコメントです。

DataSourceで出来たらもっと理想的なのだろうと思うのですが、マニュアルが空なのでどうすればよいのかわからないですね。。。
CakePHP1.2のソースを眺めているとDataSourceという抽象クラスがあって、DboSourceがデータベース用の具象クラスになっているみたいです。なので、DataSourceの種類ごとに具象クラスを作成するといった方針があるのだろうと予測しました。

showBOO 2009/01/29

>kotaroさん
なるほど。。DataSourceですか。
それはAPIの種類によって、モデルを振り分けるようにするということですかね?
すみません、Cake初心者で。。。
というよりも、PHP初心者に近いんですが・・・(^^;)

kotaro 2009/01/29

まったく無責任な発言ですみませんでした。
私はCakePHPは使用したことがありません。なんとなく面白そうだと思い、いろいろ調べまわったり、中身を見ていました。PHPの経験も浅いですが、エンジニアとしての経験は長いです。一時期、他の言語ですが、執筆活動もしていました。
Rubyの登場を契機にPHPプログラマには逆風な意見が飛び交っていますが、私なんかはわかりやすいから別にいいじゃん、と思っています。

マニュアルには載っていないと思われるのですが、以下のような感じです。

以下のファイルを作成。
app/models/datasources/rakuten_source.php

このファイルでDataSourceクラスを継承してRakutenSourceクラスを定義。オーバーライドすべきメソッドはDataSourceクラスを参照してください。コメントでわかると思います。

app/config/database.phpに以下を追加。

var $rakuten = array(
‘datasource’ => ‘rakuten’,
‘database’ => ‘rakuten’, // これは適当でよい?
);

これで、Modelの$useDbConfig属性に’rakuten’を設定するとfind()などのAPIは最終的にRakutenSourceクラスでオーバーライドしたものに渡ります。

showBOO 2009/01/30

>kotaroさん

なるほど!
データベースへのアクセスと同じように、データソースとしてAPIを定義するのですね。←この理解であってますかね?(^^;)
わかりやすい説明ありがとうございます。

私にはまだレベルが高いかも知れませんが、もう少し改良してみる段階で検討してみることにします(^^;)

kotaro 2009/01/30

> この理解であってますかね?
あってると思います。

モデルはデータ構造の表現者で、実際にデータを抱えているのはデータソースという考え方です。
データソースのAPIを見るとread()というのがありますが、いかにもRDBだけを対象としてないというのがうかがい知れます。

showBOO 2009/01/31

>kotaroさん

そうですね~。
他のフレームワークは分かりませんが、RDB以外のデータソースも前提としてくみ上げる仕組みになっていてほしいものです。

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://www.multiburst.net/sometime-php/2008/12/cakephpweb/trackback/
Listed below are links to weblogs that reference
CakePHPで楽天WEBサービスを使う(データ取得をモデルでやってみる) from Sometime PHP
pingback - CakePHPでAmazon Web Service | ARTS NET より 2009/02/09

[...] ちなみにCakePHPで楽天WEBサービスを使うのコメント欄でCakePHPのdatasourceをうまく使うヒントが書かれていました。これはデータ操作の全てをdatasourceに追いやることで、データ自体がRDBだろ [...]

Additional comments powered by BackType

Home > CakePHPで楽天API > CakePHPで楽天WEBサービスを使う(データ取得をモデルでやってみる)

Subscribe This Blog
Subscribe This Blog
FeedBurner

Search
Categories
Tag Cloud
Twitter Counter
Archives
My Other Blogs
Affiliate Blogs
Translator
Japanese flagEnglish flag

Return to page top