> EC-CUBEカスタマイズ

ECCUBEカスタマイズ - 数量毎に送料を追加する

以下、ECCUBE ver 3.0.15 にて動作確認。

ここでは、商品マスタに「送料の課金単位」を表す項目(packing_num)を追加し、この数量単位で送料がかかるように改修する。

例えば、
送料が 1,000 円の場合、送料の課金単位が5の商品を6個購入した場合は、送料が 2000円となるようにする。
尚、送料課金単位が未設定の商品は、通常の送料計算を行う事にする。(何個購入しても1000円)


テーブルへのカラム追加

まずは、商品マスタに項目を追加

alter table dtb_product add packing_num int(11) default null;

エンティティクラスへの項目追加

src/Eccube/Entity/Product.php

+    /**
+     * @var integer
+     */
+    private $packing_num;
+
+    /**
+     * Get packing_num.
+     *
+     * @return integer
+     */
+    public function getPackingNum()}
+        return $this->packing_num;
+    }
+
+    /**
+     * Set packing_num.
+     *
+     * @param integer packingNum
+     * @return \Eccube\Entity\Product
+     */
+    public function setPackingNum($packingNum)}
+        $this->packing_num = $packingNum;
+        return $this;
+    }

doctrineのDB定義にカラム追加

src/Eccube/Resource/doctrine/Eccube.Entity.Product.dcm.yml

             type: smallint
             nullable: true
             unsigned: false
+        packing_num:
+            type: smallint
+            nullable: true
+            unsigned: false
     manyToOne:
         Creator:
             targetEntity: Eccube\Entity\Member

管理画面用のフォーム定義に項目追加

src/Eccube/Form/Type/Admin/ProductType.php

              ))
+            ->add('packing_num', 'text', array(
+                'label' => '送料単位',
+                'required' => false,
+            ))
         ;
     }

管理画面(商品登録画面)への項目追加

src/Eccube/Resource/template/admin/Product/product.twig

                                   </div>
                               </div>
+                            {# 送料単位 #}
+                            <div id="detail_box__packing_num" class="form-group">
+                                {{ form_label(form.packing_num) }}
+                                <div id="detail_box__packing_num" class="col-sm-3 col-lg-3">
+                                    <div class="input-group">
+                                        {{ form_widget(form.packing_num) }}
+                                        <span class="input-group-addon">個毎に送料課金</span>
+                                    </div>
+                                    {{ form_errors(form.packing_num) }}
+                                </div>
+                            </div>

商品詳細ページに注記の表示

app/template/default/Product/detail.twig

+                    {# 送料単位 #}
+                    {% if Product.packing_num is not null %}
+                    <div class="">※{{ Product.packing_num }}個毎に送料がかかります。</div>
+                    {% endif -%}

送料計算ロジックの修正

src/Eccube/Service/ShoppingService.php

     public function getShippingDeliveryFeeTotal($shippings)
     {    
         $deliveryFeeTotal = 0; 
         $deliveryFeeTotal = 0;
         foreach ($shippings as $Shipping) {
+            //$deliveryFeeTotal += $Shipping->getShippingDeliveryFee();
+            // 商品数量毎の配送料設定対応 - START
+            $ShippingDeliveryFee = $Shipping->getShippingDeliveryFee();
+
+            $weight = 0;
+            $ShipmentItems = $Shipping->getShipmentItems();
+            foreach ($ShipmentItems as $ShipmentItem) {
+                $Quantity = $ShipmentItem->getQuantity();
+                $Product = $ShipmentItem->getProduct();
+                $PackingNum = $Product->getPackingNum();
+                if ($PackingNum != null && $PackingNum > 0) {
+                    $weight += $Quantity / $PackingNum;
+                }
+            }
+
+            $weight = $weight == 0 ? 1 : $weight;
+            $deliveryFeeTotal += $ShippingDeliveryFee * ceil($weight);
+            // 商品数量毎の配送料設定対応 - END
        }
        return $deliveryFeeTotal;
}
TODO: 管理画面で送料再計算時の対応

トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS