【问题标题】:How to convert quote attribute to order in Magento?如何将报价属性转换为 Magento 中的订单?
【发布时间】:2012-07-26 07:17:03
【问题描述】:

我在这上面花了两天时间,我觉得我什么都试过了,但我还是一直碰壁。

我有两个属性(module_job_id、module_channel_id)我很想添加到报价和订单中。我设法得到的是报价属性工作正常,我可以看到它们存储在数据库中并且可以正常检索。

唯一剩下的就是将值从报价移动到订单。我做错了什么?

这是我的模块配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<config>

    <modules>
        <Company_Module>
            <version>0.1.9</version>
        </Company_Module>
    </modules>

    <global>
        <fieldsets>
            <sales_convert_quote>
                <module_job_id>
                    <to_order>*</to_order>
                </module_job_id>

                <module_channel_id>
                    <to_order>*</to_order>
                </module_channel_id>
            </sales_convert_quote>
        </fieldsets>

        <resources>
            <company_module>
                <setup>
                    <module>Company_Module</module>
                    <class>Mage_Sales_Model_Mysql4_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </company_module>
        </resources>

    </global>
</config>

安装文件sql/company_module/mysql4-install-0.1.0.php:

<?php
    $installer = $this;
    $installer->startSetup();

    $installer->getConnection()->addColumn($installer->getTable('sales/quote'), 'module_job_id',
        'VARCHAR(255) NULL DEFAULT NULL');
    $installer->getConnection()->addColumn($installer->getTable('sales/quote'), 'module_channel_id',
        'VARCHAR(255) NULL DEFAULT NULL');

    $installer->getConnection()->addColumn($installer->getTable('sales/order'), 'module_job_id',
        'VARCHAR(255) NULL DEFAULT NULL');
    $installer->getConnection()->addColumn($installer->getTable('sales/order'), 'module_channel_id',
        'VARCHAR(255) NULL DEFAULT NULL');

    $installer->addAttribute('order', 'module_job_id', array('type' => 'varchar'));
    $installer->addAttribute('quote', 'module_job_id', array('type' => 'varchar'));

    $installer->addAttribute('order', 'module_channel_id', array('type' => 'varchar'));
    $installer->addAttribute('quote', 'module_channel_id', array('type' => 'varchar'));

    $installer->endSetup();

我已经在安装文件中尝试了所有可能的 addAttribute 和 addColumns 组合。结果是我在 sales_flat_quote 和 sales_flat_order 中都有这两个属性作为列。但是,eav_attribute 中没有任何属性。我不确定这是否可以。

我尝试的另一件事是在 sales_convert_quote_to_order 观察者中明确设置订单属性值。这不起作用:

public function salesConvertQuoteToOrder($observer)
{
    $order = $observer->getEvent()->getOrder();

    $order->setModuleJobId('123');
    $order->setModuleChannelId('456');
}

我不知道它是否重要,但这些是我系统上的实体类型(只有订单,没有报价......):

mysql> SELECT entity_type_id, entity_type_code FROM eav_entity_type;
+----------------+------------------+
| entity_type_id | entity_type_code |
+----------------+------------------+
|              3 | catalog_category |
|              4 | catalog_product  |
|              7 | creditmemo       |
|              1 | customer         |
|              2 | customer_address |
|              6 | invoice          |
|              5 | order            |
|              8 | shipment         |
+----------------+------------------+

另外,eav_entity 是空的。我也希望没问题。

mysql> select * from eav_entity;
Empty set (0.00 sec)

这是在 Magento 1.6.2.0 上。多谢!

【问题讨论】:

    标签: magento attributes magento-1.6 quote


    【解决方案1】:

    在 Magento 1.6.2.0 上,订单保存在 sales_flat_order 上,报价保存在 sales_flat_quote 上。他们不再使用 eav 结构 AFAIK 所以我会说没关系。您应该查看 Mage_Sales_Model_Convert_Quote 类并添加调试代码:

    public function toOrder(Mage_Sales_Model_Quote $quote, $order=null)
    {
        if (!($order instanceof Mage_Sales_Model_Order)) {
            $order = Mage::getModel('sales/order');
        }
        /* @var $order Mage_Sales_Model_Order */
    
        $order->setIncrementId($quote->getReservedOrderId())
            ->setStoreId($quote->getStoreId())
            ->setQuoteId($quote->getId())
            ->setQuote($quote)
            ->setCustomer($quote->getCustomer());
    
        Mage::helper('core')->copyFieldset('sales_convert_quote', 'to_order', $quote, $order);
    
        Mage::dispatchEvent('sales_convert_quote_to_order', array('order'=>$order, 'quote'=>$quote));
    
        //I add my debug code here using Mage::log, you can debug using your own method
        Mage::log($order->getData());
    
        return $order;
    }
    

    查看是否设置了module_job_id和module_channel_id。

    【讨论】:

      【解决方案2】:

      请检查以下对我有用的代码(但是我的 Magento 安装是 1.7.0.2)。我认为问题出在您的模型资源上。

      app/code/local/Final/Test/etc/config.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <config>
      <modules>
          <Final_Test>
              <version>0.0.1</version>
          </Final_Test>
      </modules>
      <frontend>
          <routers>
              <test>
                  <use>standard</use>
                  <args>
                      <module>Final_Test</module>
                      <frontName>test</frontName>
                  </args>
              </test>
          </routers>
      </frontend>
      <global>
          <models>
              <test>
                  <class>Final_Test_Model</class>
                  <resourceModel>test_resource</resourceModel>
              </test>
              <test_resource>
                  <class>Final_Test_Model_Resource</class>
                  <deprecatedNote>test_mysql4</deprecatedNote>
              </test_resource>
          </models>
          <resources>
              <test_setup>
                  <setup>
                      <module>Final_Test</module>
                      <class>Final_Test_Model_Resource_Setup</class>
                  </setup>
              </test_setup>
          </resources>
          <fieldsets>
              <sales_convert_quote>
                  <final_test1>
                      <to_order>*</to_order>
                  </final_test1>
                  <final_test2>
                      <to_order>*</to_order>
                  </final_test2>
              </sales_convert_quote>
              <sales_convert_order>
                  <final_test1>
                      <to_quote>*</to_quote>
                  </final_test1>
                  <final_test2>
                      <to_quote>*</to_quote>
                  </final_test2>
              </sales_convert_order>
          </fieldsets>
      </global>
      </config> 
      

      您的安装程序应该是 Mage_Sales_Model_Resource_Setup 的一个实例,所以我创建了自己的类,它只是扩展了上述类

      app/code/local/Final/Test/Model/Resource/Setup.php

      <?php
          class Final_Test_Model_Resource_Setup extends Mage_Sales_Model_Resource_Setup{
      
          }
      ?>
      

      最后我的安装脚本是这样的

      app/code/local/Final/Test/sql/test_setup/install-0.0.1.php

      <?php
      $installer=$this;
      $installer->startSetup();
      $entitiesToAlter = array('quote','order');
      $attributes = array(
          'final_test1' => array(
              'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
              'default' =>5
              ),
          'final_test2' => array(
              'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
              'default' =>0
              )
          );
      
      foreach ($entitiesToAlter as $entityName) {
          foreach ($attributes as $attributeCode => $attributeParams) {
              $installer->addAttribute($entityName, $attributeCode, $attributeParams);
          }
      }
      $installer->endSetup();
      ?>
      

      您可以参考 sql 文件夹下的 Mage_Sales_Model_Resource_Setup 和 Mage_Sales 模块安装程序文件,以更好地了解发生了什么

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-13
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多