6

我需要扩展 Magento 购物车以包含一个额外的商店定位器步骤。我知道我需要覆盖核心 OnePage控制器Mage_Checkout_OnepageControllerMage_Checkout_Block_Onepage

4

2 回答 2

15

这里需要许多步骤来获得整个解决方案。

首先,创建一个新模块。如果您愿意,请使用ModuleCreator 。

然后,在你的模块中编写一个设置脚本,将新字段添加到 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_quotesales_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.

请注意,上面的代码可以通过更改为etc 来扩展quote_item,但是,如果您希望保存已在产品上设置的属性值,则需要进行一些额外的工作。order_itemquotequote_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));
    }
}
于 2012-06-19T00:57:19.823 回答
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/

于 2013-10-03T12:38:20.490 回答