【问题标题】:Unable to set custom attribute for sales_flat_order table无法为 sales_flat_order 表设置自定义属性
【发布时间】:2012-03-26 15:54:46
【问题描述】:

我正在使用 Magento 版本。 1.6.2.0。

在阅读了一些帖子和问题(关于 SO 和其他地方)后,我尝试向我的 sales_flat_order 表添加一个属性。在以前的 Magento 版本中,销售/订单模型使用 EAV 方法,但据我所知,在 1.4 之后,它被移到了平面表中。

所以,这是我的 mysql 安装文件:

$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() 方法有效,并将名字更改为 Charlie,但 setKhaosSoc() 方法不会将任何内容保存到数据库中。我也尝试过使用 setData('khaos_soc', 'just testing') 做事的方式也不起作用。

我已经通过在数据库中手动设置 '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();

我有什么遗漏吗?

【问题讨论】:

    标签: magento


    【解决方案1】:

    这可能是你的缓存。即使您禁用了缓存,或者通过管理员清除了缓存,我相信仍然会发生数据库缓存。试试rm -rf var/cache/* 看看能不能解决问题。

    【讨论】:

    • 所以将我的回复标记为答案,伙计! :) 很高兴你明白了这一点,我知道有时处理数据库升级可能是一个巨大的、令人发狂的痛苦。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你应该换一种方式:

      1. 检查您的config.xml,您的安装模型类型为Mage_Eav_Model_Entity_Setup

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

      $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`在此处输入代码

      【讨论】:

      • 感谢 Zyava,这是我尝试过的帖子之一。我又经历了一遍,但它仍然没有将它保存到数据库中。 'khaos_soc' 列已添加,但我无法为其设置数据并保存。
      • 感谢 Zyava,我可以确认,由于我按照 sparcksofts 的建议清除了缓存,因此可以这样做。
      • $installer = $this 应该是 $installer = new Mage_Sales_Model_Mysql4_Setup('core_setup');,正如@roman-snitko 建议的那样。
      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 2021-11-27
      • 2020-11-25
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-10-30
      相关资源
      最近更新 更多