Magento - 在销售订单索引网格中添加自定义属性(列)

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() 如何发挥作用?

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

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

=> 是的。在属性保存后正确显示和排序。胜利!

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列,则必须在模块的安装脚本中添加它。
我在thisstackoverflow解决方案中找到了如何在安装脚本中添加列,然后将其添加到网格中。答案有点过时,但我认为它可能有效。

我还发现了一个开箱即用的解决方案this,可以添加一个属性用于订单网格,但我还没有测试过,所以不能确定它是否有效。


非常棒的信息。我会花些时间来看看,看看能发现什么。 - Bosworth99
此时我只是想知道是否需要手动调用updateGridRecords(请参见我的更新)。 - Bosworth99

0

当您将EAV表与FLAT表连接时,无法在网格中过滤数据。 我之前遇到过同样的问题,并与我的前辈们花了4天时间研究,最终得出结论:您无法这样做....!!!


1
实际上你可以这样做,但必须自己编写连接(不使用add attributeToSelect)与eav表。最终,EAV表只是分散在多个表中的数据,但仍然是数据库表。 - Domen Vrankar
是的,我链接的文章详细说明了如何进行联接操作,但在这种情况下,这两个表格都是扁平的,并且最终操作非常容易。 - Bosworth99
@DomenVrankar:你能给我提供一些简短的解释和例子吗?这会对我很有帮助。谢谢。 - ANKIT
你不应该在另一个问题中提问,但既然它相关... 在setCollection函数中,你可以对集合进行joinLeft操作。你可以通过添加两个附加属性到网格中的列来实现:'filter_condition_callback' => array( $this, '_yourFilterFunc' ), 'filter' => 'adminhtml/widget_grid_column_filter_range'(或任何其他过滤器类型)。然后,你需要编写一个过滤器函数,例如:protected function _yourFilterFunc( $collection, $column ){ $collection->addFieldToFilter( 'your_table_alias.' . $column->getIndex(), $column->getFilter()->getCondition() ); }。 - Domen Vrankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接