Sylius 通过 CartItemController 添加到购物车总计 0,00
Sylius add to cart via CartItemController gives 0,00 total
我们目前正在使用 Sylius 开发基于 ERP 的网上商店。其中一项功能是客户可以 select 多种尺寸和数量,并一次将它们添加到购物车。
通常 Sylius 会使用基于请求的 ItemResolver
仅针对一种变体。我们试图覆盖 CartItemController
以便我们能够循环请求变量并将所有项目添加到购物车。
我们尝试使用此代码:
try {
// When we have multiple
$reqSize = $request->request->get('size');
$reqQuantity = $request->request->get('quantity');
$reqProductID = $request->request->get('product_id');
$reqColorID = $request->request->get('variant_color_id');
if (null !== $reqSize && null !== $reqQuantity && null !== $reqProductID && null !== $reqColorID && count($reqSize) === count($reqQuantity)) {
$provider = $this->get('sylius.cart_provider'); // Implements the CartProviderInterface.
$currentCart = $provider->getCart();
$priceCalculator = $this->get('sylius.price_calculator');
$availabilityChecker = $this->get('sylius.availability_checker');
$productRepo = $this->get('sylius.repository.product');
$variantRepo = $this->get('sylius.repository.product_variant');
$sizeRepo = $this->get('jartazi.repository.sizegrid_size');
$colorRepo = $this->get('jartazi.repository.color');
$product = $productRepo->find(intval($reqProductID));
$color = $colorRepo->find(intval($reqColorID));
for ($i = 0; $i < count($reqSize); $i++) {
$size = $sizeRepo->find(intval($reqSize[$i]));
$variant = $variantRepo->findOneBy(['object' => $product, 'size' => $size, 'color' => $color]);
$quantity = intval($reqQuantity[$i]);
if (null === $variant) {
throw new ItemResolvingException('Selected item is out of stock.');
}
if (null !== $product && null !== $color && null !== $size && null !== $variant) {
// Make a cart item
$item = $this->get('sylius.factory.cart_item')->createNew();
$item->setSize($size);
$item->setVariant($variant);
$item->setQuantity($quantity);
$context = ['quantity' => $quantity];
if (null !== $customer = $cart->getCustomer()) {
$context['groups'] = $customer->getGroups()->toArray();
}
$item->setUnitPrice($priceCalculator->calculate($variant, $context));
// Check for equal products
foreach ($currentCart->getItems() as $cartItem) {
if ($cartItem->equals($item)) {
$quantity += $cartItem->getQuantity();
break;
}
}
if (!$availabilityChecker->isStockSufficient($variant, $quantity)) {
throw new ItemResolvingException('Selected item is out of stock.');
}
$event = new CartItemEvent($cart, $item);
// Update models
$eventDispatcher->dispatch(SyliusCartEvents::ITEM_ADD_INITIALIZE, $event);
$eventDispatcher->dispatch(SyliusCartEvents::CART_CHANGE, new GenericEvent($cart));
$eventDispatcher->dispatch(SyliusCartEvents::CART_SAVE_INITIALIZE, $event);
// Write flash message
$eventDispatcher->dispatch(SyliusCartEvents::ITEM_ADD_COMPLETED, new FlashEvent());
}
}
return $this->redirectAfterAdd($configuration);
}
} catch (ItemResolvingException $exception) {
// Write flash message
$eventDispatcher->dispatch(SyliusCartEvents::ITEM_ADD_ERROR, new FlashEvent($exception->getMessage()));
return $this->redirectAfterAdd($configuration);
}
但是当我们将一个添加到购物车时,购物车总数保持 0,00
在没有 ItemResolver 的情况下添加 CartItem 时,我们是否遗漏了一些东西以获得正确的总数?
提前致谢。
查看 sylius.order_item_quantity_modifier
服务:http://docs.sylius.org/en/latest/bundles/SyliusOrderBundle/services.html#orderitemquantitymodifier。
根据 Coudenysj 的规定,您可能需要在代码中的某处调用 OrderItemQuantityModifier。
我认为你需要在设置数量之前手动调用修改器
$this->get('sylius.order_item_quantity_modifier')->modify($item, $quantity);
// $item->setQuantity($quantity);
实际上,您似乎只需要调用修改函数,它就会将数量更新为正确的值
由于这个原因,我在制作自己的添加到购物车代码时遇到了很多麻烦。我最终修改了 CartItemType。但现在我确实需要能够一次将多个添加到购物车。所以我很想知道这是否能解决您的问题。
请post更新
是的,通过使用此服务,我们能够正确修改数量和单价。谢谢,我们显然忽略了这项服务。我们对 CartItem ($item->setQuantity($quantity);
) 的修改也被删除,因为这是一个自定义方法,setter 通常不可用。
我们目前正在使用 Sylius 开发基于 ERP 的网上商店。其中一项功能是客户可以 select 多种尺寸和数量,并一次将它们添加到购物车。
通常 Sylius 会使用基于请求的 ItemResolver
仅针对一种变体。我们试图覆盖 CartItemController
以便我们能够循环请求变量并将所有项目添加到购物车。
我们尝试使用此代码:
try {
// When we have multiple
$reqSize = $request->request->get('size');
$reqQuantity = $request->request->get('quantity');
$reqProductID = $request->request->get('product_id');
$reqColorID = $request->request->get('variant_color_id');
if (null !== $reqSize && null !== $reqQuantity && null !== $reqProductID && null !== $reqColorID && count($reqSize) === count($reqQuantity)) {
$provider = $this->get('sylius.cart_provider'); // Implements the CartProviderInterface.
$currentCart = $provider->getCart();
$priceCalculator = $this->get('sylius.price_calculator');
$availabilityChecker = $this->get('sylius.availability_checker');
$productRepo = $this->get('sylius.repository.product');
$variantRepo = $this->get('sylius.repository.product_variant');
$sizeRepo = $this->get('jartazi.repository.sizegrid_size');
$colorRepo = $this->get('jartazi.repository.color');
$product = $productRepo->find(intval($reqProductID));
$color = $colorRepo->find(intval($reqColorID));
for ($i = 0; $i < count($reqSize); $i++) {
$size = $sizeRepo->find(intval($reqSize[$i]));
$variant = $variantRepo->findOneBy(['object' => $product, 'size' => $size, 'color' => $color]);
$quantity = intval($reqQuantity[$i]);
if (null === $variant) {
throw new ItemResolvingException('Selected item is out of stock.');
}
if (null !== $product && null !== $color && null !== $size && null !== $variant) {
// Make a cart item
$item = $this->get('sylius.factory.cart_item')->createNew();
$item->setSize($size);
$item->setVariant($variant);
$item->setQuantity($quantity);
$context = ['quantity' => $quantity];
if (null !== $customer = $cart->getCustomer()) {
$context['groups'] = $customer->getGroups()->toArray();
}
$item->setUnitPrice($priceCalculator->calculate($variant, $context));
// Check for equal products
foreach ($currentCart->getItems() as $cartItem) {
if ($cartItem->equals($item)) {
$quantity += $cartItem->getQuantity();
break;
}
}
if (!$availabilityChecker->isStockSufficient($variant, $quantity)) {
throw new ItemResolvingException('Selected item is out of stock.');
}
$event = new CartItemEvent($cart, $item);
// Update models
$eventDispatcher->dispatch(SyliusCartEvents::ITEM_ADD_INITIALIZE, $event);
$eventDispatcher->dispatch(SyliusCartEvents::CART_CHANGE, new GenericEvent($cart));
$eventDispatcher->dispatch(SyliusCartEvents::CART_SAVE_INITIALIZE, $event);
// Write flash message
$eventDispatcher->dispatch(SyliusCartEvents::ITEM_ADD_COMPLETED, new FlashEvent());
}
}
return $this->redirectAfterAdd($configuration);
}
} catch (ItemResolvingException $exception) {
// Write flash message
$eventDispatcher->dispatch(SyliusCartEvents::ITEM_ADD_ERROR, new FlashEvent($exception->getMessage()));
return $this->redirectAfterAdd($configuration);
}
但是当我们将一个添加到购物车时,购物车总数保持 0,00
在没有 ItemResolver 的情况下添加 CartItem 时,我们是否遗漏了一些东西以获得正确的总数?
提前致谢。
查看 sylius.order_item_quantity_modifier
服务:http://docs.sylius.org/en/latest/bundles/SyliusOrderBundle/services.html#orderitemquantitymodifier。
根据 Coudenysj 的规定,您可能需要在代码中的某处调用 OrderItemQuantityModifier。
我认为你需要在设置数量之前手动调用修改器
$this->get('sylius.order_item_quantity_modifier')->modify($item, $quantity);
// $item->setQuantity($quantity);
实际上,您似乎只需要调用修改函数,它就会将数量更新为正确的值
由于这个原因,我在制作自己的添加到购物车代码时遇到了很多麻烦。我最终修改了 CartItemType。但现在我确实需要能够一次将多个添加到购物车。所以我很想知道这是否能解决您的问题。
请post更新
是的,通过使用此服务,我们能够正确修改数量和单价。谢谢,我们显然忽略了这项服务。我们对 CartItem ($item->setQuantity($quantity);
) 的修改也被删除,因为这是一个自定义方法,setter 通常不可用。