无法为sales_flat_order表设置自定义属性

时间:2012-03-26 15:54:47

标签: magento

我正在使用Magento ver。 1.6.2.0。

在阅读了大量帖子和问题后(在SO和其他地方),我试图在sales_flat_order表中添加一个属性。在Magento的早期版本中,销售/订单模型使用了EAV方法,但从我可以收集的内容来看,在1.4之后,它被移到了平面桌上。

所以,这是我的mysql-install文件:

$installer = $this;
$installer->getConnection()->addColumn($installer->getTable('sales/order'), 'khaos_soc', 'varchar(255) NULL');

已在sales_flat_order表中添加了一列。

我的问题是我无法设置要插入该字段的数据。我有一个观察者,由事件'checkout_submit_all_after'调用。代码检索当前的订单ID,然后尝试设置'khaos_soc'数据,这里是代码:

$test = Mage::getModel('sales/order')->load($order->getId());
// write the khaos soc to the database
$test->setKhaosSoc('just testing');
$test->setCustomerFirstname('Charlie');
$test->save();

setCustomerFirstname()方法有效,并将firstname更改为Charlie,但setKhaosSoc()方法不会向数据库保存任何内容。我也尝试过使用setData('khaos_soc','只是测试')来处理不起作用的方法。

我已经通过在数据库中手动设置'khaos_soc'的值来测试了这一点,然后调用了相应的顺序并回显了getKhaosSoc()结果,并且它工作正常,但我仍然无法设置它。

因此,我可以为自定义属性检索手动创建的条目,但我无法设置它们。谁能说明为什么会这样?

亲切的问候,

詹姆斯


我已经尝试过Zyava建议的方法,但它仍然无法保存。这是我的升级代码:

$installer = $this;
$installer->startSetup();
$installer->addAttribute(
    'order', 
    'khaos_soc', 
    array(
        'type' => 'varchar', /* varchar, text, decimal, datetime */
        'grid' => false /* or true if you wan't use this attribute on orders grid page */
    )
);
$installer->endSetup();

这是我的config.xml:

<?xml version="1.0"?>
<!-- 
/**
 * @category   Symphony
 * @package    Symphony_Khaosorders
 * @author     ModuleCreator
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */
 -->
<config>
    <modules>
        <Symphony_Khaosorders>
            <version>0.1.8</version>
        </Symphony_Khaosorders>
    </modules>
    <frontend>
        <routers>
            <khaosorders>
                <use>standard</use>
                <args>
                    <module>Symphony_Khaosorders</module>
                    <frontName>khaosorders</frontName>
                </args>
            </khaosorders>
        </routers>
        <layout>
            <updates>
                <khaosorders>
                    <file>khaosorders.xml</file>
                </khaosorders>
            </updates>
        </layout>
    </frontend>
    <admin>
        <routers>
            <khaosorders>
                <use>admin</use>
                <args>
                    <module>Symphony_Khaosorders</module>
                    <frontName>khaosorders</frontName>
                </args>
            </khaosorders>
        </routers>
    </admin>
    <adminhtml>
        <menu>
            <khaosorders module="khaosorders">
                <title>Khaosorders</title>
                <sort_order>71</sort_order>               
                <children>
                    <items module="khaosorders">
                        <title>Manage Items</title>
                        <sort_order>0</sort_order>
                        <action>khaosorders/adminhtml_khaosorders</action>
                    </items>
                </children>
            </khaosorders>
        </menu>
        <acl>
            <resources>
                <all>
                    <title>Allow Everything</title>
                </all>
                <admin>
                    <children>
                        <Symphony_Khaosorders>
                            <title>Khaosorders Module</title>
                            <sort_order>10</sort_order>
                        </Symphony_Khaosorders>
                    </children>
                </admin>
            </resources>
        </acl>
        <layout>
            <updates>
                <khaosorders>
                    <file>khaosorders.xml</file>
                </khaosorders>
            </updates>
        </layout>
    </adminhtml>   
    <global>
        <models>
            <khaosorders>
                <class>Symphony_Khaosorders_Model</class>
                <resourceModel>khaosorders_mysql4</resourceModel>
            </khaosorders>
            <khaosorders_mysql4>
                <class>Symphony_Khaosorders_Model_Mysql4</class>
                <entities>
                    <khaosorders>
                        <table>khaosorders</table>
                    </khaosorders>
                </entities>
            </khaosorders_mysql4>
        </models>
        <resources>
            <khaosorders_setup>
                <setup>
                    <module>Symphony_Khaosorders</module>
                    <class>Mage_Sales_Model_Mysql4_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </khaosorders_setup>
            <khaosorders_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </khaosorders_write>
            <khaosorders_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </khaosorders_read>
        </resources>
        <blocks>
            <khaosorders>
                <class>Symphony_Khaosorders_Block</class>
            </khaosorders>
        </blocks>
        <helpers>
            <khaosorders>
                <class>Symphony_Khaosorders_Helper</class>
            </khaosorders>
        </helpers>
    </global>
</config>

这是我的观察员方法:

$test = Mage::getModel('sales/order')->load($order->getId());
// write the khaos soc to the database
$test->setKhaosSoc('just testing');
$test->setCustomerFirstname('Charlie');
$test->save();

我有什么遗失的吗?

3 个答案:

答案 0 :(得分:3)

这可能是你的缓存。即使您已禁用缓存,或已通过管理员清除缓存,我相信仍然会发生数据库缓存。试试rm -rf var/cache/*,看看是否有诀窍。

答案 1 :(得分:3)

您应该使用Mage_Sales_Model_Resource_Setup::addAttribute()方法,因为它负责修改平面表。并且您不应该手动执行此操作,请致电addColumn

答案 2 :(得分:1)

你应该采取另一种方式:

  1. config.xml中检入您的安装模型类型为Mage_Eav_Model_Entity_Setup

  2. <global>
         <resources>
             <your_module_setup>
                  <setup>
                      <module>Your_Module</module>
                      <class>Mage_Sales_Model_Mysql4_Setup</class>
                  </setup>
             </your_module_setup>
         </resources>
     </global>
    
    1. 在您的模块升级脚本中:

    2. $installer = $this;
      $installer->startSetup();
      $installer->addAttribute(
          'quote_item', 
          'your_attribute_code', 
          array(
              'type' => 'int', /* varchar, text, decimal, datetime */,
          )
      );
      $installer->endSetup();
      

      Magento - Adding a new column to sales_flat_quote_item and sales_flat_order_item`的所有学分都在这里输入代码