Because We Love Happy Coding

フリーライターからエンジニアへ。発信力だけあり余ってる感じ

ECCUBE3の送料を変更する

目次

環境

手順など

何度やってもうまくいかず苦労した。手強い。

/* $eventから受注データを取り出す */
$order = $event->getArgument('Order');
$deliveryFee = $this->getDeliveryFee($order);
$order->setDeliveryFeeTotal($deliveryFee);

// eventにセットして完了
$event->setArgument('Order', $order);

ormの反映が必要か、と思いついて書いても動かない。

$this->app['orm.em']->persist($order);
$this->app['orm.em']->flush();

やっと気が付いたのは、Totalの文字。そうだ、もともとの送料はshippingに紐づけられているんだった。

複数配送は禁止しているので、ちょっと乱暴だが、foreachで回して全部に反映することにした。

foreach($shippings as $shipping){
  $shipping->setDeliveryFee($deliveryFee);
  
  $this->app['orm.em']->persist($shipping);
  $this->app['orm.em']->flush();
}

$this->app['orm.em']->persist($order);
$this->app['orm.em']->flush();

$event->setArgument('Order', $order);

ところがエラー

Catchable Fatal Error: Argument 1 passed to Eccube\Entity\Shipping::setDeliveryFee() must be an instance of Eccube\Entity\DeliveryFee, integer given, called in /home/brigie/www/ec/app/Plugin/SomeEc/SomeEvent.php on line 354 and defined

マジすか。DeliveryFeeオブジェクトってのがあるの。それ以外は受け付けないと。

foreach($shippings as $shipping){
  $shippingDeliveryFee = $shipping->getDeliveryFee();
  $shippingDeliveryFee->setFee($deliveryFee);
  
  $this->app['orm.em']->persist($shippingDeliveryFee);
  $this->app['orm.em']->persist($shipping);
  $this->app['orm.em']->flush();
}
$this->app['orm.em']->persist($order);
$this->app['orm.em']->flush();

// eventにセットして完了
$event->setArgument('Order', $order);

合計金額が合わない

ところがまだバグがある。

注文確認画面で送付先を変更すると、料金の合計が合わない。

調べたところ、setDeliveryFee()(だけ)ではなく、setShippingDeliveryFee()する必要がある模様。

複雑なのね…。