2012年3月25日カテゴリー:未分類

EC-CUBE:売れ筋ランキング(MySQL・PostgreSQL両対応)

ここで紹介している内容は、「EC-CUBEで売れ筋ランキングを表示する」とは異なるもので、MySQL・PostgreSQLの両方に対応しています。


ランキングの自動生成(dtb_rankingテーブルへの登録)は、システムの負担減を考え、ユーザーがアクセスした時に生成されるのではなく、管理者が管理画面にアクセスした際に生成されるように作成してあります。


1 データベース dtb_rankingテーブルの作成
———————————————
CREATE TABLE dtb_ranking(
rank int primary key,
product_id int,
quantity int
);
———————————————

2 ランキングの表示数を設定する定数をmtb_constantsテーブルに登録する。

ただし、表示数の最大値は「おすすめ商品表示数」となる。おすすめ商品表示数が8に設定されているとき、ランキング表示数を10に設定しても8個までしか表示されない。10個表示したい場合は、おすすめ商品表示数を10に設定する。
——————————————
id:RANKING_LIMIT
name:5(←定数)
rank:1246(←適宜)
remarks:売れ筋ランキングの表示数
——————————————

★ システム設定>パラメーター設定を開き、「この内容で登録する」をクリックする。

3 ランキングの自動生成(dtb_rankingテーブルへの登録)

システムの負担減を考え、ユーザーがアクセスした時に生成されるのではなく、管理者が管理画面にアクセスした際に生成されるようにする。
■data/class/pages/admin/LC_Page_Admin_Home.phpのfunction action()メソッド内の最初に追加

[php]
//ランキング情報の処理
$objQuery = SC_Query_Ex::getSingletonInstance();
$col = “*”;
$from = “(select product_id,sum(quantity) as total from dtb_order_detail group by product_id) as A”;
$where = “total >0”;

$objQuery->setorder(“total DESC”);
$objQuery->setlimit(RANKING_LIMIT);

$arrRanking = $objQuery->select($col, $from , $where);
$i = 0;
$objQuery->delete(“dtb_ranking”);
foreach($arrRanking as $val){
$i++;
$objQuery->insert(“dtb_ranking”,array(“rank”=>$i,”product_id”=>$val[‘product_id’],”quantity”=>$val[‘total’]));
}
[/php]

4 ファイル等の作成 下記の①~④のファイルとCSSファイルをダウンロードする

(1)下記ファイルを作成する(おすすめ商品[recommend]をもとに作成してある)
 ■html/frontparts/bloc/ranking.php

[php]
blocItems = $params[‘items’];
register_shutdown_function(array($objPage, “destroy”));
$objPage->init();
$objPage->process();
?>
[/php]

 ■data/class_extends/page_extends/rontparts/bloc/LC_Page_FrontParts_Bloc_Ranking_Ex.php

[php]

[/php]

 ■data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Ranking.php

[php]
action();
$this->sendResponse();
}

/**
* Page のアクション.
*
* @return void
*/
function action() {

// 基本情報を渡す
$objSiteInfo = SC_Helper_DB_Ex::sfGetBasisData();
$this->arrInfo = $objSiteInfo->data;

//ランキング商品表示
$this->arrBestProducts = $this->lfGetRanking();

}

/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}

/**
* ランキング商品検索.
*
* @return array $arrBestProducts 検索結果配列
*/
function lfGetRanking(){
$objQuery =& SC_Query_Ex::getSingletonInstance();
$objProduct = new SC_Product_Ex();

// ランキング商品取得
$col = ‘*’;
$table = ‘dtb_ranking’;
$objQuery->setOrder(‘rank’);
$objQuery->setLimit(RECOMMEND_NUM);
$arrBestProducts = $objQuery->select($col, $table, $where);

$objQuery =& SC_Query_Ex::getSingletonInstance();
if (count($arrBestProducts) > 0) {
// 商品一覧を取得
// where条件生成&セット
$arrBestProductIds = array();
$where = ‘product_id IN (‘;
foreach ($arrBestProducts as $key => $val) {
$arrBestProductIds[] = $val[‘product_id’];
}
$where .= implode(‘, ‘, $arrBestProductIds);
$where .= ‘)’;
$objQuery->setWhere($where);
// 取得
$arrTmp = $objProduct->lists($objQuery);
foreach ($arrTmp as $key => $arrRow) {
$arrProductList[$arrRow[‘product_id’]] = $arrRow;
}
// ランキング商品情報にマージ
foreach (array_keys($arrBestProducts) as $key) {
$arrRow =& $arrBestProducts[$key];
if (isset($arrProductList[$arrRow[‘product_id’]])) {
$arrRow = array_merge($arrRow, $arrProductList[$arrRow[‘product_id’]]);
} else {
// 削除済み商品は除外
unset($arrBestProducts[$key]);
}
}
}
return $arrBestProducts;
}
}
?>
[/php]

 ■data/Smarty/templates/default/frontparts/bloc/ranking.tpl

[php]

売れ筋ランキング