我想在Magento销售订单网格中显示客户电子邮件。我必须在本地模块中重写Mage_Adminhtml_Block_Sales_Order_Grid
以添加客户电子邮件的新列。我得到了每个订单的电子邮件价值,但排序和过滤没有按预期工作。
我花了一天多的时间来整理这个问题,但没有运气。另外,我也提到了几个答案。
以下是我尝试过的代码referring this answer,
public function setCollection($collection)
{
$collection->getSelect()->joinLeft(
array('sfo'=>'sales_flat_order'),
'main_table.entity_id=' . 'sfo' . '.entity_id',
array('*')
);
$collection->getSelect()->joinLeft(
array('sfoa'=>'sales_flat_order_address'),
'main_table.entity_id=' . 'sfoa' . '.parent_id',
array('email')
);
$collection->getSelect()->group(array('main_table.entity_id'));
$collection->addFilterToMap('increment_id', 'main_table.increment_id');
parent::setCollection($collection);
}
protected function _prepareColumns()
{
$this->addColumnAfter('email', array(
'header' => Mage::helper('sales')->__('Customer Email'),
'width' => '80px',
'type' => 'text',
'index' => 'email',
'filter_index' => 'sfoa.email',
'filter_condition_callback' => 'filter_last_login',
'order_callback' => 'sort_last_login',
), 'erp_confirm_order');
return parent::_prepareColumns();
}
public function getGridUrl()
{
return $this->getUrl('*/*/grid', array('_current'=>true));
}
function filter_last_login($collection, $column)
{
if (!$column->getFilter()->getCondition()) {
return;
}
$condition = $collection->getConnection()
->prepareSqlCondition('sfoa.email', $column->getFilter()->getCondition());
$collection->getSelect()->where($condition);
}
function sort_last_login($collection, $column)
{
$collection->getSelect()->order($column->getIndex() . ' ' . strtoupper($column->getDir()));
}
protected function _setCollectionOrder($column)
{
if ($column->getOrderCallback()) {
call_user_func($column->getOrderCallback(), $this->getCollection(), $column);
return $this;
}
return parent::_setCollectionOrder($column);
}
修改1
当我整理和排序时,没有任何作用过滤客户电子邮件列,当我单击其余的默认网格列时,我收到错误。
Integrity constraint violation: 1052 Column 'increment_id' in order clause is ambiguous, query was: SELECT `main_table`.*, `sfo`.*, `sfoa`.`email` FROM `sales_flat_order_grid` AS `main_table`
LEFT JOIN `sales_flat_order` AS `sfo` ON main_table.entity_id=sfo.entity_id
LEFT JOIN `sales_flat_order_address` AS `sfoa` ON main_table.entity_id=sfoa.parent_id GROUP BY `main_table`.`entity_id` ORDER BY increment_id ASC LIMIT 20
任何帮助很多赞赏。 谢谢,
答案 0 :(得分:1)
因此,您遇到的与原始答案不同的问题是您要加入名称含糊不清的字段。您需要指定要筛选的字段。我之前已经面对过这个问题了。
当您从sales_flat_order添加列时,您不需要执行自定义过滤器或排序回调。只有当您需要一些更复杂的过滤/排序查询时才需要这样,就像上次登录日期的原始示例一样。只需确保您的' filter_index'已设置,它将正常工作。以下示例用于从帐单邮寄地址添加客户电子邮件。
class My_Namespace_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{
public function setCollection($collection)
{
$collection->join(['sfoa' => 'sales/order_address'], 'main_table.entity_id=sfoa.parent_id AND sfoa.address_type="billing"', ['billing_email' => 'sfoa.email']);
parent::setCollection($collection);
}
public function _prepareColumns()
{
parent::_prepareColumns();
foreach ($this->getColumns() as $column) {
if (!$column->getFilterIndex()) {
$column->setFilterIndex('main_table.'.$column->getIndex());
}
}
$this->addColumnAfter('customer_email', [
'header' => Mage::helper('customer')->__('Customer Email'),
'width' => '50px',
'index' => 'billing_email',
'filter_index' => 'sfoa.email',
], 'shipping_name');
$this->sortColumnsByOrder();
return $this;
}
}
以下是订单表本身的示例:
class My_Namespace_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid
{
public function setCollection($collection)
{
$collection->join(['sfo' => 'sales/order'], 'main_table.entity_id=sfo.entity_id', 'customer_email');
parent::setCollection($collection);
}
public function _prepareColumns()
{
parent::_prepareColumns();
foreach ($this->getColumns() as $column) {
if (!$column->getFilterIndex()) {
$column->setFilterIndex('main_table.'.$column->getIndex());
}
}
$this->addColumnAfter('customer_email', [
'header' => Mage::helper('customer')->__('Customer Email'),
'width' => '50px',
'index' => 'customer_email',
'filter_index' => 'sfo.customer_email',
], 'shipping_name');
$this->sortColumnsByOrder();
return $this;
}
}