我在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条记录“在上面。我似乎无法弄清楚为什么会发生这种情况,我看到的每一条评论都不会超出上面的最后一条指令。可能是这个问题的原因是什么?
我认为可以复制它,因为我没有对此模型进行任何其他修改。
答案 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())