**更新** 如何在表 sales_flat_quote_item 中创建新列并使用 $cart->addProduct


**update** How i can create new column in table sales_flat_quote_item and add data with $cart->addProduct

如何使用$cart->add产品代码在sales_flat_quote_item的新列中设置数据

我尝试以不同的方式插入,但结果是相同的产品被添加到购物车,但我的数据没有插入到数据库中

我不明白我有什么问题,或者我之前只是在应用程序''代码''核心''法师''结帐''sql''checkout_setup中做了任何事情?

这是我的exem代码PS:我在$cart>添加产品线上更改

第一

$cart = Mage::getSingleton('checkout/cart'); 
            $cart->init();
            $cart->addProduct($product, array('qty' => $qty), array('ref_order_id' => $ref_order_id));
            Mage::getSingleton('checkout/session')->setCartWasUpdated(true);
            $cart->save();

第二。

$param = array(
                'product' => $product->getId(),
                'qty' => $qty,
                'ref_order_id' => $ref_order_id
            ); 
            $request = new Varien_Object();
            $request->setData($param);
            $cart->addProduct($product, $param); 

第三

$cart->addProduct($product, array('qty' => $qty,'original_custom_price' => $ref_order_id ));

更新我尝试将此代码插入 addProductAdvanced 类

应用程序/代码/核心/法师/销售/模型/报价.php: addProduct(Mage_Catalog_Model_Product $product, $request=null)

foreach ($cartCandidates as $candidate) {
            $item = $this->_addCatalogProduct($candidate, $candidate->getCartQty());
            ...
            ...
            ...
            $item->setref_order_id('SpecialOrderFromCustomPage');
            ...
            ...
}

但是数据是插入报价中所有项目的数据,我如何检查这是否来自我的页面?

表添加新属性可以通过 XML 配置文件和创建安装脚本来实现sales_flat_order_item。有一种特殊的方法可以做到这一点,可以在核心模块的任何核心升级和安装脚本中看到。

您必须将列添加到许多表中,而不仅仅是订单项。当客户将商品添加到他们的购物篮时,他们正在建立报价。您首先需要sales_flat_quote_item表上的需求列,以便当客户将商品添加到购物篮时,数据将根据报价单存储。

当客户下订单时,报价单将转换为订单,因此您还需要将报价单中的所有物料数据转移到订单物料。这是模块配置中的XML可用于实现所需结果的地方。您还需要一个观察者在客户单击添加到购物车时将数据与报价单项目放在一起。

请考虑以下示例;

您有一个产品,其中设置了存款自定义属性。

然后,您希望在客户需要或购买报价单物料和订单物料时存储此值。因此,您可以在自定义模块中创建类似于以下内容的安装脚本;

<?php
$installer = $this;
$installer->installEntities();
$setup = new Mage_Sales_Model_Mysql4_Setup('core_setup');
$setup->startSetup();
$setup->addAttribute(
    'order_item', 
    'base_deposit_price', 
    array(
        'type' => Varien_Db_Ddl_Table::TYPE_DECIMAL,'default' => 0,'visible' => true 
    )
);
$setup->addAttribute(
    'quote_item', 
    'base_deposit_price', 
    array(
        'type' => Varien_Db_Ddl_Table::TYPE_DECIMAL,'default' => 0,'visible' => true 
    )
);
$setup->addAttribute(
    'invoice_item', 
    'base_deposit_price', 
    array(
        'type' => Varien_Db_Ddl_Table::TYPE_DECIMAL,'default' => 0,'visible' => true, 
    )
);
$setup->addAttribute(
    'creditmemo_item', 
    'base_deposit_price', 
    array(
        'type' => Varien_Db_Ddl_Table::TYPE_DECIMAL,'default' => 0,'visible' => true            
    )
);
$setup->endSetup();

这样做是将列作为模块安装脚本的一部分很好地添加到表中。

然后在模块配置.xml文件中,您需要类似于以下XML定义的内容;

<?xml version="1.0"?>
<config>
    <global>
         <sales>
                <quote>
                    <item>
                        <product_attributes>
                            <base_deposit_price />
                        </product_attributes>
                    </item>
                </quote>
                <order>
                    <item>
                        <product_attributes>
                            <base_deposit_price />
                        </product_attributes>
                    </item>
                </order>
            </sales>
            <fieldsets>
                <sales_convert_quote_item>
                    <base_deposit_price>
                        <to_order_item>*</to_order_item>
                    </base_deposit_price>
                </sales_convert_quote_item>
                <sales_convert_order_item>
                    <base_deposit_price>
                        <to_cm_item>*</to_cm_item>
                        <to_invoice_item>*</to_invoice_item>
                    </base_deposit_price>
                </sales_convert_order_item>
            </fieldsets>
            <events>
              <sales_quote_item_set_product>
                <observers>
                    <quoteitem_set_deposit_data>
                        <type>singleton</type>
                        <class>YourNameSpace_YourModule_Model_Observer</class>
                        <method>setDepositOnQuoteItem</method>
                    </quoteitem_set_deposit_data>
                </observers>
              </sales_quote_item_set_product>
            </events>
    </global>
</config>

配置文件有一些定义,基本上允许magento自动将值从quote_item表复制到order_item表。上面的示例还将值复制到订单中的贷方通知单项和发票项。

魔术位是观察者,当客户将报价项目添加到他们的购物篮时,它首先设置报价项目的数据。

<?php
class YourNameSpace_YpurModule_Model_Observer {
    /**
     * Flag to stop observer executing more than once
     *
     * @var static bool
     */
    static protected $_singletonFlag = false;
    /*
     * Gets Deposit Price Values For Quote Product Items. These Will Later Be
     * Be Converted To Order Items, Invoice Items, & Credit Memo Items.
     * 
     */
    public function setDepositOnQuoteItem($oObserver) {
        $oProduct = $oObserver->getProduct();
        $oQuoteItem = $oObserver->getQuoteItem();
        $deposit = $oProduct->getData('deposit_price', null);
        if ($deposit > 0) {
            $oQuoteItem->setData('base_deposit_price', $deposit);
        }
    }
}

您可以通过管理员产品属性系统添加产品属性,也可以使用EAV设置脚本对模块进行编码,以设置要放在报价单项和订单项上的自定义产品属性;

class YourNameSpace_YourModule_Model_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup
{
  public function getDefaultEntities()
  {
        return array(
          'catalog_product' => array(
              'entity_model'      => 'catalog/product',
              'attribute_model'   => 'catalog/resource_eav_attribute',
              'table'             => 'catalog/product',
              'additional_attribute_table' => 'catalog/eav_attribute',
              'entity_attribute_collection' => 'catalog/product_attribute_collection',
              'attributes'        => array(
                  'deposit_price' => array(
                      'group'             => 'Prices',
                      'label'             => 'Deposit Price',
                      'type'              => 'decimal',
                      'input'             => 'price',
                      'default'           => '0',
                      'class'             => 'validate-number',
                      'frontend'          => '',
                      'source'            => '',
                      'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE,
                      'visible'           => true,
                      'required'          => false,
                      'user_defined'      => false,
                      'searchable'        => false,
                      'filterable'        => false,
                      'comparable'        => true,
                      'visible_on_front'  => true,
                      'visible_in_advanced_search' => false,
                      'unique'            => false,
                      'backend'           => 'catalog/product_attribute_backend_price',
                  ),
                )
              )
            );
    }         
}

希望这应该可以帮助您以正确的方式实现您想做的事情。只需将其全部构建为自定义模块即可。