I have products with custom options. One of these products options must be updated just after product has been added to cart.
I then created an event launched just after "checkout_cart_add_product_complete".
My observer is called :
public function execute(\Magento\Framework\Event\Observer $observer) {
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$cart = $objectManager->get('\Magento\Checkout\Model\Cart');
$items = $cart->getQuote()->getAllItems();
foreach ($items as $item)
{
$options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());
$customOptions = $options['options'];
if (!empty($customOptions))
{
foreach ($customOptions as $key=>$option)
{
if ($option['label']=="foo")
{
$options['options'][$key]['value']="bar";
}
}
$cart->getquote()->getItemById($item->getItemId())->setOptions($options);
$cart->save();
}
}
}But when Cart is displayed, the product option has not been changed.
Thank you for your help,
Hi, you just need to use the same object $item to change options.
you can take existing options using
$item->getOptions()
you can also take specific options with the method:
$item->getOptionByCode('code_string')inside your foreach once you set your custom logic you can change option value using:
/** @var $serializer Magento\Framework\Serialize\SerializerInterface */
$itemOption = $item->getOptionByCode('code_string');
if (!empty($itemOption)) {
$additionalOptions = $serializer->unserialize($itemOption->getValue());
//Modify $additionalOptions array as needed
$itemOption->setValue($this->serializer->serialize($additionalOptions))->save();
}
Hi, you need to use the below code for each item.
$items = $quote->getAllVisibleItems();
foreach ($items as $item) {
$options = $item->getOptionByCode('additional_options');
if (!$options) {
$additionalOptions = [
'label' => 'Additional Option Label',
'value' => 'Additional Option Value'
];
$updateOptions = [
'code' => 'additional_options',
'value' => $this->serializer->serialize($additionalOptions)
];
$item->addOption($updateOptions);
$item->saveItemOptions();
}
}