[EC-CUBE]商品種別ごとに決済画面の表示内容を振り分ける。
こんにちはfukasawaです。最近、二ノ宮知子先生の87CLOCKERSを読みました。
オーバークロックのことはよくわからないのですが、展開がとても熱くワクワクします。この世の何処かには、液体窒素でCPUを冷やしながら仕事するようなエンジニアさんも居るのでしょうか。
さて、話は全く変わるのですが、今回はEC-CUBEの決済処理で使えるちょっとしたカスタマイズについて書いてみようと思います。シーブレインに入社してからEC-CUBEのカスタマイズに携わる機会が増えました。折角なのでブログのネタにしてみようかと。
- 決済画面で商品種別ごとにテンプレートの表示内容を振り分ける
- 送料無料条件を満たしている場合に、決済画面の表示内容を書き換える
※EC-CUBEバージョン2.13.1の使用を想定した内容になっています
1. 決済画面で商品種別ごとにテンプレートの表示内容を振り分ける
EC-CUBEは商品種別ごとに決済処理を行う仕組みになっています。例えば、通常商品とダウンロード商品の決済処理で少しだけ表示内容を書き換えたい場合、テンプレート内で条件分岐し、表示内容を書き換えることができます。
<!--{if $cartKey == $smarty.const.PRODUCT_TYPE_NORMAL}-->
<div>現在、通常商品の決済処理を行っています。</div>
<!--{elseif $cartKey == $smarty.const.PRODUCT_TYPE_DOWNLOAD}-->
<div>現在、ダウンロード商品の決済処理を行っています。</div>
<!--{/if}-->
$cartKeyの中には商品種別IDが入っているので、その値によって表示内容を切り替えるという感じです。
PRODUCT_TYPE_NORMAL、PRODUCT_TYPE_DOWNLOADというのは通常商品、ダウンロード商品のIDを定義した定数です。デフォルトではそれぞれ「1」「2」というIDが設定されています。それぞれの商品種別に設定されたIDは管理画面のマスターデータ管理からmtb_product_typeを選択することで確認することができます。
この$cartKeyという変数ですが、カートセッションの中に入っている商品種別IDを各ページクラスのプロセスで変数に設定しテンプレート側に渡しています。
デフォルトの状態では、カート画面の[ご購入手続きへ]を押した後の画面、例えば「カートのインデックス(ログイン画面)」や「お届け先の指定」「お支払い方法・お届け時間などの指定」「入力内容ご確認」のページであれば変数が既に定義されているので、新しく変数を定義せずともテンプレート側で使用できる状態になっています。
しかし、例えばクレジットカード決済のプラグインを導入して決済処理中に新しく画面が増えた場合、そのプラグインのページクラス等で変数を定義し、テンプレートに渡してあげる必要があります。
…
$objCartSess = new SC_CartSession_Ex();
$this->cartKey = $objCartSess->getKey();
…
商品種別IDはカートセッション管理クラス(SC_CartSession)のgetKey()というメソッドを使うことで取得できます。
2. 送料無料条件を満たしている場合に、決済画面の表示内容を書き換える
上の説明では、SC_CartSessionクラスのgetKey()メソッドを使えばカートセッション中の商品種別IDを取得できると書きましたが、取得した商品種別IDをSC_CartSessionクラスのisDelivFree()メソッドに渡すことで、その商品種別の合計金額が送料無料条件を満たしているかどうかを取得できます。
例えば「入力内容のご確認画面」で送料無料であることを強調したい場合は以下のように書くことができます。
- /data/class_extends/page_extends/shopping/LC_Page_Shopping_Confirm_Ex.phpのaction()メソッド 等
…
$objCartSess = new SC_CartSession_Ex();
$currentCartKey = $objCartSess->getKey();
$this->is_deliv_free = $objCartSess->isDelivFree($currentCartKey); // boolean
…
- /data/Smarty/templates/default/shopping/confirm.tpl (PCの場合)
…
<!--{if $is_deliv_free}-->
<div class="is-device-free">送料無料です!</div>
<!--{/if}-->
…