Magento - 将自定义属性(列)添加到sales_order索引网格

时间:2013-02-04 20:47:10

标签: magento gridview attributes

我已在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  -->

应用/代码/本地/命名空间/模块/块/销售/订购/ 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();
    }
}

我看到_prepareCollectionsometimes used,但是我试图在setCollection期间修改集合,如果没有别的话,简单。

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

有关于此的任何想法吗?

更新

这篇文章是this SO thread的扩展我已更新它以匹配模块的当前状态。也就是说,我正在为sales_flat_ordersales_flat_order_grid添加列。

从那篇文章中,我有一个动作来设置这个属性值(在订单完成后)。

我现在的问题是 - updateGridRecords()如何发挥作用?

=&GT;当调用$ order-&gt; save()时,updateGridRecords似乎会被自动调用(我在订单完成后手动执行此操作)。

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

=&GT;是的。保存attr后正确显示和排序。赢了!

2 个答案:

答案 0 :(得分:4)

客户收集和订单网格集合之间的区别在于客户集合源自Mage_Eav_Model_Entity_Collection_Abstract,而sales_flat_order_grid集合源自Mage_Sales_Model_Resource_Abstract,而非EAV。

因此您无法添加要选择的属性,就像您通常可以使用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列,则必须添加它在你的模块的安装脚本中。

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

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

答案 1 :(得分:0)

使用FLAT表创建连接EAV表时,无法过滤网格中的数据。 我之前遇到过同样的问题,并且和我的前辈一起投入了4天,然后最终得出2个你不能那样做的结论...... !!!