在订单网格中添加自定义列(Magento 1.7.0.0)

时间:2013-01-25 04:24:34

标签: magento magento-1.7

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

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

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

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

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

3 个答案:

答案 0 :(得分: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()函数中,我更改了getUrl()函数中的$ row语句,如下所示:

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;
}

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

答案 1 :(得分: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 ...

答案 2 :(得分: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())
相关问题