【ECCUBE】購入時に割引率を適用させて購入時自動送信メールにも反映させる
さて今回は金額ごとに割引率を設定して、購入時に自動的に計算して金額を設定しちゃうカスタマイズです。
お客さんが商品をカートに入れて、その中を見にいくと割引された金額が表示され、確認画面でも反映され、購入が決定されると自動で配信されるサンクスメールにも反映されている、というものです。
当然管理画面上にも『値引き』として、割引額が表示されます。
実際に機能追加を行ったECサイトとPHPのバージョンは以下の通りです。
(すでにECCUBEのVer3が出てますが…)
- EC-CUBE:2.13.1
- PHP:5.3.15
修正する箇所は多くありません。
要は購入の確定時に割引率を適用させて、自動的に送信されるメールなどにその内容を盛り込みます。
割引対象は税込の小計額に対して適用しますが、応用して合計金額にも適用できます。
また、購入時のプロセスでカートの中を見たときと確認画面のテンプレートにも割引額を表示させてやります。
<修正対象ファイル>
- /data/class_extends/SC_CartSession_Ex.php
- /data/Smarty/templates/(テンプレート名)/cart/index.tpl
- /data/Smarty/templates/(テンプレート名)/shopping/confirm.tpl
- /data/Smarty/templates/(テンプレート名)/mail_templates/order_mail.tpl
拡張クラスファイルに割引率適用のロジックを追記
まぁ要は、SC_CartSession.phpファイルからcalculate()メソッドをコピペして修正加えるだけです。
購入時の商品の計算はここで行っているので、金額に対して何らかの変更をしたいならこのメソッドを修正してやればいいです。超カンタン。
単純にすべての金額に割引率を適用しても芸がないので、下記の条件で割引きされるようにします。
<割引条件>
- 2,000円以上なら3%割引き
- 3,000円以上なら5%割引き
- 4,000円以上なら10%割引き
public function calculate($productTypeId, &$objCustomer, $use_point = 0, $deliv_pref = '', $charge = 0, $discount = 0, $deliv_id = 0, $order_pref = 0, $order_country_id = 0 ) { $results = array(); $total_point = $this->getAllProductsPoint($productTypeId); $results['tax'] = $this->getAllProductsTax($productTypeId, $order_pref, $order_country_id); $results['subtotal'] = $this->getAllProductsTotal($productTypeId, $order_pref, $order_country_id); $results['deliv_fee'] = 0; /* 割引率適用 ここら辺に割引率適用のロジックを入れます。 */ if($results['subtotal'] >= 2000){ $discount = round($results['subtotal'] * 0.03, 0); } if($results['subtotal'] >= 3000){ $discount = round($results['subtotal'] * 0.05, 0); } if($results['subtotal'] >= 4000){ $discount = round($results['subtotal'] * 0.1, 0); } //set discount value(計算で出た割引額を変数にいれてDBに反映できるようにします) $results['discount'] = $discount; /* ここまでが修正範囲 -------------------------------------------------- */ if (OPTION_PRODUCT_DELIV_FEE == 1) { $cartItems = $this->getCartList($productTypeId); foreach ($cartItems as $arrItem) { $results['deliv_fee'] += $arrItem['productsClass']['deliv_fee'] * $arrItem['quantity']; } } // ---------- 中略 ---------- return $results; } }
カート内、確認画面、メールのテンプレートファイル修正
「カートの中を見る」で表示されるページのテンプレート「index.tpl」を修正します。
140行目あたりになります。
<tr> <th colspan="5" class="alignR">小計</th> <td class="alignR"><!--{$tpl_total_inctax[$key]|number_format|h}-->円</td> </tr> <!-- ここから --> <tr> <th colspan="5" class="alignR">割引額</th> <td class="alignR"><!--{$arrData[$key].discount|number_format|h}-->円</td> </tr> <!-- ここまで --> <tr> <th colspan="5" class="alignR">合計</th> <td class="alignR"><span class="price"><!--{$arrData[$key].total-$arrData[$key].deliv_fee+$commission|number_format|h}-->円</span></td> </tr>
確認画面のテンプレートファイル「confirm.tpl」を修正します。
130行目あたりです。
<tr> <th colspan="4" class="alignR" scope="row">手数料</th> <td class="alignR"><!--{$arrForm.charge|number_format}-->円</td> </tr> <!-- ここから --> <tr> <th colspan="4" class="alignR" scope="row">割引額</th> <td class="alignR"><!--{$arrForm.discount|number_format}-->円</td> </tr> <!-- ここまで --> <tr> <th colspan="4" class="alignR" scope="row">合計</th> <td class="alignR"><span class="price"><!--{$arrForm.payment_total|number_format}-->円</span></td> </tr>
メールに表示されるテンプレートファイル「order_mail.tpl」を修正します。
これは受注時に自動送信されたり決済時に送るメールに含まれる内容のテンプレートになります。
ココはちょっとややこしいのですが、テンプレートに渡ってくる小計額の値は既に値引きされた金額であるため、割引額と足してあげないともとの金額がわかりません。
お客様に値引き前の金額を知ってもらってお得感を出したいので、それがいくらだったかをお知らせするために小計額を表す変数「$arrOrder.payment_total」と、割引額を表す変数「$arrOrder.discount」をたしてやります。
テンプレートエンジンSmartyのカスタム関数を使って、下記のように『オトクでしたよ』というのをアピールします。
<!--{if $arrOrder.discount != 0}--> ★おトクな割引き内容の詳細です!★ <!--{math equation = "x + y" x=$arrOrder.payment_total y=$arrOrder.discount assign="oritotal"}--> 割引前: <!--{$oritotal|number_format}--> 円 割引後: <!--{$arrOrder.payment_total|number_format|default:0}--> 円 ※ご請求金額 割引額: <!--{$arrOrder.discount|number_format|default:0}--> 円 <!--{/if}-->
するとこんな感じに5%引きが反映されてます・・・
★おトクな割引き内容の詳細です!★
割引前:3,000円
割引後:2,850円 ※ご請求金額
割引額: 150円
そして、同じファイル内の70行目辺りに小計や手数料にならんで『割引額』を表示してやります。
送 料 ¥<!--{$arrOrder.deliv_fee|number_format|default:0}--> 手数料 ¥<!--{$arrOrder.charge|number_format|default:0}--> <!-- ここから --> 割引額 ¥<!--{$arrOrder.discount|number_format|default:0}--> <!-- ここまで --> ============================================ 合 計 ¥<!--{$arrOrder.payment_total|number_format|default:0}-->
以上で修正は完了です。
いかがだったでしょうか。
今回はわかりやすくするために割引率をソース内に直書きしましたが、管理画面のパラメーター設定ページの設定内容から割引率の数値を反映させたほうが汎用性が高まります。
その際はデータベースに直接INSERTでmtb_constantsテーブルに定数を定義し、パラメーター設定ページで[登録する]ボタンを実行しましょう。(コレを実行しないとキャッシュファイルが更新されず設定が反映されません)
データベース登録は下記のクエリに内容を適宜変更して実行してください。
insert into mtb_constants values(‘CUSTOMER_PRICE_TITLE’, ‘会員価格(税込):’, 2000, ‘価格名称’);
あとはソース内の割引率に、パラメータ設定の値を読み込む追記をするだけです。
<参考書籍>
オープンソースECサイト構築ソフトEC-CUBE【Ver2.11対応】公式ガイドブック基本編
オープンソースECサイト構築ソフトEC-CUBE【Ver2.11対応】公式ガイドブック応用編
いつも読んでくれてありがとね!