だ。ログ。

開発とかスノボとかやきうとか。

EC-CUBE3で値引きをする

一番てっとり早いのは無料プラグインで配布されているクーポンコードプラグインを利用する。
→ https://www.ec-cube.net/products/detail.php?product_id=1069
ロックオンが作っているのでまず間違いがない。無料、大半はこれで事足りてしまう。

ただし、これはコードを入れると言う事をユーザーにさせなければならない為、値引きに1アクションを使う事が嫌だ。と言う人も中には居る。
じゃあどうすればコードとして値引きが出来るのか。と言う事を追ってみた。

/src/Eccube/Resource/template/default/Shopping/index.twig

##342行目から
                        {% if Order.discount > 0 %}
                        <dl id="summary_box__discount_price">
                            <dt>値引き</dt>
                            <dd>{{ (0 - Order.discount)|price}}</dd>
                        </dl>
                        {% endif %}

$Orderの中身にdiscountと言う変数で「値引き」を設定している。
と言う訳で、値引きに金額を入れてみる。
/src/Eccube/Controller/ShoppingController.php

##125行目
        // form作成
        $builder = $app['eccube.service.shopping']->getShippingFormBuilder($Order);

        $event = new EventArgs(
            array(
                'builder' => $builder,
                'Order' => $Order,
            ),
            $request
        );

ページへの変数のセットをするこの上あたりに記述

$Order->setDiscount(1000);

この状態で表示を確認すると

小計    ¥ 12,345
手数料  ¥ 0
送料    ¥ 1,000
値引き  ¥ -1,000

合計 ¥ 13,345税込

ってな訳で、値引きには金額がセットされているが総計に対しての金額の再計算がされていない。

$discount = 1000;
$Order->setDiscount($discount);
$total = $total - $discount;
$Order->setTotal($total);

明示的に総計を再計算して$Orderにセットする。

小計    ¥ 12,345
手数料  ¥ 0
送料    ¥ 1,000
値引き  ¥ -1,000

合計 ¥ 12,345税込

と言う訳で値引き出来るようになった。
ただしこれは表示ページのみ。
同様の処理をconfirmの処理の中にも入れる必要があるので注意。
(記述だけだと表示だけなので、管理画面で確認した時に割引額と総計が変わっていない)

クーポンとの使い勝手の差は、個別商品の割引額を計算してソースコードに貼り付ける事が出来ること。
一律○%の割引等が出来る。ただし細かな設定や、割引額が大きすぎる場合、端数等の問題が有るのでこの辺をどう対処するかはやはりプラグインのロジックと言うのは練られているのでこの辺を考えたくなければクーポンの方が良いかと。