バージョン選択

フォーラム

メニュー

オンライン状況

70 人のユーザが現在オンラインです。 (58 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 70
もっと...

サイト内検索

質問 > 管理機能 > 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
居住地:
投稿: 233
Re: EC-CUBEの送料計算カスタマイズ
4系では3系と違って、FRONT_SHOPPING_DELIVERY_COMPLETEというイベント自体が発行されなくなっています。

送料計算はPurchaseFlowでカスタマイズするようになってます。
https://doc4.ec-cube.net/customize_service


----------------
-------------------
EC-CUBEカスタマイズ・バージョンアップ・不具合修正 
気軽にご相談ください。ゴールドランクパートナー。

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
居住地:
投稿: 233
Re: EC-CUBEの送料計算カスタマイズ
送料の明細を登録していないためではないでしょうか。

デフォルトの送料計算のロジックを追ってみると良いかと思います。


----------------
-------------------
EC-CUBEカスタマイズ・バージョンアップ・不具合修正 
気軽にご相談ください。ゴールドランクパートナー。

tao_s
投稿日時: 2024/4/12 19:17
対応状況: −−−
仙人
登録日: 2008/8/20
居住地: 東京
投稿: 799
Re: EC-CUBEの送料計算カスタマイズ
Processorの実行順も確認してみてください。
あなたのカスタマイズの後に標準の送料計算をしている可能性もあります


----------------
EC-CUBEカスタマイズ相談してください。
緊急のEC-CUBEの障害対応
EC-CUBEカスタマイズブログ

daior
投稿日時: 2024/4/12 20:32
対応状況: −−−
新米
登録日: 2024/4/10
居住地:
投稿: 3
Re: EC-CUBEの送料計算カスタマイズ
おかげさまでうまいこと送料計算できました!

アドバイス助かりました本当に!!!!
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,586名です
総投稿数は110,139件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1656
8
red
1570
9
mcontact
1318
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.