1

I want to add additional options to the next product on the sales_quote_remove_item event while removing the first product from a cart.

First Product, I have already added the first product to cart with additional options

Second Product with no additional options(Normal Add to cart).

While removing First Product with additional options, I want to check if First product has additional options or not

if Yes, First Product will be removed from the cart, I want to add additional options to the Second Product in the cart as shown in the below screenshot.

Screenshot

app\code\Vendor\Module\etc\events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="sales_quote_remove_item">
        <observer name="remove_item" instance="Vendor\Module\Observer\AddFeeToRemoveItemObserver" />
    </event>
</config>

app\code\Vendor\Module\Observer\AddFeeToRemoveItemObserver.php

<?php

namespace Vendor\Module\Observer;

use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Checkout\Model\Session;
use Magento\Framework\Serialize\Serializer\Json as JsonSerializer;

class AddFeeToRemoveItemObserver implements ObserverInterface
{
    /**
     * @var RequestInterface
     */
    protected $_request;

    /**
    * Json Serializer
    *
    * @var JsonSerializer
    */
    protected $jsonSerializer;

    /**
     * Set payment fee to order
     *
     * @param EventObserver $observer
     * @return $this
     */
    public function __construct(
        JsonSerializer $jsonSerializer,
        RequestInterface $request,
        Session $checkoutSession,
        \Magento\Quote\Model\Quote\ItemFactory $quoteItemFactory,
        \Magento\Quote\Model\ResourceModel\Quote\Item $itemResourceModel,
        \Magento\Quote\Model\QuoteFactory $quoteFactory,
        \Magento\Quote\Api\CartRepositoryInterface $itemRepository
    ) {
        $this->_request = $request;
        $this->jsonSerializer = $jsonSerializer;
        $this->_checkoutSession = $checkoutSession;
        $this->quoteItemFactory = $quoteItemFactory;
        $this->itemResourceModel = $itemResourceModel;
        $this->quoteFactory = $quoteFactory;
        $this->itemRepository = $itemRepository;
    }

    /**
     * @param \Magento\Framework\Event\Observer $observer
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $writer = new \Zend\Log\Writer\Stream(BP . '/var/log/test.log');
        $logger = new \Zend\Log\Logger();
        $logger->addWriter($writer);
        $logger->info("==============>");

        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $priceHelper = $objectManager->create('Magento\Framework\Pricing\Helper\Data');

        $quoteItem = $observer->getQuoteItem();
        $quote = $quoteItem->getQuote();
        $product = $quoteItem->getProduct();

        $additionalOptions = [];
        if ($this->_request->getFullActionName() == 'checkout_cart_delete') {
            if (count($quote->getAllVisibleItems())) {
                foreach ($quote->getAllVisibleItems() as $loop_item) {
                    $helper = $objectManager->create('\Magento\Catalog\Helper\Product\Configuration');
                    $options=$helper->getCustomOptions($loop_item);
                    $quoteItemFeelabel = "";
                    foreach ($options as $option) {
                        $quoteItemFeelabel = $option['label'];
                    }
                    $price = 10;
                    $additionalOptions[] = array(
                                'label' => __("My Custom Label"),
                                'value' => $priceHelper->currency($price, true, false),
                            );
                    $loop_item->setProductOption(
                        'additional_options',
                        $this->jsonSerializer->serialize($additionalOptions)
                    );
                }
            }
        }
    }
}

I've tried the above code but It's not working.

If anyone has a solution, please let me know.

  • Do you need the additional options for only one item in the cart or multiple products will have the additional options. – Riddhish Bhayani Dec 23 '19 at 14:14
  • @RiddhishBhayani Only one – Mohit Rane Dec 24 '19 at 5:08
0

@MohitRane

I would recommend to use it at the quote level rather than Item level. Using that approach it will be easier to achieve that. Quote attribute is the better approach for ideas you can refer below.

custom-attributes-to-magento-2-quote-orders

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.