CakePHPで楽天WEBサービスを使う(ソート順)

前回は、検索フォームで商品を検索できるようにしました。

今回は、ソート順を変えられるようにしてみました。

このカテゴリーの過去の記事の一覧はこちらをご覧ください。

楽天のホームページでは、さまざまな方法でソート順を変更することができます。以下のような感じ。


  • 標準

  • 価格が安い

  • 価格が高い

  • 新着順

  • 感想の件数が多い


楽天WEBサービスでは、これとは別に以下のようなソート順が用意されています。

  • 標準(standard)

  • アフィリエイト料率順(昇順)(+affiliateRate)

  • アフィリエイト料率順(降順)(-affiliateRate)

  • レビュー件数順(昇順)(+reviewCount)

  • レビュー件数順(降順)(-reviewCount)

  • 価格順(昇順)(+itemPrice)

  • 価格順(降順)(-itemPrice)

  • 商品更新日時順(昇順)(+updateTimestamp)

  • 商品更新日時順(降順)(-updateTimestamp)


価格高い順やレビューの少ない順なんてものは消費者側からして、「そんなソート使うの?」と思うので、いくつかに絞りました。


  • 店長オススメ順(-affiliateRate)

    • ほんとはアフィリエイト率の高い順(^^;)



  • 価格が安い順(+itemPrice)

  • 価格が高い順(-itemPrice)

  • 商品レビューの多い順(-reviewCount)

  • 新着入荷順(-updateTimestamp)


という感じでいきたいと思います。

では、まずはコントローラーから。

app/controllers/items_controller.php

class ItemsController extends AppController {

var $name = 'Items';
var $uses = 'Item';
var $helpers = array ('Html','Form');

//ソート用配列
var $sorts = array (
'店長オススメ順'             =>    '-affiliateRate',
'価格が安い順'                =>    'itemPrice',
'価格が高い順'             =>    '-itemPrice',
'商品レビューの多い順'     =>    '-reviewCount',
'新着入荷順'                 =>    '-updateTimestamp'
);

//デフォルト順で商品表示
function index($sort=null,$page = 1) {

//リクエスト用パラメータ
$conditions = array (
'keyword' => MAINKWD,
'hits' => PERPAGE,
'page' => $page,
);

//ソートパラメータをセット
if ($sort === null || $sort == 'standard'){
$conditions['sort'] = 'standard';
$sort = 'standard';
} else {
$conditions['sort'] = (substr($sort,0,1) == "-") ? $sort : "+".$sort;
}

//モデルからデータ取得
$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' => $sort.'/%d',
'append' => false,
'currentPage' => $page,
);

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

$this->set('sorts',$this->sorts);        //ソート用配列

}
}

実は、「+」という文字もURLとして使いたかったのですが「+」をURLに使うと出コードしたときに半角スペースになってしまうので、しょうがなく上記のようなコードになってしまいました。

モデルは前回までと変わりありません。

ビューではとりあえずは以下のように書いてみました。

app/views/items/index.ctp

< ?php foreach ($sorts as $key => $value): ?>
< ?php echo "<a href=\"/tokoton/items/".$value."\">".$key."|"; ?>
< ?php endforeach; ?>

これで以下のようなリンクができます。

link

このリンクのURLは以下のような感じになります。

http://localhost/tokoton/items/-itemPrice

これで商品が価格の高い順になります。

なお、上記のコントローラーではパラメータとして、ソート順($sort)とページ番号($page)を受け取りますので、そのままページング処理できます。

下記のURLで2ページ目となります。

http://localhost/tokoton/items/-itemPrice/2

いい感じで出来上がってきました(^^;)


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