Magento – Custom quote item attribute while adding product to cart

magento-1.9

I want to save some custom data to quote and order item, when a product is added to cart. I have a custom controller with an addtocartAction where i do the following:

...
$cart->addProduct($product, array(
    'qty' => $params['qty'] ? $params['qty'] : 1
));
...

The action is called via ajax with some data i have to save to the quote item. Where can i do that? Adding the custom attribute to the quote item is not the problem, but changing the value of the attribute. The Product can be more than one time in cart, but with different attribute values in the quote item.

Best Answer

Instead of using a custom controller it's easier (and perhaps cleaner) to do this from a controller. So, we'll need to build a little module for that

config.xml

<?xml version="1.0"?>
<config>
     [...]
  <global>
     <fieldsets>
         <sales_convert_quote_item>
             <custom_attribute_column>
                 <to_order_item>*</to_order_item>
             </custom_attribute_column>
         </sales_convert_quote_item>
     </fieldsets>
     <resources>
         <[namespace]_[module]_setup>
              <setup>
                  <module>[Namespace]_[Module]</module>
                  <class>Mage_Sales_Model_Mysql4_Setup</class>
              </setup>
         </[namespace]_[module]_setup>
     </resources>
     <models>
          <[namespace]_[module]>
               <class>[namespace]_[module]_Model</class>
          </[namespace]_[module]>
     </models>
     <events>
          <checkout_cart_product_add_after>
               <observers>
                    <[namespace]_[module]_checkout_cart_product_add_after>
                         <type>model</type>
                         <class>[Namespace]_[Module]_Model_Observer</class>
                         <method>checkoutCartProductAddAfter</method>
                    </[namespace]_[module]_checkout_cart_product_add_after>
               </observers>
          </checkout_cart_product_add_after>
     </events>
  </global>
     [...]
</config> 

your setup script

$installer = $this;
$installer->getConnection()->addColumn($this->getTable('sales_flat_quote_item'), 'custom_attribute_column', 'varchar(255) NOT NULL');
$installer->getConnection()->addColumn($this->getTable('sales_flat_order_item'), 'custom_attribute_column', 'varchar(255) NOT NULL');
$installer->endSetup();

And the observer [Namespace]/[Module]/Model/Observer.php

class [Namespace]_[Module]_Model_Observer
{
    public function checkoutCartProductAddAfter($observer)
    {
        $item = $observer->getEvent()->getQuoteItem();
        $item->setData('custom_attribute_column', 'the value');
        $item->save();

        return $this;
    }
}