Shopware 6在订单提交的结帐中以编程方式更改发货方法



我有两种相同的运输方式,不同的价格矩阵,根据客户距离,应该选择两种运输方式中的一种。这必须在结帐订单确认时以编程方式完成,我查看了购物车收集器,但它是关于更改项目的价格。我没有在文档中找到任何关于运输方法更改的内容。

下面是我尝试改变它的onOrderValidation

private function getShippingMethod(string $id, Context $context): ?ShippingMethodEntity
{
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter("id", $id));
$criteria->setLimit(1);
$result = $this->shippingMethodRepository->search($criteria, $context);
return $result->getEntities()->first();
}
public function onOrderValidation(BuildValidationEvent $event)
{
$cart = $this->cartService->getCart($this->salesChannelContext->getToken(), $this->salesChannelContext);
$delivery = $cart->getDeliveries()->first();
//test

$shippingMethod = $this->getShippingMethod($this->getShippingMethodZoneXId(), $event->getContext());

$delivery->setshippingMethod($shippingMethod);
$cartDeliveries = new DeliveryCollection();
$cartDeliveries->add($delivery);
$cart->addDeliveries($cartDeliveries);
$this->cartService->setCart($cart);

...
}

在上面的代码中,我有cart对象和delivery。我得到了需要设置的shipping方法,但它没有更新。

我还需要重新计算运输价格,正确的方法是什么?如有任何建议,我将不胜感激。

更新:我也尝试过从shopware文档收集/处理,但也没有工作。

public function collect(CartDataCollection $data, Cart $original, SalesChannelContext $context, CartBehavior $behavior): void
{
$shippingMethod = $this->getShippingMethod($this->getShippingMethodZoneXId(), $context->getContext());
$shippingMethodId = $shippingMethod->getId();
$key = self::buildShippingKey($shippingMethodId);
$data->set($key, $shippingMethod);
}
public function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void
{
// change delviery
$deliveries = $this->builder->build($toCalculate, $data, $context, $behavior);
$deliveryOriginal = $deliveries->first();

if($deliveryOriginal === null) {
return;
}
$shippingMethod = $this->getShippingMethod($this->getShippingMethodZoneXId(), $context->getContext());
$deliveries->first()->setShippingMethod($shippingMethod);
$this->deliveryCalculator->calculate($data, $toCalculate, $deliveries, $context);
$toCalculate->setDeliveries($deliveries);
}

对于所有无法找到解决方案的人:

我创建了一个服务来处理它。这个函数将$shippingMethodId设置为给定的值。

public function changeShippingMethod(string $shippingMethodId, SalesChannelContext $context)
{
$contextToken = $context->getToken();
$dataBag = new DataBag([
'shippingMethodId' => $shippingMethodId,
]);
$this->contextSwitcher->update($dataBag, $context);
}

不要忘记添加use语句

use ShopwareCoreSystemSalesChannelSalesChannelSalesChannelContextSwitcher;
use ShopwareCoreFrameworkValidationDataBagDataBag;

和构造函数

private $contextSwitcher;
public function __construct(
SalesChannelContextSwitcher $contextSwitcher
) {
$this->contextSwitcher = $contextSwitcher;
}

我最终选择了另一种方法,上述方法似乎都不适合我。项目价格正在更新,但没有发货。

所以这就是你需要的,这个contextSwitcher依赖被注入并且它完成了工作。update()方法,可用于切换装运方式。

SalesChannelContextSwitcher $contextSwitcher,

相关内容

  • 没有找到相关文章

最新更新