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