4

我在sales_order_flat表格中添加了一个自定义属性,我试图在网格中显示这个属性sales_order/index

我已经成功地使用客户属性完成了此操作,但是在尝试使用订单数据进行相同操作时出现错误。

<global>
    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_grid>WACI_AdminHtmlExt_Block_Sales_Order_Grid</sales_order_grid>
            </rewrite>
        </adminhtml>
    </blocks>
 <!-- etc  -->

app/code/local/namespace/module/Block/Sales/Order/Grid.php

class WACI_AdminHtmlExt_Block_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{

    protected function _prepareColumns()
    {

        $this->addColumn('dynamics_ord', array(
            'header'    => $this->__('Dynamics ID'),
            'width'     => '75px',
            'index'     => 'dynamics_ord',
        ));

        $this->addColumnsOrder('dynamics_ord','entity_id');

        return parent::_prepareColumns();
    }
}

我看到它_prepareCollection有时会被使用,但我只是想在简单的情况下修改集合setCollection

无论如何,该列都会显示,但不会产生任何数据。(当我尝试排序时页面错误)。

对此有什么想法吗?

更新

这篇文章是这个 SO 线程的扩展,我已经更新了它以匹配模块的当前状态。也就是说,我将列添加到sales_flat_ordersales_flat_order_grid

从那篇文章中,我得到了一个设置此属性值的操作(在订单完成后)。

在这一点上我的问题是 - 如何updateGridRecords()发挥作用?

=> updateGridRecords 似乎在调用 $order->save() 时自动调用(订单完成后我手动执行的操作)。

如果我理解正确,因为我没有从任何其他模型中提取数据,所以_prepareColumns只需要调用即可。

=> 是的。保存 attr 后正确显示和排序。赢!

4

2 回答 2

4

客户集合和订单网格集合之间的区别在于,客户集合是从 Mage_Eav_Model_Entity_Collection_Abstract 派生的,而 sales_flat_order_grid 集合是从不是 EAV 的 Mage_Sales_Model_Resource_Abstract 派生的。

因此,您无法像通常使用 EAV 那样添加要选择的属性 - 您要使用的所有属性都必须表示为平面表中的表列。

您正在调用的函数 addAttributeToSelect 在 Mage_Sales_Model_Resource_Collection_Abstract 类中实现,并在后台使用 addFieldToSelect 因此在您的情况下,您应该在 sales_flat_order_grid 表中有一个名为 dynamics_ord 的列。

将属性值从订单 EAV 移动到订单网格的函数是 Mage_Sales_Model_Resource_Order_Abstract::updateGridRecords,此函数读取 sales_flat_order_grid 表的结构以了解应将哪些属性写入 sales_flat_order_grid 表,因此如果缺少 dynamics_ord 列,您必须将其添加到您的模块的安装脚本。

我遇到了关于如何在安装脚本中添加列然后将其添加到网格的堆栈溢出解决方案。答案有点过时,但我认为它可以工作。

我还发现关于如何添加将在订单网格上使用但尚未测试的属性的开箱即用解决方案,因此我无法确定它是否有效。

于 2013-02-04T23:15:28.790 回答
0

当您使用 FLAT 表连接 EAV 表时,您无法过滤网格中的数据。我之前也遇到过同样的问题,和我的前辈一起花了 4 天时间,最后得出了 2 个结论,你不能那样做......!!!

于 2013-02-05T06:07:20.203 回答