Add this to your XML;
<global> <sales> <quote> <item> <product_attributes> <location/> </product_attributes> </item> </quote> </sales> </global>
- This makes the product attributes accessible to the Mage_Sales_Model_Quote_Config class’ getProductAttributes() method. This reads in the sales/quote/item/product_attributes node.
-
This is called by the _assignProducts method of the Mage_Sales_Model_Resource_Quote_Item_Collection‘s _assignProducts() method, where it adds all of the attributes to the product collection of the quote item collection.
Add the columns to the quote and order item tables
-
Create an installer with the following:
$installer = new Mage_Sales_Model_Resource_Setup('core_setup'); $entities = array( 'quote_item', 'order_item' ); $options = array( // For some reason, VARCHAR works here, whereas elsewhere it must be TYPE_TEXT with a length of 255. 'type' => Varien_Db_Ddl_Table::TYPE_VARCHAR, 'visible' => true, 'required' => false ); foreach ($entities as $entity) { $installer->addAttribute($entity, 'location', $options); }
-
The addAttribute() method of the Mage_Sales_Model_Resource_Setup creates the columns on the quote_item and order_item tables.
Copy the attributes to the quote item
Unlike copying from quote items to order items, there isn’t an XML method to do this – it has to be accomplished through an observer. Add the following to the config (with the observer / method substituted):
<frontend> <events> <sales_quote_item_set_product> <observers> <observer_name> <class>model/observer</class> <method>addAttributesToQuoteItem</method> </observer_name> </observers> </sales_quote_item_set_product> </events> </frontend>
Then create the following method for the observer above:
public function addAttributesToQuoteItem($observer){ $quoteItem = $observer->getQuoteItem(); $product = $observer->getProduct(); $quoteItem->setLocation($product->getLocation()); }
Note: Values Don’t have to come from the product item
Any arbitrary information could be set on the quote or quote item; it does not have to come from the product itself. E.g. A different type of ship note could be set by a different observer. The associated columns just need to exist on the quote or quote item tables.
Copying quote item attributes to the order item
- This can be achieved with a small amount of XML:
<global> <fieldsets> <sales_convert_quote_item> <location> <to_order_item>*</to_order_item> </location> </sales_convert_quote_item> </fieldsets> </global>
Note: This will not copy the data to the sales_flat_shipment_item table.
Converting from an order item to other types of item
The following will copy the object’s attributes when converting the quote item back to a quote item, an invoice item, and a credit memo item
<global> <fieldsets> <sales_convert_order_item> <location> <to_quote_item>*</to_quote_item> <to_invoice_item>*</to_invoice_item> <to_cm_item>*</to_cm_item> </location> </sales_convert_order_item> </fieldsets> </global>
These are used in the Mage_Sales_Model_Convert_Order class’ itemToQuoteItem, itemToInvoiceItem, and itemToCreditmemoItem methods. Note: In default Magento, it does not appear that the itemToQuoteItem is used, so this should be included for third party extensions which may rely on this method.