EC-CUBE の修正メモ。ある条件で送料無料にするにはどうすればいいですか? | oki2a24 で商品購入の画面のどのロジックで送料の無料を判定しているか調べました。 data/class/pages/cart/<strong>LC_Page_Cart</strong>
.php の
isDelivFree 関数でした。
次に、EC-CUBE 修正メモ。会員の購入回数を知るにはどうしたらいいでしょう? | oki2a24 で会員登録して初めての購入かどうかを知るために調査しました。data/class/pages/mypage/LC_Page_Mypage.php の lfGetOrderHistory 関数で会員を引数に購入回数を知ることができます。
では、早速 PHP ファイルに手を加えていきます。ちなみに、EC-CUBE バージョンは、ちょっと古くて2.11.1であることをあらかじめお断りします。
参考ソース
- data/class/pages/mypage/LC_Page_Mypage.php
$customer_id = $objCustomer->getvalue('customer_id'); $this->arrOrder = $this->lfGetOrderHistory($customer_id, $this->objNavi->start_row);
lfGetOrderHistory 関数
修正対象ソース
- data/class/SC_CartSession.php
isDelivFree 関数 - data/class/pages/cart/LC_Page_Cart.php
action 関数 - data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Cart.php
lfGetCartData 関数
data/class/SC_CartSession.php
商品購入するのに4~5画面移動しますが、その中で一貫して商品や金額をつかさどるクラスになります。もちろん送料もこのクラスの中で扱っています。
関数追加
ファイルの末尾に LC_Page_Mypage.php のlfGetOrderHistory 関数をちょっと修正したものを追加します。
/** * 受注件数を返す * * @param mixed $customer_id カスタマーID * @param mixed $startno 0以上の場合は受注履歴を返却する -1の場合は件数を返す * @access private * @return int 会員の受注件数 */ function lfCountOrderHistory($customer_id) { $objQuery = SC_Query_Ex::getSingletonInstance(); $col = "order_id, create_date, payment_id, payment_total"; $from = "dtb_order"; $where = "del_flg = 0 AND customer_id = ?"; $arrval = array($customer_id); $order = "order_id DESC"; return (int)$objQuery->count($from, $where, $arrval); }
関数名を変えたことと、引数を会員 ID のみにしたことと、返却する件数は int 型に固定しました。
isDelivFree 関数の修正
/** * 送料無料条件を満たすかどうかチェックする * * @param integer $productTypeId 商品種別ID * @param string $customerId カスタマーID * @return boolean 送料無料の場合 true */ function isDelivFree($productTypeId, $customerId) { $objDb = new SC_Helper_DB_Ex(); $subtotal = $this->getAllProductsTotal($productTypeId); // 送料無料の購入数が設定されている場合 if (DELIV_FREE_AMOUNT > 0) { // 商品の合計数量 $total_quantity = $this->getTotalQuantity($productTypeId); if($total_quantity >= DELIV_FREE_AMOUNT) { return true; } } // 送料無料条件が設定されている場合 $arrInfo = $objDb->sfGetBasisData(); if ($arrInfo['free_rule'] > 0) { // 小計が無料条件を超えている場合 if($subtotal >= $arrInfo['free_rule']) { return true; } } // zzz // 会員で、かつ初回の買い物の場合 // echo "customerId:$customerId "; if ($customerId != '') { $orderHistoryNumber = $this->lfCountOrderHistory($customerId); // echo "orderHistoryNumber:$orderHistoryNumber "; if ($orderHistoryNumber == 0) { return true; } }
関数の引数にカスタマー ID を追加したのと、「会員で、かつ初回の買い物の場合」のコメント以下の処理を追加しました。$customerId != ” のときは、会員であることをあらわし、$orderHistoryNumber == 0 のときは、購入回数が0回であることをあらわします。
calculate 関数の修正
// 送料無料チェック if ($this->isDelivFree($productTypeId)) { $results['deliv_fee'] = 0; }
↓
// zzz // 送料無料チェック if ($this->isDelivFree($productTypeId, $objCustomer->getvalue('customer_id'))) { $results['deliv_fee'] = 0; }
isDelivFree 関数の引数にカスタマー ID を追加しました。
data/class/pages/cart/LC_Page_Cart.php
カートの中を見る、ページになります。送料無料チェックの行を修正します。
// 送料無料チェック $this->arrData[$key]['is_deliv_free'] = $objCartSess->isDelivFree($key);
↓
// zzz // 送料無料チェック $this->arrData[$key]['is_deliv_free'] = $objCartSess->isDelivFree($key, $objCustomer->getvalue('customer_id'));
isDelivFree 関数の引数を追加したのでこの関数を呼んでいるこの箇所も引数を追加します。幸い、SC_Customer_Ex クラスがインスタンス化されているので、何も考えずにカスタマー ID を引っ張ることができました。
data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Cart.php
すべてのページに表示されたりする左上のブロック部分になります。修正します。
// 送料無料チェック if (!$this->isMultiple && !$this->hasDownload) { $is_deliv_free = $objCart->isDelivFree($cart_key); }
↓
// zzz // 送料無料チェック if (!$this->isMultiple && !$this->hasDownload) { $objCustomer = new SC_Customer_Ex(); $is_deliv_free = $objCart->isDelivFree($cart_key, $objCustomer->getvalue('customer_id')); }
このカートのブロックではカスタマーの情報は扱っていませんので、使えるようにします。といっても、SC_Customer_Ex クラスをインスタンス化するだけで OK です。これだけで、カスタマー ID を取得することができます。便利♪
確認しました。
- 会員登録して1回目の購入時に、注文の確認画面で送料が0円であること、管理画面の受注詳細の送料が0円であること
- 会員登録して2回目の購入時に、注文の確認画面で送料が0円でないこと、管理画面の受注詳細の送料が0円でないこと(注文の確認画面の送料と一致すること)
OK です♪こちらの期待通りの動きをしてくれました!!!
おわりに
以上になりますが、ソース修正箇所に意味のない行を入れています、わざとです。echo はデバッグ用とわかるかと思いますが、 // zzz のコメント行は?一体?
// zzz 、これは修正箇所であることを示す、マーカーです。「zzz」で検索やグレップすればその場所にすぐ飛べるんです。すごく、便利ですよ。もちろん、デバッグ用の echo もですけれど、リリースするときは消しますよ♪