【问题标题】:Magento - add custom attribute (column) to sales_order index gridMagento - 将自定义属性(列)添加到 sales_order 索引网格
【发布时间】:2013-02-04 20:47:10
【问题描述】:

我已向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();
    }
}

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

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

对此有什么想法吗?

更新

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

从那篇帖子中,我有一个设置此属性值的操作(在订单完成后)。

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

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

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

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

【问题讨论】:

    标签: magento gridview attributes


    【解决方案1】:

    客户集合和订单网格集合的区别在于,客户集合是从 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 列,则必须添加它在你的模块的安装脚本中。

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

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

    【讨论】:

    • 很好的信息。我会花一些时间来看看我能找到什么。
    • 此时只是想知道我是否需要手动调用 updateGridRecords(请参阅我的更新)。
    【解决方案2】:

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

    【讨论】:

    • 实际上你可以做到,但必须使用 eav 表编写自己的连接(不使用 add attributeToSelect)。最后,EAV 表只是一个分布在多个表上的数据,但数据库表也不少。
    • 是的,我链接到的文章详细介绍了如何进行连接,但在这种情况下,两个表是平的,最终很容易做到。
    • @DomenVrankar :你能用一些例子给我简要解释吗,因为它对我有很大帮助。谢谢。
    • 你不应该在另一个问题中问一个问题,但因为它是相关的......在 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( )); }.
    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多