【EC CUBE 2.13】商品種別を使わずに配送方法等を分ける方法

先日EC CUBEで作成したサイトで、
商品の受注や配送を管理をしている人からこんなことを言われました。

STAFF
同人誌のような薄い冊子だけがカートに入っている場合に限り、配送方法に「ネコポス」が自動的に選択できるようにできないだろうか…。

普段は佐川急便を使っているようなのですが配送料が高く、
例えば60ページ程度の同人誌1冊送るだけでも、最安でも600円かかるらしいのです。

同人誌だけがカートに入っている場合に限り、ネコポスで配送できるようにしたいとのことなので、
商品種別で配送方法を分けようとしたのですが、
EC CUBEの仕様上、商品種別で配送方法等を処理分けすると同時購入が出来なくなります。
つまり、カートの中に同人誌と他のグッズが一緒に入った場合、
同人誌と他のグッズで分けて商品を決済してもらう必要が発生します。

そこのECサイトでは、幸い(?)商品ステータスを使用していなかったため、
そこで、商品ステータスに「ネコポス対応」を追加し、
「ネコポス対応」にチェックがついているものだけがカートに入っている場合のみ、配送方法で「ネコポス」を選べるように設定したいと思います。

商品ステータスに「ネコポス」を追加

管理画面にログインして、
システム設定 → マスターデータ管理 → mtb_statusを選択し、
ネコポスを追加します。

今回はID:1に設定します。

商品ステータスをカートセッションに追加

商品ステータスをカートセッションに追加します。

操作するPHPファイル
data/class/pages/products/LC_Page_Products_Detail.php

public function doCart()
    {
        $objCustomer = new SC_Customer_Ex();

        $this->arrErr = $this->lfCheckError($this->mode, $this->objFormParam,
                                            $this->tpl_classcat_find1,
                                            $this->tpl_classcat_find2);

        //商品ID取得
        $this_product_id = $this->objFormParam->getValue('product_id');
        //商品ステータス取得
        $objProduct = new SC_Product_Ex();
        $getProductStatus_arr = $objProduct->getProductStatus($this_product_id);
        $thisProductStatus = $getProductStatus_arr[$this_product_id]['0'];

        if (count($this->arrErr) == 0) {
            $objCartSess = new SC_CartSession_Ex();
            $product_class_id = $this->objFormParam->getValue('product_class_id');
            $objCartSess->addProduct($product_class_id, 
                $this->objFormParam->getValue('quantity'),
                //商品ステータスをセッションに追加
                $thisProductStatus
            );

            // 開いているカテゴリーツリーを維持するためのパラメーター
            $arrQueryString = array(
                'product_id' => $this->objFormParam->getValue('product_id'),
            );

            SC_Response_Ex::sendRedirect(CART_URL, $arrQueryString);
            SC_Response_Ex::actionExit();
        }

操作するPHPファイル
data/class/SC_CartSession.php

public function addProduct($product_class_id, $quantity,$product_status="")
    {
        $objProduct = new SC_Product_Ex();
        $arrProduct = $objProduct->getProductsClass($product_class_id);
        $productTypeId = $arrProduct['product_type_id'];
        $find = false;
        $max = $this->getMax($productTypeId);
        for ($i = 0; $i <= $max; $i++) { if ($this->cartSession[$productTypeId][$i]['id'] == $product_class_id) {
                $val = $this->cartSession[$productTypeId][$i]['quantity'] + $quantity;
                if (strlen($val) <= INT_LEN) { $this->cartSession[$productTypeId][$i]['quantity'] += $quantity;
                }
                $find = true;
            }
        }
        if (!$find) {
            $this->cartSession[$productTypeId][$max+1]['id'] = $product_class_id;
            $this->cartSession[$productTypeId][$max+1]['quantity'] = $quantity;
            $this->cartSession[$productTypeId][$max+1]['cart_no'] = $this->getNextCartID($productTypeId);
            //商品ステータスを追加
            $this->cartSession[$productTypeId][$max+1]['product_status'] = $product_status;
        }
    }

ステータスによる配送方法の条件設定

※今回は「ネコポス」に関する設定

以下の条件をどちらも満たす場合に「ネコポス」の利用が可能

  • 「ネコポス」対象商品のみがカートに入っている
  • カート内の「ネコポス」対象商品の合計数が4個未満

操作するPHPファイル
data/class/pages/shopping/LC_Page_Shopping_Payment.php

public function action()内
$objPurchase->verifyChangeCart($this->tpl_uniqid, $objCartSess);の下あたり

        //ネコポス不可フラグ
        $mailPost_delive = true;
        //メール便個数
        $sum_pr_quantity = "0";
        //商品ステータス取得
        foreach ($objCartSess->cartSession as $arr_cartSession) {
            foreach ($arr_cartSession as $value) {
                if(!empty($value['price'])){
                    //個数取得
                    $pr_quantity = $value["quantity"];
                    //商品ステータス取得
                    $pr_status = $value["product_status"];
                    //商品ステータスが1(ネコポス)のものがあれば合計数をチェック
                    if($pr_status == '1'){
						$sum_pr_quantity = $sum_pr_quantity + $pr_quantity;
                    //それ以外のものはfalse
                    }else{
                        $mailPost_delive = false;
                    }
                }
            }
        }
        //合計個数が4個以上はネコポス便を表示させない
        if($sum_pr_quantity > 3){
            $mailPost_delive = false;
        }
        //配送方法一覧取得
        $this->arrDeliv = $objDelivery->getList($cart_key,'',$mailPost_delive);

操作するPHPファイル
data/class/helper/SC_Helper_Delivery.php

    //ネコポス不可フラグ追加
    public function getList($product_type_id = null, $has_deleted = false,$mailPost_delive = null)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $col = '*';
        $where = '';
        $arrVal = array();
        if (!$has_deleted) {
            $where .= 'del_flg = 0';
        }
        if (!is_null($product_type_id)) {
            if (!$has_deleted) {
                $where .= ' AND ';
            }
            $where .= 'product_type_id = ?';
            $arrVal[] = $product_type_id;
        }
        //ネコポス便不可の場合の処理
        if($mailPost_delive === false){
            //echo $mailPost_delive;
            if (!$has_deleted) {
                $where .= ' AND deliv_id != (ネコポスに割り振られたdeliv_id)';
            }
        }
        $table = 'dtb_deliv';
        $objQuery->setOrder('rank DESC');
        $arrRet = $objQuery->select($col, $table, $where, $arrVal);

        return $arrRet;
    }	

何故かこの方法だと…

一応これで問題なくできたのですが、1つできないことがあって…。

システム設定 → マスターデータ管理 → mtb_statusを選択し、
ネコポスを追加した際に、今回はID:1に設定しましたが、
別のIDにすると出てこなくなるんです…。

僕の場合はID:1~5までは大丈夫だったのですが、
ID:6以降にすると何故かダメです…。なんででしょう😥😥😥

誰か分かるエロい方コッソリ教えてください。笑

シェアする

  • このエントリーをはてなブックマークに追加

フォローする