2

我在 Magento 1.7.0.0 的订单网格中添加自定义列时遇到了这个问题,我希望你能在这里帮我一把。基本上我遵循了这个指南http://www.atwix.com/magento/customize-orders-grid/解释了我必须制作一个本地版本/app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php并进行一些更改才能拥有我想要的额外列。按照上述指南,它说我必须编辑函数_prepareCollection()来添加这一行(指定我想在数组中提取的字段)

$collection->getSelect()->join('magento_sales_flat_order_address', 'main_table.entity_id = magento_sales_flat_order_address.parent_id',array('telephone', 'email'));

return parent::_prepareCollection();

并像这样添加两列_prepareColumns()

$this->addColumn('telephone', array(
        'header' => Mage::helper('sales')->__('Telephone'),
        'index' => 'telephone',
    ));

$this->addColumn('email', array(
        'header' => Mage::helper('sales')->__('Email'),
        'index' => 'email',
    ));

就是这样,显然......或者可能不是,因为当我这样做时它会引发以下错误:

Item (Mage_Sales_Model_Order) with the same id "XXXX" already exist

根据下面的评论,解决方案是在_prepareCollectionbefore中添加以下行$this->setCollection($collection)

$collection->getSelect()->group('main_table.entity_id');

添加该行后,订单网格现在像我想要的那样显示电子邮件和电话列,但结果分页停止工作,它只显示最近的 20 个,并显示“Pages 1 out of 1”“2 个记录发现”在上面。我似乎无法弄清楚为什么会发生这种情况,而且我看到的每条评论都没有超出上面的最后一条指令。什么可能是这个问题的原因?

我认为它可以被复制,因为我没有对这个模型进行任何其他修改。

4

3 回答 3

5

好的,解决了。这就是我所做的:受此答案https://stackoverflow.com/a/4219386/2009617的启发,我复制了该文件lib/Varien/Data/Collection/Db.php,将其放在下面app/core/local/Varien/Data/Collection/Db.php并复制了该答案中建议的修改以修复组选择计数错误这给了我上面的问题。到目前为止,它似乎奏效了。

但是,行中有一个问题,当我点击订单时,它说订单“不再存在”,所以我检查了实际的 url,结果发现 url 中的 order_id 与“entity_id”相同order_address 表,它与订单的实际关联 ID (parent_id) 不对应。在对 MySQL 查询进行了很长时间的调整后,我意识到问题出在我创建的函数_prepareColumns()和函数调用的getRowUrl()函数中/app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php,因为它们检索了错误的 Id。所以我做了以下更改:

_prepareColumns()对应于 Action 列的代码中,我将'getter'更改为'getParentId',如下所示:

 if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/view')) {
        $this->addColumn('action',
            array(
                'header'    => Mage::helper('sales')->__('Action'),
                'width'     => '50px',
                'type'      => 'action',
                //~ 'getter'     => 'getId',
                'getter'     => 'getParentId',
                'actions'   => array(
                    array(
                        'caption' => Mage::helper('sales')->__('View'),
                        'url'     => array('base'=>'*/sales_order/view'),
                        'field'   => 'order_id',
                    )
                ),
                'filter'    => false,
                'sortable'  => false,
                'index'     => 'stores',
                'is_system' => true,
        ));
    }

getRowUrl()函数中,我更改了函数中的 $row 语句,getUrl()如下所示:

public function getRowUrl($row)
{
    if (Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/view')) {
        //~ return $this->getUrl('*/sales_order/view', array('order_id' => $row->getId()));
        return $this->getUrl('*/sales_order/view', array('order_id' => $row->getParentId()));
    }
    return false;
}

现在它就像一个魅力。我希望这对其他人有帮助。

于 2013-01-26T12:20:08.410 回答
3

问题在查询中。而不是这个查询:

$collection->getSelect()->join('magento_sales_flat_order_address', 'main_table.entity_id = magento_sales_flat_order_address.parent_id',array('telephone', 'email'));

你应该使用这个:

$collection->getSelect()->join('sales_flat_order_address', 'main_table.entity_id = sales_flat_order_address.parent_id AND sales_flat_order_address.address_type = "shipping" ',array('telephone', 'email'));

在表 sales_flat_order_address 中,parent_id 是重复的。第一个用于计费,第二个用于运输。因此,您只需选择其中一项:计费或运输。此值在列 address_type...

于 2014-03-07T13:56:31.553 回答
0

尝试在 addColumn 函数中使用 filter_index:

$this->addColumn('telephone', array(
    'header' => Mage::helper('sales')->__('Telephone'),
    'index' => 'telephone',
     'filter_index' => 'tablename.telephone'
));

您可以通过打印出 sql 查询来找出表名:

var_dump((string)$collection->getSelect())
于 2013-01-25T09:07:29.210 回答