So i need to add custom data for each product when customer adds it to card and remove it when customer removes from cart.
What i have done so far was creating observer that fires up when customer adds product to cart, but it doesnt save my data in global ('checkout/session'). In observer i can see my custom data saved.
This is the code in observer:
$quoteId = Mage::getSingleton('checkout/session')->getQuote()->getEntityId(); $quote = Mage::getModel('sales/quote')->load($quoteId); $carDetails = Mage::getSingleton('core/session')->getCarDetails(); if(empty($carDetails)){ $carDetails = 'No Car in Search'; } $quoteItems = $quote->getAllItems(); foreach ($quoteItems as $quoteItem){
$product = $quoteItem->getProduct();
$quoteItems = $product->setCarDetails($carDetails);
echo'<pre>';print_r($product->getId()); echo'<pre>';print_r($product->getCarId());die(); }
Any help or suggestion would be greatly appreciated.
If someone knows better way of doing this, also greatly appreciated.
p.s. i need to save this data later on as extra or note to Invoice or Order.
Solved! Go to Solution.
Hello @paganini
Please follow the below steps:
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <Vendor_Extension> <version>1.0.0</version> </Vendor_Extension> </modules> <global> <models> <extension> <class>Vendor_Extension_Model</class> </extension> </models> <events> <checkout_cart_product_add_after> <observers> <Vendor_Extension_Model_Observer> <type>singleton</type> <class>Vendor_Extension_Model_Observer</class> <method>checkout_cart_product_add_after</method> </Vendor_Extension_Model_Observer> </observers> </checkout_cart_product_add_after> <sales_model_service_quote_submit_before> <observers> <Vendor_Extension_Model_Observer_Set_Order> <type>singleton</type> <class>Vendor_Extension_Model_Observer</class> <method>setAdditionalDataToOrder</method> </Vendor_Extension_Model_Observer_Set_Order> </observers> </sales_model_service_quote_submit_before> </events> </global> </config>
<?php class Vendor_Extension_Model_Observer { public function checkout_cart_product_add_after($observer) { $event = $observer->getEvent(); $quoteItem = $event->getQuoteItem(); $messageOption = array( 'label' => 'Message', 'option_value' => 'Custom Value', 'value' => 'Custom Value', 'print_value' => 'Custom Value', ); $value = array('message' => $messageOption); $value = serialize($value); $quoteItem->addOption(array('code' => 'additional_options', 'product_id' => $quoteItem->getProductId(), 'value' => $value)); } public function setAdditionalDataToOrder($observer) { try { $quote = $observer->getEvent()->getQuote(); $order = $observer->getEvent()->getOrder(); $quoteItems = []; foreach ($quote->getAllVisibleItems() as $quoteItem) { $quoteItems[$quoteItem->getId()] = $quoteItem; } foreach ($order->getAllVisibleItems() as $orderItem) { $quoteItemId = $orderItem->getQuoteItemId(); $quoteItem = $quoteItems[$quoteItemId]; $additionalOptions = $quoteItem->getOptionByCode('additional_options'); if (count($additionalOptions) > 0) { $options = $orderItem->getProductOptions(); $options['additional_options'] = unserialize($additionalOptions->getValue()); $orderItem->setProductOptions($options); } } } catch (\Exception $e) { Mage::log($e->getMessage()); } } }
I hope it helps.
Hello @paganini
Please follow the below steps:
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <Vendor_Extension> <version>1.0.0</version> </Vendor_Extension> </modules> <global> <models> <extension> <class>Vendor_Extension_Model</class> </extension> </models> <events> <checkout_cart_product_add_after> <observers> <Vendor_Extension_Model_Observer> <type>singleton</type> <class>Vendor_Extension_Model_Observer</class> <method>checkout_cart_product_add_after</method> </Vendor_Extension_Model_Observer> </observers> </checkout_cart_product_add_after> <sales_model_service_quote_submit_before> <observers> <Vendor_Extension_Model_Observer_Set_Order> <type>singleton</type> <class>Vendor_Extension_Model_Observer</class> <method>setAdditionalDataToOrder</method> </Vendor_Extension_Model_Observer_Set_Order> </observers> </sales_model_service_quote_submit_before> </events> </global> </config>
<?php class Vendor_Extension_Model_Observer { public function checkout_cart_product_add_after($observer) { $event = $observer->getEvent(); $quoteItem = $event->getQuoteItem(); $messageOption = array( 'label' => 'Message', 'option_value' => 'Custom Value', 'value' => 'Custom Value', 'print_value' => 'Custom Value', ); $value = array('message' => $messageOption); $value = serialize($value); $quoteItem->addOption(array('code' => 'additional_options', 'product_id' => $quoteItem->getProductId(), 'value' => $value)); } public function setAdditionalDataToOrder($observer) { try { $quote = $observer->getEvent()->getQuote(); $order = $observer->getEvent()->getOrder(); $quoteItems = []; foreach ($quote->getAllVisibleItems() as $quoteItem) { $quoteItems[$quoteItem->getId()] = $quoteItem; } foreach ($order->getAllVisibleItems() as $orderItem) { $quoteItemId = $orderItem->getQuoteItemId(); $quoteItem = $quoteItems[$quoteItemId]; $additionalOptions = $quoteItem->getOptionByCode('additional_options'); if (count($additionalOptions) > 0) { $options = $orderItem->getProductOptions(); $options['additional_options'] = unserialize($additionalOptions->getValue()); $orderItem->setProductOptions($options); } } } catch (\Exception $e) { Mage::log($e->getMessage()); } } }
I hope it helps.
Thank you very much, this was exactly what i was looking for!
You saved the day!