質問 > 管理機能 > EC-CUBEの送料計算カスタマイズ |
管理機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
daior |
投稿日時: 2024/4/10 20:30
対応状況: −−−
|
新米 登録日: 2024/4/10 居住地: 投稿: 3 |
EC-CUBEの送料計算カスタマイズ EC-CUBEのバージョン:4.2.2、新規インストール
配送地域の郵便番号と商品に付与されたタグを基に、データベース内から送料を取得、合計していくカスタマイズを作成しています。 Plugin/Plugin名/EventListener 内に下記のようなイベントリスナーを設置し、配送地域が決定したタイミングで送料計算をトリガーさせようと考えましたが、うまくいきませんでした。 <?php namespace Plugin\CalcShippingCost42\EventListener; use Eccube\Event\EccubeEvents; use Eccube\Event\EventArgs; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Plugin\CalcShippingCost42\Repository\LandRepository; use Plugin\CalcShippingCost42\Repository\ShippingCostRepository; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Psr\Log\LoggerInterface; class CalcShippingCostListener implements EventSubscriberInterface { protected $landRepository; protected $shippingCostRepository; protected $shippingCost = 0; protected $session; private $logger; public function __construct(LandRepository $landRepository, ShippingCostRepository $shippingCostRepository,SessionInterface $session,LoggerInterface $logger) { $this->landRepository = $landRepository; $this->shippingCostRepository = $shippingCostRepository; $this->session = $session; $this->logger = $logger; } public static function getSubscribedEvents() { return [ EccubeEvents::FRONT_SHOPPING_DELIVERY_COMPLETE => 'onShoppingDeliveryComplete', // 他のイベントもここに追加 ]; } public function onShoppingDeliveryComplete(EventArgs $event) { $this->logger->info('onShoppingDeliveryComplete'); // 配送先住所を入力する際の処理 // まず、配送先住所の郵便番号から地域Idを取得 $order = $event->get('Order'); $zipcode = $order->getDelivery()->getZipcode(); $landId = $this->landRepository->findLandIdByZipcode($zipcode); // 商品のタグを取得する //全商品をループ $Products = $order->getProducts(); foreach ($Products as $Product) { $itemTypeId = 0; $tags = $Product->getTags(); foreach ($tags as $tag) { if ($landId != 99) { //自社配送パターン if ($tag->getName() == '特別な商品A') { $itemTypeId = 2; break; } } else{ if ($tag->getName() == '特別な商品A') { $alert = 'お住まいの地域ではお取り扱いできない商品が含まれています。'; } //外部配送パターン if($tag->getName() == '特別な商品B'){ $itemTypeId = 6; break; } if ($tag->getName() == '小サイズ') { $itemTypeId = 3; break; } if ($tag->getName() == '中サイズ') { $itemTypeId = 4; break; } if ($tag->getName() == '大サイズ') { $itemTypeId = 5; break; } } } if($itemTypeId == 0){ continue; } $this->shippingCost += $this->shippingCostRepository->findShippingCost($landId, $itemTypeId, $Product->getPrice()); } if ($alert) { // Flashメッセージを設定 $this->session->getFlashBag()->add('error', $alert); // エラーがあった場合は、カート画面にリダイレクト $event->stopPropagation(); $event->setResponse($event->getController()->redirect('cart')); } $order->setShippingTotal($this->shippingCost); } } 試したこと: __construct()内でlog出せるかチェック => 表示 FRONT_CART_ADD_COMPLETE で、log出せるか確認 => 出ない bin/console debug:container | grep 'CalcShippingCostListener' を実行し、サービスに登録されているかを確認 => 登録済み 不足している情報もあるかと思いますが、アドバイスいただければと思います。よろしくお願いいたします。 |
tattsu |
投稿日時: 2024/4/10 21:18
対応状況: −−−
|
長老 登録日: 2023/12/23 居住地: 投稿: 228 |
Re: EC-CUBEの送料計算カスタマイズ 4系では3系と違って、FRONT_SHOPPING_DELIVERY_COMPLETEというイベント自体が発行されなくなっています。
送料計算はPurchaseFlowでカスタマイズするようになってます。 https://doc4.ec-cube.net/customize_service
|
daior |
投稿日時: 2024/4/11 16:28
対応状況: −−−
|
新米 登録日: 2024/4/10 居住地: 投稿: 3 |
Re: EC-CUBEの送料計算カスタマイズ ご返答いただきありがとうございます!
頂いた記事を拝見し、次のように実装を変更しました 1. 自作Pluginによるカスタマイズをやめ、Customizeフォルダ内に直接ファイルを設置する方針に変更 2. Service/PurchaseFlow/Processor 内に、ShoppingFlowで送料計算を実行するファイルを設置 テストのため、注文手続き画面に遷移して送料を確認すると、カスタマイズされた送料が表示されませんでした。 以下はService/PurchaseFlow/Processor に配置した、送料計算用ファイルになります。 namespace Customize\Service\PurchaseFlow\Processor; use Eccube\Entity\ItemHolderInterface; use Eccube\Service\PurchaseFlow\ItemHolderPreprocessor; use Eccube\Service\PurchaseFlow\PurchaseContext; use Eccube\Annotation\ShoppingFlow; use Customize\Repository\LandRepository; use Customize\Repository\ShippingCostRepository; use Psr\Log\LoggerInterface; use Doctrine\ORM\EntityManagerInterface; /** * Tag,PostalCodeで送料変更 * * @ShoppingFlow */ class ShippingCostProcessor implements ItemHolderPreprocessor { /** * @var LandRepository */ protected $landRepository; /** * @var ShippingCostRepository */ protected $shippingCostRepository; /** * @var int */ protected $shippingCost = 0; protected $session; /** * @var LoggerInterface */ protected $logger; /** * @var EntityManagerInterface */ protected $entityManager; /** * * @param LandRepository $landRepository * @param ShippingCostRepository $shippingCostRepository * @param LoggerInterface $logger */ public function __construct( LandRepository $landRepository, ShippingCostRepository $shippingCostRepository, LoggerInterface $logger, EntityManagerInterface $entityManager ) { $this->landRepository = $landRepository; $this->shippingCostRepository = $shippingCostRepository; $this->logger = $logger; $this->entityManager = $entityManager; } /** * @param ItemHolderInterface $itemHolder * @param PurchaseContext $context * * @throws \Doctrine\ORM\NoResultException */ public function process(ItemHolderInterface $itemHolder, PurchaseContext $context) { $this->updateDeliveryFeeItem($itemHolder); } /** * @param ItemHolderInterface $itemHolder * * @throws \Doctrine\ORM\NoResultException */ private function updateDeliveryFeeItem(ItemHolderInterface $itemHolder) { /** @var Order $Order */ $Order = $itemHolder; $zipcode = $Order->getPostalCode(); $zipcode = str_replace('-', '', $zipcode); $landId = $this->landRepository->findLandIdByZipcode($zipcode); $Items = $Order->getProductOrderItems(); $this->logger->info('landId: ' . $landId); /* @var Shipping $Shipping */ foreach ($Items as $Item) { $Product = $Item->getProduct(); $quantity = $Item->getQuantity(); $itemTypeId = 0; $tags = $Product->getTags(); foreach ($tags as $tag) { $this->logger->info('tagName:'. $tag->getName()); if ($landId != 99) { //自社配送パターン if ($tag->getName() == '特定の商品A') { $itemTypeId = 1; break; } if($landId == 6){ $alert = '送料について、お問い合わせください。'; } } else{ if ($tag->getName() == '特定の商品A') { $alert = 'お住まいの地域ではお取り扱いできない商品が含まれています。'; } //外部配送パターン if($tag->getName() == '特定の商品B'){ $itemTypeId = 6; break; } if ($tag->getName() == '小サイズ') { $itemTypeId = 3; break; } if ($tag->getName() == '中サイズ') { $itemTypeId = 4; break; } if ($tag->getName() == '大サイズ') { $itemTypeId = 5; break; } } } if($itemTypeId == 0){ continue; } $this->shippingCost += $this->shippingCostRepository->findShippingCost($landId, $itemTypeId, $Item->getPrice())*$quantity; $this->logger->info('送料追加:'. $this->shippingCostRepository->findShippingCost($landId, $itemTypeId, $Item->getPrice())*$quantity); $this->logger->info('ItemTypeId:'.$itemTypeId); } $this->logger->info('送料合計:'.$this->shippingCost); $Order->setDeliveryFeeTotal($this->shippingCost); $this->entityManager->persist($Order); $this->entityManager->flush(); } } 試したこと、 logで送料合計を出力 => 期待通りの送料が出力されていました。 データベースにて、テーブル dtb_Order のdelivery_fee_totalを確認 => 1100.00円が登録されていました。 アドバイスいただければ幸いです。 |
tattsu |
投稿日時: 2024/4/11 17:28
対応状況: −−−
|
長老 登録日: 2023/12/23 居住地: 投稿: 228 |
Re: EC-CUBEの送料計算カスタマイズ 送料の明細を登録していないためではないでしょうか。
デフォルトの送料計算のロジックを追ってみると良いかと思います。
|
tao_s |
投稿日時: 2024/4/12 19:17
対応状況: −−−
|
仙人 登録日: 2008/8/20 居住地: 東京 投稿: 799 |
Re: EC-CUBEの送料計算カスタマイズ Processorの実行順も確認してみてください。
あなたのカスタマイズの後に標準の送料計算をしている可能性もあります
|
daior |
投稿日時: 2024/4/12 20:32
対応状況: −−−
|
新米 登録日: 2024/4/10 居住地: 投稿: 3 |
Re: EC-CUBEの送料計算カスタマイズ おかげさまでうまいこと送料計算できました!
アドバイス助かりました本当に!!!! |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |