> [[EC-CUBEカスタマイズ]]
> [[EC-CUBEメモ]] > [[EC-CUBEカスタマイズ]]
* ECCUBEカスタマイズ - 数量毎に送料を追加する [#f6bbce48]
#setlinebreak(on);

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

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

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

&br;

#contents
-- 関連
--- [[EC-CUBEカスタマイズ]]

** テーブルへのカラム追加 [#ce1f674f]
#html(<div style="padding-left:10px;">)
まずは、商品マスタに項目を追加
#myterm2(){{
alter table dtb_product add packing_num int(11) default null;
}}
#html(</div>)

** エンティティクラスへの項目追加 [#ed97fc8f]
#html(<div style="padding-left:10px;">)
src/Eccube/Entity/Product.php
#mycode2(){{
+    /**
+     * @var integer
+     */
+    private $packing_num;
+
+    /**
+     * Get packing_num.
+     *
+     * @return integer
+     */
+    public function getPackingNum()&#125;
+        return $this->packing_num;
+    &#125;
+
+    /**
+     * Set packing_num.
+     *
+     * @param integer packingNum
+     * @return \Eccube\Entity\Product
+     */
+    public function setPackingNum($packingNum)&#125;
+        $this->packing_num = $packingNum;
+        return $this;
+    &#125;
}}

#html(</div>)

** doctrineのDB定義にカラム追加 [#h32f2e7c]
#html(<div style="padding-left:10px;">)
src/Eccube/Resource/doctrine/Eccube.Entity.Product.dcm.yml
#mycode2(){{
             type: smallint
             nullable: true
             unsigned: false
+        packing_num:
+            type: smallint
+            nullable: true
+            unsigned: false
     manyToOne:
         Creator:
             targetEntity: Eccube\Entity\Member
}}
#html(</div>)

** 管理画面用のフォーム定義に項目追加 [#rd88f1f0]
#html(<div style="padding-left:10px;">)
src/Eccube/Form/Type/Admin/ProductType.php
#mycode2(){{
              ))
+            ->add('packing_num', 'text', array(
+                'label' => '送料単位',
+                'required' => false,
+            ))
         ;
     &#125;
}}
#html(</div>)

** 管理画面(商品登録画面)への項目追加 [#ueecd43e]
#html(<div style="padding-left:10px;">)
src/Eccube/Resource/template/admin/Product/product.twig
#mycode2(){{
                                   </div>
                               </div>
+                            &#123;# 送料単位 #&#125;
+                            <div id="detail_box__packing_num" class="form-group">
+                                &#123;&#123; form_label(form.packing_num) &#125;&#125;
+                                <div id="detail_box__packing_num" class="col-sm-3 col-lg-3">
+                                    <div class="input-group">
+                                        &#123;&#123; form_widget(form.packing_num) &#125;&#125;
+                                        <span class="input-group-addon">個毎に送料課金</span>
+                                    </div>
+                                    &#123;&#123; form_errors(form.packing_num) &#125;&#125;
+                                </div>
+                            </div>
}}
#html(</div>)

** 商品詳細ページに注記の表示 [#ec4d5fb7]
#html(<div style="padding-left:10px;">)
app/template/default/Product/detail.twig
#mycode2(){{
+                    &#123;# 送料単位 #&#125;
+                    &#123;% if Product.packing_num is not null %&#125;
+                    <div class="">※&#123;&#123; Product.packing_num &#125;&#125;個毎に送料がかかります。</div>
+                    &#123;% endif -%&#125;
}}
#html(</div>)

** 送料計算ロジックの修正 [#p1c86239]
#html(<div style="padding-left:10px;">)
src/Eccube/Service/ShoppingService.php
#mycode2(){{
     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;
}
}}
#html(</div>)

#todo(管理画面で送料再計算時の対応)



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