扩展Magento购物车

Lyn*_*ook 6 php checkout magento extend

我需要扩展Magento购物车,为商店定位器添加一个额外的步骤.我知道我需要覆盖核心OnePage控制器(Mage_Checkout_OnepageController)和blocks(Mage_Checkout_Block_Onepage),但是需要做些什么才能跟踪额外信息(例如用户从我的自定义步骤中选择的选项).

Jon*_*Day 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));
Run Code Online (Sandbox Code Playgroud)

注意使用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>
Run Code Online (Sandbox Code Playgroud)

这将指示Magento将自定义字段的值从报价复制到订单到发票和credit_memo等.

然后在您的自定义块/控制器代码中,您将能够使用Magento的魔法getter和setter来保持值.

$oQuote = Mage::getSingleton('checkout/session')->getQuote();
$oQuote->setMyAttribute('some_value');
$oQuote->save();
Run Code Online (Sandbox Code Playgroud)

您应该看到保存的新列和值sales_flat_quote.然后,一旦客户完成结账,应保存相同的值sales_flat_order.

请注意,上面的代码可以扩展到对工作quote_itemorder_item通过只是改变quotequote_item等,但是,如果你想保存属性已设置您的产品价值,那么一些额外的工作是必需的.

将新的XML块插入config.xml(再次在全局节点内):

   <sales>
        <quote>
            <item>
                <product_attributes>
                    <my_attribute />
                </product_attributes>
            </item>
        </quote>
    </sales>
Run Code Online (Sandbox Code Playgroud)

my_attribute产品型号上的属性代码在哪里.这将使链接产品上的my_attribute可用,因此您可以通过它访问它

$oQuoteItem->getProduct()->getMyAttribute()
Run Code Online (Sandbox Code Playgroud)

无需执行完整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>
Run Code Online (Sandbox Code Playgroud)

并在您的观察者类中编写代码,如下所示:

public function setCustomDataOnQuoteItem($oObserver){
    $oProduct = $oObserver->getProduct();
    $oQuoteItem = $oObserver->getQuoteItem();
    foreach(array('my_attribute') as $vAttributeCode){
        $oQuoteItem->setData($vAttributeCode,$oProduct->getData($vAttributeCode));
    }
}
Run Code Online (Sandbox Code Playgroud)