前回新規ページの追加方法について書きましたが、今回はEC CUBEの新規ブロックの追加方法について書いてみたいと思います。
新規ブロックも新規ページ追加と同様に管理画面から追加することも可能ですが、やはり静的なブロックを追加することしかできません。動的なブロックを追加するためにはすこしカスタマイズを行う必要があります。
手順はほぼ新規ページ追加のときと同じなのですが、一部DBへの登録を行う必要があるところだけが違います。
1.公開側にファイル作成
2.非公開側に処理用のファイルを作成(拡張用と2つ)
3.テンプレートファイル作成
4.DBへの登録
前回の例に従って「本日のランキングブロック」を追加してみましょう。今回も対象のバージョンは2.4.4とします。
まず、公開側にファイルを追加します。
/shop_name/frontparts/bloc/ranking.php
ブロックの場合は通常ここに置きます。
ファイルの内容は以下のようにします。
[php]
<pre>// {{{ requires
require_once(CLASS_EX_PATH . "page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Ranking_Ex.php");
// }}}
// {{{ generate page
$objPage = new LC_Page_FrontParts_Bloc_Ranking_Ex();
register_shutdown_function(array($objPage, "destroy"));
$objPage->init();
$objPage->process();</pre>
[/php]
次に処理部分のファイルを作成します。
/data/class_extends/page_extends/frontparts/bloc/LC_Page_Frontparts_Bloc_Ranking_Ex.php
/data/class/pages/frontparts/bloc/LC_Page_Frontparts_Bloc_Ranking.php
の2つです。
[php]
<pre>// {{{ requires
require_once(CLASS_PATH . "pages/frontparts/bloc/LC_Page_FrontParts_Bloc.php");
/**
* Ranking のページクラス.
*
* @package Page
*/
class LC_Page_FrontParts_Bloc_Ranking extends LC_Page_FrontParts_Bloc {
// }}}
// {{{ functions
/**
* Page を初期化する.
*
* @return void
*/
function init() {
parent::init();
$bloc_file = ‘ranking.tpl’;
$this->setTplMainpage($bloc_file);
}
/**
* Page のプロセス.
*
* @return void
*/
function process() {
if (defined("MOBILE_SITE") && MOBILE_SITE) {
$objView = new SC_MobileView();
} else {
$objView = new SC_SiteView();
}
$objSiteInfo = $objView->objSiteInfo;
// 基本情報を渡す
$objSiteInfo = new SC_SiteInfo();
$this->arrInfo = $objSiteInfo->data;
//おすすめ商品表示
//echo "arrDailyRankProducts 1 ";
$this->arrDailyRankProducts = $this->lfGetDailyRanking();
$objView->assignobj($this);
$objView->display($this->tpl_mainpage);
}
/**
* モバイルページを初期化する.
*
* @return void
*/
function mobileInit() {
$this->tpl_mainpage = MOBILE_TEMPLATE_DIR . "frontparts/"
. BLOC_DIR . ‘ranking.tpl’;
}
/**
* Page のプロセス(モバイル).
*
* @return void
*/
function mobileProcess() {
$this->process();
}
/**
* デストラクタ.
*
* @return void
*/
function destroy() {
parent::destroy();
}
//おすすめ商品検索
function lfGetDailyRanking(){
$objQuery = new SC_Query();
$objDb = new SC_Helper_DB_Ex();
//$this->tpl_pageno = defined("MOBILE_SITE") ? @$_GET[‘pageno’] : @$_POST[‘pageno’];
$arrval = array();
$arrval_order = array();
$arrval_category = array();
// ▲対象商品IDの抽出
$objQuery = new SC_Query();
$select = "select odd.product_id
from dtb_order od, dtb_order_detail odd
where od.order_id = odd.order_id AND ‘"
.date("Y-m-d h:i:s",strtotime("-1 day"))
."’ < od.create_date AND od.create_date < ‘".date("Y-m-d 23:59:59")."’";
$ret = $objQuery->getAll($select);
//商品毎の販売数のカウント
$arrCountSale = array();
foreach($ret as $key => $value){
$product_id = $value["product_id"];
if(!$arrCountSale[$product_id]){
$arrCountSale[$product_id] = 1;
} else {
$arrCountSale[$product_id]++;
}
}
arsort( $arrCountSale, SORT_NUMERIC );
$i = 0;
$arrProduct_id = array();
foreach($arrCountSale as $key => $value){
if($i < $this->disp_number){
$arrProduct_id[] = $key;
} else {
break;
}
$i++;
}
$arrProduct_id = array_keys($arrCountSale);
// 行数の取得
$linemax = count($arrProduct_id);
if($linemax < $this->disp_number){
// 取得範囲の指定(開始行番号、行数のセット)
$rand_num = $this->disp_number – $linemax;
$arrRandProductIDs = array();
$select = "SELECT product_id FROM dtb_products ORDER BY RANDOM() limit " . $rand_num;
$arrRandProductIDs = $objQuery->getAll($select);
$i = 0;
foreach($arrRandProductIDs as $key => $value){
if($i < $rand_num){
$arrProduct_id[] = $value["product_id"];
$arrCountSale[$value["product_id"]] = 0;
} else {
break;
}
$i++;
}
}
//dbg( $arrProduct_id );
$linemax = count($arrProduct_id);
$this->tpl_linemax = $linemax; // 何件が該当しました。表示用
// ページ送りの取得
//$this->objNavi = new SC_PageNavi($this->tpl_pageno, $linemax, $disp_num, "fnNaviPage", NAVI_PMAX);
$strnavi = $this->objNavi->strnavi;
$strnavi = str_replace(‘onclick="fnNaviPage’, ‘onclick="form1.mode.value=\”.’\’; fnNaviPage’, $strnavi);
// 表示文字列
$this->tpl_strnavi = empty($strnavi) ? " " : $strnavi;
$startno = $this->objNavi->start_row; // 開始行
// ▼商品詳細取得
$col = "*";
$from = "vw_products_nonclass";
// WHERE 句
// ▼対象商品IDの抽出
// 商品検索条件の作成(未削除、表示)
$where = "del_flg = 0 AND status = 1 ";
// 在庫無し商品の非表示
if (NOSTOCK_HIDDEN === true) {
$where .= ‘ AND (stock >= 1 OR stock_unlimited = 1)’;
}
//$where = ‘0=0’;
if (is_array($arrProduct_id) && !empty($arrProduct_id)) {
$where .= ‘ AND product_id IN (‘ . implode(‘,’, $arrProduct_id) . ‘)’;
} else {
// 一致させない
$where .= ‘ AND 0<>0’;
}
// 取得範囲の指定(開始行番号、行数のセット)
$objQuery->setLimitOffset($disp_num, $startno);
// 検索結果の取得
$arrProducts = $objQuery->select($col, $from, $where, $arrval_order);
// ▲商品詳細取得
$tmpProducts = array();
foreach($arrCountSale as $key => $item){
foreach($arrProducts as $item2){
if($item2[‘product_id’] == $key){
$tmpProducts[]=$item2;
break;
}
}
}
$arrProducts = $tmpProducts;
}
return $arrProducts;
}</pre>
[/php]
次にテンプレートファイルを作成します。
/data/Smarty/templates/default/bloc/ranking.tpl
これは自由なレイアウトのテンプレートを作ってもらえればいいですが、ひな形としては 同じブロックのbest5.tplなんかが使えるのではないかと思います。
最後にDBへの登録を行います。 コマンドラインからでもいいですし、myAdminなどの管理ツールを使ってもいいので、以下の登録作業を行ってください。
btb_blocテーブルにレコードを追加
bloc_name : ランキング
tpl_path : bloc/ranking.tpl
filename : ranking
php_path : frontparts/block/ranking.php
del_flg : 1
以上で、新規ブロックが追加できているはずです。 管理画面のレイアウト変更機能を使ってブロックの追加が行えます。 是非お試しください。