要获得整个解决方案,需要执行许多步骤。
首先,创建一个新模块。使用模块创建器 http://www.magentocommerce.com/extension/1108/modulecreator如果你希望。
然后,写一个设置脚本 http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-6-magento-setup-resources在您的模块中将新字段添加到 Magento 的属性结构中,例如:
$setup = new Mage_Sales_Model_Mysql4_Setup('core_setup');
$setup->startSetup();
$setup->addAttribute('quote', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false));
$setup->addAttribute('order', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false));
$setup->addAttribute('invoice', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false));
$setup->addAttribute('creditmemo', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false));
注意使用Mage_Sales_Model_Mysql4_Setup
将字段添加到相关的sales_flat_quote
and sales_flat_order
tables.
现在,将以下值插入模块的 config.xml 文件中:
<global>
<fieldsets>
<sales_convert_quote>
<my_attribute>
<to_order>*</to_order>
</my_attribute>
</sales_convert_quote>
<sales_convert_order>
<my_attribute>
<to_cm>*</to_cm>
<to_invoice>*</to_invoice>
</my_attribute>
</sales_convert_order>
</fieldsets>
这将指示 Magento 将自定义字段的值从报价复制到订单、发票和credit_memo 等。
然后在您的自定义块/控制器代码中,您将能够使用 Magento 的神奇 getter 和 setter 来保存值。
$oQuote = Mage::getSingleton('checkout/session')->getQuote();
$oQuote->setMyAttribute('some_value');
$oQuote->save();
您应该看到新列和值保存在sales_flat_quote
。然后,一旦客户完成结账,相同的值应该保存在sales_flat_order
.
请注意,上面的代码可以扩展为适用于quote_item
and order_item
只需改变quote
to quote_item
等等,但是,如果您希望保存已在产品上设置的属性值,则需要一些额外的工作。
将新的 XML 块插入到 config.xml 中(同样在全局节点内):
<sales>
<quote>
<item>
<product_attributes>
<my_attribute />
</product_attributes>
</item>
</quote>
</sales>
Where my_attribute
是产品型号上的属性代码。这将使 my_attribute 在链接的产品上可用,因此您可以通过以下方式访问它
$oQuoteItem->getProduct()->getMyAttribute()
无需执行完整的Mage::getModel('catalog/product')->load($oQuoteItem->getProductId())
。这样效率要高得多。
然后,您将需要一个观察者将产品对象中的值复制到 quote_item 对象。因此,在 config.xml 中声明您的观察者:
<events>
<sales_quote_item_set_product>
<observers>
<quoteitem_set_custom_data>
<type>singleton</type>
<class>mymodule/observer</class>
<method>setCustomDataOnQuoteItem</method>
</quoteitem_set_custom_data>
</observers>
</sales_quote_item_set_product>
<events>
并在观察者类中编写如下代码:
public function setCustomDataOnQuoteItem($oObserver){
$oProduct = $oObserver->getProduct();
$oQuoteItem = $oObserver->getQuoteItem();
foreach(array('my_attribute') as $vAttributeCode){
$oQuoteItem->setData($vAttributeCode,$oProduct->getData($vAttributeCode));
}
}