> [[EC-CUBEカスタマイズ]] * ECCUBEカスタマイズ - 数量毎に送料を追加する [#f6bbce48] #setlinebreak(on); 以下、ECCUBE ver 3.0.15 にて動作確認。 ここでは、商品マスタに「送料の課金単位」を表す項目(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()} + return $this->packing_num; + } + + /** + * Set packing_num. + * + * @param integer packingNum + * @return \Eccube\Entity\Product + */ + public function setPackingNum($packingNum)} + $this->packing_num = $packingNum; + return $this; + } }} #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, + )) ; } }} #html(</div>) ** 管理画面(商品登録画面)への項目追加 [#ueecd43e] #html(<div style="padding-left:10px;">) src/Eccube/Resource/template/admin/Product/product.twig #mycode2(){{ </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> }} #html(</div>) ** 商品詳細ページに注記の表示 [#ec4d5fb7] #html(<div style="padding-left:10px;">) app/template/default/Product/detail.twig #mycode2(){{ + {# 送料単位 #} + {% if Product.packing_num is not null %} + <div class="">※{{ Product.packing_num }}個毎に送料がかかります。</div> + {% endif -%} }} #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(管理画面で送料再計算時の対応)