我需要扩展Magento购物车以包含商店定位器的额外步骤。我知道我需要覆盖核心OnePage控制器(Mage_Checkout_OnepageController
)和阻塞(Mage_Checkout_Block_Onepage
)但是需要做些什么来跟踪额外信息(例如用户从我的自定义中选择的选项)工序)。
答案 0 :(得分:15)
此处需要执行许多步骤才能获得整个解决方案。
首先,创建一个新模块。如果您愿意,请使用ModuleCreator。
然后,在模块中写一个setup script,将新字段添加到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
和sales_flat_order
表格。
现在,在模块的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
更改为order_item
等即可扩展为适用于quote
和quote_item
,但是,如果您希望保存属性值已经在您的产品上设置,然后需要一些额外的工作。
将新的XML块插入config.xml(再次在全局节点内):
<sales>
<quote>
<item>
<product_attributes>
<my_attribute />
</product_attributes>
</item>
</quote>
</sales>
其中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));
}
}
答案 1 :(得分:0)
这是一个完整的工作模块..它(几乎)与上面的Johnatan代码相同。 你会在这里找到它: https://bitbucket.org/vovsky/adding-custom-product-attribute-to-quote-and-order-items-in/
此处的每一步都有完整的解释:http://www.atwix.com/magento/custom-product-attribute-quote-order-item/