EC-CUBEのカスタマイズ、ネットショップ制作メモ

主にEC-CUBEを利用したネットショップの制作、カスタマイズや独自機能の開発について

EC-CUBEをカスタマイズしてボリュームディスカウント機能を追加。

ボリュームディスカウント イメージ

同じ商品なら、1個よりもまとめて大量に購入して頂いた方が、ネットショップの運営者として嬉しいものです。
まとめて購入してもらう利点は客単価の増加など多々ありますが、ネットショップの場合、何と言っても発送の手間が減る事ではないでしょうか?
1つの商品を100カ所に送るより、100個の商品を1カ所に送った方が全然楽ですからね。
そんな「まとめ買い」を促進する「ボリュームディスカウント機能」というものがあります。
購入数量に応じて自動で商品単価を変え、より多く購入した方が、商品の単価が安くなってお客様がお得になるという機能です。

最近、かなり急ぎの案件でそんなボリュームディスカウント機能EC-CUBEカスタマイズして実装したのでご紹介したいと思います。

修正するファイルを出来るだけ少なく、標準の機能を活用する。

まず、今回の案件は非常に時間が無く、もの凄い短期間で仕上げなければならなかったので、可能な限り変更するファイル数を減らす事を考えました。

購入数量に応じて単価を変化させるには、商品情報が数量に応じた単価を情報として持っている必要があります。
EC-CUBEではそんな情報は持っていませんが、「規格」という機能を使って、ひとつの商品IDに対して複数の価格情報を持たせる事が出来ます。
通常、この「規格」は「色」や「サイズ」等の情報を入れ、
AというTシャツのブルーのLサイズ
といった商品指定が出来るのですが、今回はここに数量毎の単価を入れてしまいます。

その為に、まずは「割引」という特別な規格を登録します。
そしてこの「割引」規格の規格IDを特別な規格として、適当な名前を付けてデータベースのmtb_constantsというテーブルに登録します。
このmtb_constantsは、登録した情報がEC-CUBEの中でPHPファイルやテンプレートの中で定数として使える便利なテーブルです。*1
次に、この割引規格の規格分類として、「3個以上」「6個以上」を登録します。
これらの規格分類はclasscategoryとしてデータベースに登録されます。
ついでにこの特別な規格分類もmtb_constantsに登録しておきましょう。後で楽です。
各商品の3個未満の時の価格は通常価格として商品登録時に設定したものを、そのまま使います。
そうしないと、ボリュームディスカウントが無い商品など、商品登録等の作業が面倒になりますし、ボリュームディスカウント機能の実装自体も複雑になります。

カートに入れるタイミングで単価を決める。
次に、実際にフロント画面で購入数量に応じて単価を変える部分をカスタマイズします。
EC-CUBEでカートに商品を入れる処理は、モバイルサイトでもPCサイトでもSC_CartSessionというクラスのaddProductというメソッドで行うのでココを変えちゃいます。
addProductには引数として、product_id(商品ID)、classcategory_1(規格1)、classcategory_2(規格2)、quantity(数量)を渡してあげます。
ここで数量がボリュームディスカウント対象の数量だったらdtb_products_classというテーブルを検索して、その数量の単価、classcategoryを使います。
そうすると、カート画面でもちゃんと「商品A 割引:3個以上」と表示され、割引された価格で表示されます。
また、カート画面で数量の変更をした場合も自動で単価が変わる様に、SC_CartSessionupQuantitydownQuantityにも同じ処理を追加してあげます。
これで、PCサイトでもモバイルサイトでもちゃんと購入数量に応じたボリュームディスカウントがいい感じで実装されました。
ボリュームディスカウント機能 実装イメージ

実はカスタマイズしてグループディスカウント機能も足しました。

実は、このボリュームディスカウント機能以外に、
この商品とこの商品の中から3個以上買ったら割引
の様なグループディスカウント機能カスタマイズして追加したのでもう少し複雑だったんですが、ほぼSC_CartSessionしかいじらずに済みました。
効率良くEC-CUBEカスタマイズする為には、EC-CUBEの細かい仕組みや、データベースのテーブル構造等を深く理解しておく必要があります。
深くEC-CUBEを理解する為には、まず全ての機能を使ってみる事です。そしてその機能がどう動いているのか、ソースコードを読み、データベースに登録される情報を確認します。
きっとEC-CUBEカスタマイズの幅も広がると思いますので、是非一度やってみてください。

*1:管理画面から値を設定する度にキャッシュファイルが生成されるので、サイトを表示させる度に定数を取得する為にデータベースにアクセスする様な事はありません。