- 2008/12/05 00:08
- CakePHPで楽天API
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)'.
'&amp;keyword='.urlencode('キーワード').
'&amp;affiliateId=(アフィリエイトID)'.
'&amp;operation=ItemSearch'.
'&amp;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日間を費やしてしまった。。。
関連記事
- CakePHPで楽天WEBサービスを使う(商品コード検索)
- [CakePHP] 画像の圧縮比を変えて出力する
- CakePHPで楽天WEBサービスを使う(検索フォーム)
- CakePHPで楽天WEBサービスを使う(ソート順)
- CakePHPで楽天WEBサービスを使う(Modelにパラメータを渡す)
- CakePHPで楽天WEBサービスを使う(ページング処理)
- [CakePHP] リンク付き画像をヘルパーで表示する方法
- 「CakePHP修行」を追う #5
Sponsored Link
Google+
zenback
- Newer: http_build_queryを使うときの注意点(PHP)
- Older: EclipseでSubversionを使う
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以外のデータソースも前提としてくみ上げる仕組みになっていてほしいものです。
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







