読者です 読者をやめる 読者になる 読者になる

雨ときどき晴れ

最近はC#やASP.NET MVCやってます。NetduinoやCerbuinoも活用できるようになりました。

EC-CUBE で商品ごとに指定した個数以上購入すると送料無料になるようにしてみた。

通販サイトのキャンペーンで「この商品は送料無料!」や「3個購入で送料無料!」みたいな表記を
しているサイトって、見たことありますか?


ボクは、見たことありますよー。
EC-CUBEには、「5,000円以上購入すると送料無料」や「購入した商品数の合計が3個以上だと送料無料」のような
機能が使用可能です。
ただ、「PS3を3台購入すると送料無料(笑)」のようにある商品に限定した設定はできません。


なので、現在使用中のEC-CUBEにその機能を実装してみたいと思います。

変更したデータベースのテーブル

dtb_products
列名 Null 既定値 説明
deliv_free_floor int Null許可 0 送料無料にする個数の下限値(送料無料にしない場合は0)

上記の列を追加します。

変更したPHPファイル

  • /data/class/pages/admin/products/LC_Page_Admin_Products_Product.php
  • /data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
  • /data/class/helper/SC_Helper_DB.php

※この変更はデータベースがMySQLであることを前提としています。

/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php

管理ページの「商品管理」→「商品登録」でデータベースに登録する関係のところ
387行目くらい

/* 商品の登録 */
function lfRegistProduct($arrList) {
    $objQuery = new SC_Query();
    $objDb = new SC_Helper_DB_Ex();
    $objQuery->begin();

    // 配列の添字を定義
    // deliv_free_floor を追加
    $checkArray = array("name", "status", "product_flag",
                        "main_list_comment", "main_comment", "point_rate",
                        "deliv_fee", "comment1", "comment2", "comment3",
                        "comment4", "comment5", "comment6", "main_list_comment",
                        "sale_limit", "sale_unlimited", "deliv_date_id", "note",
			"deliv_free_floor");
    $arrList = SC_Utils_Ex::arrayDefineIndexes($arrList, $checkArray);

400行目くらい

    // INSERTする値を作成する。
    $sqlval['name'] = $arrList['name'];
    $sqlval['status'] = $arrList['status'];
    $sqlval['product_flag'] = $arrList['product_flag'];
    $sqlval['main_list_comment'] = $arrList['main_list_comment'];
    $sqlval['main_comment'] = $arrList['main_comment'];
    $sqlval['point_rate'] = $arrList['point_rate'];
    $sqlval['deliv_fee'] = $arrList['deliv_fee'];
    $sqlval['deliv_free_floor'] = $arrList['deliv_free_floor'];	// deliv_free_floor を追加
    $sqlval['comment1'] = $arrList['comment1'];

560行目くらい

// 入力エラーチェック
    function lfErrorCheck($array) {
    $objErr = new SC_CheckError($array);
    $objErr->doFunc(array("商品名", "name", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
    $objErr->doFunc(array("一覧-メインコメント", "main_list_comment", MTEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
    $objErr->doFunc(array("詳細-メインコメント", "main_comment", LLTEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
    $objErr->doFunc(array("詳細-メインコメント", "main_comment", $this->arrAllowedTag), array("HTML_TAG_CHECK"));
    $objErr->doFunc(array("ポイント付与率", "point_rate", PERCENTAGE_LEN), array("EXIST_CHECK", "NUM_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
    $objErr->doFunc(array("商品送料", "deliv_fee", PRICE_LEN), array("NUM_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
    // delive_free_floor をチェックするように追加
    $objErr->doFunc(array("送料無料", "deliv_free_floor", AMOUNT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "NUM_CHECK", "MAX_LENGTH_CHECK"));
    $objErr->doFunc(array("備考欄(SHOP専用)", "note", LLTEXT_LEN), array("SPTAB_CHECK", "MAX_LENGTH_CHECK"));
/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php

管理ページの「商品管理」→「商品登録」でデータベースからデータを取得する関係のところ
382行目くらい
T1.delive_free_floor を追加しています。

"vw_products_nonclass" => '
    (SELECT
        T1.product_id,
        T1.name,
        T1.deliv_fee,
	T1.deliv_free_floor,
        T1.sale_limit,
        T1.sale_unlimited,
        T1.category_id,
        T1.rank,
        T1.status,
/data/class/helper/SC_Helper_DB.php

「現在のカゴの中」などで合計金額や送料を計算するときに関係するところ
245行目くらい

/**
 * 商品規格情報を取得する.
 *
 * @param array $arrID 規格ID
 * @return array 規格情報の配列
 */
function sfGetProductsClass($arrID) {
    list($product_id, $classcategory_id1, $classcategory_id2) = $arrID;

    if($classcategory_id1 == "") {
        $classcategory_id1 = '0';
    }
    if($classcategory_id2 == "") {
        $classcategory_id2 = '0';
    }

    // 商品規格取得
    // deliv_free_floor を追加
    $objQuery = new SC_Query();
    $col = "product_id, deliv_fee, deliv_free_floor, name, product_code, main_list_image, main_image, price01, price02, point_rate, product_class_id, classcategory_id1, classcategory_id2, class_id1, class_id2, stock, stock_unlimited, sale_limit, sale_unlimited";
    $table = "vw_product_class AS prdcls";

1521行目くらい

    // 送料無料の購入数が設定されている場合
    if(DELIV_FREE_AMOUNT > 0) {
        if($total_quantity >= DELIV_FREE_AMOUNT) {
            $arrData['deliv_fee'] = 0;
        }
    }

    // 商品に送料無料の購入数が設定されている場合 ←これを追加します。
    foreach($objPage->arrProductsClass as $item) {
        if($item['deliv_free_floor'] > 0) {
            if($item['quantity'] >= $item['deliv_free_floor']) {
                $arrData['deliv_fee'] = 0;
            }
        }
     }
		
     // 送料無料条件が設定されている場合
     if($arrInfo['free_rule'] > 0) {
         // 小計が無料条件を超えている場合
         if($arrData['subtotal'] >= $arrInfo['free_rule']) {
             $arrData['deliv_fee'] = 0;
         }
      }

変更したテンプレートファイル

  • /data/Smarty/templates/default/admin/products/product.tpl
  • /data/Smarty/templates/default/admin/products/confirm.tpl
/data/Smarty/templates/default/admin/products/product.tpl

管理ページの「商品管理」→「商品登録」で入力するときに表示されるページ
210行目くらい

<tr class="fs12n">
    <td bgcolor="#f2f1ec" width="160">購入制限<span class="red"> *</span></td>
    <td bgcolor="#ffffff" width="557">
    <span class="red12"><!--{$arrErr.sale_limit}--></span>
    <input type="text" name="sale_limit" value="<!--{$arrForm.sale_limit|escape}-->" size="6" class="box6" maxlength="<!--{$smarty.const.AMOUNT_LEN}-->" style="<!--{if $arrErr.sale_limit != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}--><!--{/if}-->"/><input type="checkbox" name="sale_unlimited" value="1" <!--{if $arrForm.sale_unlimited == "1"}-->checked<!--{/if}--> onclick="fnCheckSaleLimit('<!--{$smarty.const.DISABLED_RGB}-->');"/>無制限</td>
    </td>
</tr>
<!-- ↓下記の項目を追加します。↓ -->
<tr class="fs12n">
    <td bgcolor="#f2f1ec" width="160">送料無料<span class="red"> *</span></td>
    <td bgcolor="#ffffff" width="557">
    <span class="red12"><!--{$arrErr.deliv_free_floor}--></span>
    <input type="text" name="deliv_free_floor" value="<!--{$arrForm.deliv_free_floor|escape}-->" size="6" class="box6" maxlength="<!--{$smarty.const.AMOUNT_LEN}-->" style="<!--{if $arrErr.deliv_free_floor != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}--><!--{/if}-->"/>個以上は送料無料(0個の場合は送料無料なし)<span class="red10"> (半角数字で入力)</span>
     </td>
</tr>
/data/Smarty/templates/default/admin/products/confirm.tpl

管理ページの「商品管理」→「商品登録」で入力内容の確認をするときに表示されるページ
140行目くらい

<tr>
    <td bgcolor="#f2f1ec" width="160" class="fs12n">購入制限</td>
    <td bgcolor="#ffffff" width="557" class="fs12n">
    <!--{if $arrForm.sale_unlimited == 1}-->
    無制限
    <!--{else}-->
    <!--{$arrForm.sale_limit|escape}--><!--{/if}-->
    </td>
</tr>
<!-- ↓下記の項目を追加します。↓ -->
<tr>
    <td bgcolor="#f2f1ec" width="160" class="fs12n">送料無料</td>
    <td bgcolor="#ffffff" width="557" class="fs12n">
    <!--{if 0 < $arrForm.deliv_free_floor}-->
    <!--{$arrForm.deliv_free_floor|escape}-->
    個以上は送料無料
    <!--{else}-->
    なし
    <!--{/if}-->
    </td>
</tr>


以上、おわり。
お疲れ様でした。