I've been able to add a few custom attributes to the sales order grid (sku, custom name). I am able to filter correctly. When I add the customer email, I can add and filter it too, but then if I filter by a total (e.g. base grand total) I get the error above. Other solutions suggest using filter_index to remove this ambiguity but this hasn't helped, presumably because it's on a field I'm not adding (grand total) - so this is not due to ambiguous entity_id. How do I make it use the specific total field?
Here are the helpful parts:
Observer
class Kaska_ExtendedGrid_Model_Observer { public function salesOrderGridCollectionLoadBefore($observer) { $collection = $observer->getOrderGridCollection(); $select = $collection->getSelect(); $select->join('m_sales_flat_order', '`m_sales_flat_order`.entity_id = `main_table`.entity_id', array('email' => new Zend_Db_Expr('`m_sales_flat_order`.customer_email'))); $select->joinLeft(array('payment' => $collection->getTable('sales/order_payment')), 'payment.parent_id=main_table.entity_id', array('payment_method' => 'method')); $select->join('m_sales_flat_order_item','`m_sales_flat_order_item`.order_id=`main_table`.entity_id', array('sku' => new Zend_Db_Expr('`m_sales_flat_order_item`.sku'),'name' => new Zend_Db_Expr('`m_sales_flat_order_item`.name') )); $select->join('m_catalog_product_entity_varchar', '`m_catalog_product_entity_varchar`.attribute_id=163 AND `m_catalog_product_entity_varchar`.entity_id = `m_sales_flat_order_item`.`product_id`', array('attr' => new Zend_Db_Expr('`m_catalog_product_entity_varchar`.value'))); $select->group('main_table.entity_id'); } public function filterEmail($collection, $column) { if (!$value = $column->getFilter()->getValue()) { return $this; } $collection->getSelect()->having( "`m_sales_flat_order`.customer_email like ?", "%$value%"); return $this; } .... filterSku etc layout.xml
<sales_order_grid_update_handle> <reference name="sales_order.grid"> <action method="addColumnAfter"> <columnId>payment_method</columnId> <arguments> <header>Payment Method</header> <index>payment_method</index> <filter_index>payment.method</filter_index> <type>text</type> </arguments> <after>shipping_name</after> </action> <action method="addColumnAfter"> <columnId>email</columnId> <arguments helper="kaska_extendedgrid/getEmailColumnParams" /> <after>payment_method</after> </action> Helper file
public function getEmailColumnParams(){ return array( 'header' => 'Customer Email', 'index' => 'email', 'type' => 'text', 'filter_index'=>'m_sales_flat_order.customer_email', } I also tried locally overriding the _prepareColumns of Mage/Adminhtml/Block/Sales/Order/Grid.php
$this->addColumn('base_grand_total', array( 'header' => Mage::helper('sales')->__('G.T. (Base)'), 'index' => 'base_grand_total', 'type' => 'currency', 'currency' => 'base_currency_code', 'filter_index' => 'sales_flat_order.base_grand_total' )); EDIT After some help from below, the culprit was another extension's overriding of the order grid preparecolumns