[EC-CUBE覚書]クール便フラグ追加方法

2013年5月21日

バージョン2.11.5で、商品登録項目にクール便を追加して、当該商品に送料310円を加算できるようにしました。
覚書として残しておきますが、EC-CUBEのバージョンやサーバ環境や条件によって、以下の方法ではうまくいかない場合もあると思います。
ご了承ください。

参考サイト様

以下の4つのページをほぼ参考にして、クール便のフラグ追加をしました。
ありがとうございます。

EC-CUBE クール便対応|なるのブログ
eccube2.11 クール便の設定について|φ(..)メモとして残しておこう…
クール便フラグのコードにミスがありました。|φ(..)メモとして残しておこう…
冷凍と冷蔵は同梱できないのでクール便のコードを書き直しです。|φ(..)メモとして残しておこう…

phpmyadminでDBのdtb_productsにクール便のフィールドを作成

当該データベースを選択→左メニューより「dtb_products」を選択
→下部の1個のフィールドを追加する ●テーブルの末尾 を「実行する」をクリック!
入力する内容はこんな感じで問題ないと思います。
2012-07-26_005201

INTってなんだぁ?!と気になって、いちお調べました。
データ型一覧 – SQL Server

LC_Page_Admin_Products_Product.phpの修正

修正その1

eccube2.11 クール便の設定について|φ(..)メモとして残しておこう…

そしたら、/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php
の336行目に以下を追加

    $objFormParam->addParam("クールフラグ", "cool_flg", '', "", array());

これで、商品詳細編集ページにDBからデータを読み込んでくることができます。

以上のページを参考にしてますが、バージョンが違うせいか336行目ではありませんでした。
360行目から「// 新規登録, 規格なし商品の編集の場合」とコメントアウトされた内容項目の一覧がありますが、ここのいずれかに入れればいいようです。
自分はわかりやすいように商品送料とポイント付与率の間に入れました。

// 新規登録, 規格なし商品の編集の場合
~
        $objFormParam->addParam("商品送料", "deliv_fee", PRICE_LEN, 'n', array("NUM_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
        $objFormParam->addParam("クールフラグ", "cool_flg", '', "", array());
        $objFormParam->addParam("ポイント付与率", "point_rate", PERCENTAGE_LEN, 'n', array("EXIST_CHECK", "NUM_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));

修正その2

eccube2.11 クール便の設定について|φ(..)メモとして残しておこう…

今度は同じファイルのDBに商品を登録する「function lfRegistProduct(…」の中の
// INSERTする値を作成する。
というコメント以下に「$sqlval[‘****’] = $arrList[‘****’];」ってのが並んでいると思うので、

 $sqlval['cool_flg'] = $arrList['cool_flg'];

ってのを追加します。

とありますが、1088行目あたり『* DBに商品データを登録する』コメントアウトの中の項目でした。
1108行目あたり『// INSERTする値を作成する。』というコメントアウト下に、
「$sqlval[‘****’] = $arrList[‘****’];」がいくつかならんでいますので、そこの最後に入れました。

        // INSERTする値を作成する。
        $sqlval['name'] = $arrList['name'];
        $sqlval['status'] = $arrList['status'];
        $sqlval['main_list_comment'] = $arrList['main_list_comment'];
        $sqlval['main_comment'] = $arrList['main_comment'];
        $sqlval['comment1'] = $arrList['comment1'];
        $sqlval['comment2'] = $arrList['comment2'];
        $sqlval['comment3'] = $arrList['comment3'];
        $sqlval['comment4'] = $arrList['comment4'];
        $sqlval['comment5'] = $arrList['comment5'];
        $sqlval['comment6'] = $arrList['comment6'];
        $sqlval['main_list_comment'] = $arrList['main_list_comment'];
        $sqlval['deliv_date_id'] = $arrList['deliv_date_id'];
        $sqlval['maker_id'] = $arrList['maker_id'];
        $sqlval['note'] = $arrList['note'];
        $sqlval['cool_flg'] = $arrList['cool_flg'];

data/class/SC_Product.phpの修正

DBへの登録まわりが終わったら、後は送料計算のロジックにフラグによる送料を加えるだけです。
とりあえず、data/class/SC_Product.phpの663行目に
dtb_products.cool_flg,
を追加。
要は詳細データを取得するSQLにcool_flgも追加するってことです。

実際には、718行目のコメントアウト『* 商品詳細の SQL を取得する.』項目の中で、
,dtb_products.シリーズwが並んでる箇所があるので、「,dtb_products.cool_flg」を最後に挿入しました。781行目あたり(様式に合わせること)

SC_CartSession.phpの修正

この修正が一番大物。
冷凍と冷蔵は同梱できないのでクール便のコードを書き直しです。|φ(..)メモとして残しておこう…
これをそのまま引用させて頂きました。今のとこうまくいってます。

eshop/data/class/SC_CartSession.phpの671行目あたり、コードの内容に//送料無料チェックの項目が入ってますので、送料無料チェック項目の内容を全て選択して貼り付ける感じかな。入れる内容かなり長いですよ。
クール便の金額を310円にしています。

$cartItems = $this->getCartList($productTypeId);
foreach($cartItems as $val){


    //cool_flgが0なら、normal_flgをonに
    if ( $normal_flg <> "on" ){ 
        $normal_flg = ( $val["productsClass"]["cool_flg"] == 0 ) ? "on":"";
    }


    //cool_flgが1なら、冷蔵便フラグをonに
    if ( $cool_flg <> "on" ){ 
        $cool_flg = ( $val["productsClass"]["cool_flg"] == 1 ) ? "on":"";
    }
    //cool_flgが2なら、冷凍便フラグをonに
    if ( $freez_flg <> "on" ){ 
        $freez_flg = ( $val["productsClass"]["cool_flg"] == 2 ) ? "on":"";
    }
}
        
//クール便の場合はクール料金をプラス
if ($cool_flg == "on") { $results['deliv_fee'] += 310; }

//冷凍便の場合は地域送料+クール料金を別途プラス(同梱不可の為)
if ($freez_flg == "on") { 
    $pref_deliv = $objDb->sfGetDelivFee($deliv_pref, $deliv_id);
    $results['deliv_fee'] += ( $pref_deliv + 310 );
    if ($cool_flg != "on" && $normal_flg != "on" ){ $results['deliv_fee']-=$pref_deliv; } 
}


        // 送料無料チェック
        if ($this->isDelivFree($productTypeId)) {
            $results['deliv_fee'] = 0;
        }

//=====複数配送の場合の処理=============================================

if ( count($_SESSION['shipping']) > 1 ){

//---------[初期処理]-------------

    //とりあえず、$results['deliv_fee']を0にしておく
    $results['deliv_fee'] = 0;
            
    //何人目かを記録しておくためのフラグ
    $multi = 0;

    //店舗基本情報を取得
    $objDb = new SC_Helper_DB_Ex();
    $arrInfo = $objDb->sfGetBasisData();

//---------[初期処理終了]---------

    //人数分の繰り返し
    foreach ( $_SESSION['shipping'] as $deli) {

        //冷凍・冷蔵フラグを初期化
        $normal_flg = "";//追加
        $cool_flg = "";
        $freez_flg = "";

        //フラグ関係を初期化
        $total_indiv = 0;
        
        //商品のコードを配列から取得
        $temp_list = $deli['shipment_item'];
        $item = array_keys( $temp_list );

        //商品分の繰り返し
        for ($loop = 0; $loop < count($item); $loop++){

            $item_code = $item&#91;$loop&#93;;
                    
            $quant = $item_code;
            $quantity = $deli&#91;'shipment_item'&#93;&#91;$quant&#93;&#91;'quantity'&#93;;

            //商品価格
            $price = $deli&#91;'shipment_item'&#93;&#91;$quant&#93;&#91;"productsClass"&#93;&#91;"price02"&#93;;
            //商品個別送料
            $deliv = $deli&#91;'shipment_item'&#93;&#91;$quant&#93;&#91;"productsClass"&#93;&#91;"deliv_fee"&#93;;



            //冷蔵便フラグ
            if ( $normal_flg <> "on" ) { 
                $normal_flg = ( $deli['shipment_item'][$quant]["productsClass"]["cool_flg"] == 1) ? "on":""; 
            }

            if ( $cool_flg <> "on" ) { 
                $cool_flg = ( $deli['shipment_item'][$quant]["productsClass"]["cool_flg"] == 1) ? "on":""; 
            }
            //冷凍便
            if ( $freez_flg <> "on" ) { 
                $freez_flg = ( $deli['shipment_item'][$quant]["productsClass"]["cool_flg"] == 2) ? "on":"";
            }
                
            // 配送業者の送料を加算
            if (OPTION_DELIV_FEE == 1) {
                $deliv = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
            }
            
            //商品の購入金額
            $temp_indiv = $price * $quantity;
            $total_indiv += $temp_indiv;

            //送料の計算(商品毎に加算)
            $deliv_fee .= $deliv;

            //送料の合計が最大送料(配送地域別送料)を超えたら、送料は地域別送料に
            if ( $deliv_fee  > $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"])) {
                    
                $deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
                    
            }


        }//商品分の繰り返し

        //冷蔵便の処理
        if ( $cool_flg == "on" && $deliv_fee <> 0) { $deliv_fee += 310; }
        
        //冷凍便の場合は地域送料+クール料金を別途プラス(同梱不可の為)
        if ($freez_flg == "on") { 
            $pref_deliv = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
            $deliv_fee += ( $pref_deliv + 310 ); 
        }

        // 送料無料条件が設定されている場合
        if ($arrInfo['free_rule'] > 0) {
            // 小計が無料条件を超えている場合
            if( $total_indiv >= $arrInfo['free_rule']) {
                $deliv_fee = 0;
                if ($cool_flg != "on" && $normal_flg != "on" ){ 
                    $deliv_fee-=$pref_deliv;
                }
            }
        }

        //全注文の総トータル送料に個別送料を加算していく
        $results['deliv_fee'] += $deliv_fee;

        //送料と合計金額をセッションに保存(comfirm.tpl表示用)
        $_SESSION['multi_deliv'][$multi]['deliv_fee'] = $deliv_fee;
        $_SESSION['multi_deliv'][$multi]['total_indiv'] = $total_indiv;

        $multi++;

    }//人数分の繰り返し

}//if

//====複数配送の場合の送料再計算終了==============================

products.tplの修正

管理画面で商品を登録する時のクール便の項目を追加します。
data/Smarty/templates/admin/products/products.tplで、商品送料とポイント付与率のtrの間に下のクール便フラグのtrを挿入しました。

<tr>
    <th>クール便フラグ
    <td>
    <span class="attention">

    <select name="cool_flg">
    <option value="0" <!--{if $arrForm.cool_flg == 0}-->selected<!--{/if}-->>常温便</option>
    <option value="1" <!--{if $arrForm.cool_flg == 1}-->selected<!--{/if}-->>冷蔵便</option>
    <option value="2" <!--{if $arrForm.cool_flg == 2}-->selected<!--{/if}-->>冷凍便</option>
    </select>
    
    </td>
</tr>

EC-CUBE

Posted by ponnao