カテゴリー
コンピューター

EC-CUBE の修正メモ。ある条件で送料無料にするにはどうすればいいですか?

EC-CUBE を修正したいです。具体的には、新規会員登録して、最初の買い物のときだけ、問答無用で送料無料!です。管理画面での使い勝手は度外視して、今回はどのソースをいじっていけばよいのか、あたりをつけます。

方針として、金額を計算する関数 calculate があるので、これでグレップ検索し、どこかの calculate 前のタイミングで購入履歴をチェクし、購入回数が0回であれば送料を無料にすればよいと考えました。

まずは、calculate 関数を使用しているソースを検索しました。

find /var/www/html/eccube -type f -name \*.php -print | xargs grep -l "calculate(" /dev/null
/var/www/html/eccube/data/class/pages/cart/LC_Page_Cart.php
/var/www/html/eccube/data/class/pages/shopping/LC_Page_Shopping_Payment.php
/var/www/html/eccube/data/class/pages/shopping/LC_Page_Shopping_Confirm.php
/var/www/html/eccube/data/class/SC_CartSession.php

4つ見つかりました。ためしにひとつ、プログラムの中を見て見ます。

そして LC_Page_Cart.php での calculate の使い方をチェックしました。

            $this->arrData[$key] = $objCartSess->calculate($key, $objCustomer);

            // 送料無料チェック
            $this->arrData[$key]['is_deliv_free'] = $objCartSess->isDelivFree($key);

「送料無料チェック」というのを偶然見つけました。これを使えばよいのでは!?つまり isDelivFree 関数の内部を修正すればよさそうです♪ということで、方針を変えます。

isDelivFree 関数の中身を控えておきます。

パスはこちら

/var/www/html/eccube/data/class/pages/cart/LC_Page_Cart.php

関数の中身はこちら

    /**
     * 送料無料条件を満たすかどうかチェックする
     *
     * @param integer $productTypeId 商品種別ID
     * @return boolean 送料無料の場合 true
     */
    function isDelivFree($productTypeId) {
        $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;
            }
        }

        return false;
    }

isDelivFree 関数を修正しても問題ないか、出現場所をチェック

プログラムの動きが変わってしまうと困ります。なので変わらないように関数を修正するのは最低条件ですが、念のため関数が使われている箇所を確認します。修正する関数がこれでよいのか確認できますし、勉強にもなりますし!

find /var/www/html/eccube -type f -name \*.php -print | xargs grep -l "isDelivFree" /dev/null
/var/www/html/eccube/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Cart.php
/var/www/html/eccube/data/class/pages/cart/LC_Page_Cart.php
/var/www/html/eccube/data/class/SC_CartSession.php

isDelivFree 関数の修正で問題なさそうです。

フロントページ表示にかかわる is_deliv_free で検索

修正したあとちゃんと動くか確認するため、商品購入の画面の中でもこの関数を使っている画面を割り出しておきます。検索の方針としては、関数の結果を必ず「$this->arrData[$key][‘is_deliv_free’]」に入れているので、「is_deliv_free」で検索します。

find /var/www/html/eccube -type f -name \*.php -print | xargs grep -l "is_deliv_free" /dev/null
/var/www/html/eccube/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Cart.php
/var/www/html/eccube/data/class/pages/cart/LC_Page_Cart.php

テストするときはこの二つのソースのロジックを通る時を意識すればよさそう。具体的には、カートのブロックと、カートの中、ですね。ファイルの名前からの推測ですけれども。

「EC-CUBE の修正メモ。ある条件で送料無料にするにはどうすればいいですか?」への1件の返信

コメントを残す