1
2
3
4
|
$collection ->joinLeft( array ( 'sales_flat_order_address' ), 'sales_flat_order.billing_address_id
= sales_flat_order_address.entity_id' , array ( 'postcode' , 'street' , 'city' ); |
1
2
3
4
|
addColumn( 'address' , array ( 'header' =>
Mage::helper( 'sales' )->__( 'Address' ), 'type' => 'text' , )); |
1
2
3
4
5
6
|
addColumn( 'address' , array ( 'header' =>
Mage::helper( 'sales' )->__( 'Address' ), 'type' => 'text' , 'index' => 'city' 'renderer' => 'Atwix_Ordersgrid_Block_Adminhtml_Sales_Order_Renderer_Address' )); |
1
2
3
4
5
6
7
8
9
10
11
12
|
class Atwix_Ordersgrid_Block_Adminhtml_Sales_Order_Renderer_Address extends Mage_Adminhtml_Block_Widget_Grid_Column_Renderer_Abstract { public function render(Varien_Object
$row ) { $value = $row ->getData( 'city' )
. ',' . $row ->getData( 'street' )
. ',' . $row ->getData( 'postcode' ); return $value ; } } |
1
2
3
4
5
6
|
$this ->addColumn( 'address' , array ( 'header' =>
Mage::helper( 'sales' )->__( 'Address' ), 'type' => 'text' , 'renderer' => 'Atwix_Ordersgrid_Block_Adminhtml_Sales_Order_Renderer_Address' , 'filter_condition_callback' => array ( $this , '_addressFilter' ), )); |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
protected function _addressFilter( $collection , $column ) { if (! $value = $column ->getFilter()->getValue())
{ return $this ; } $this ->getCollection()->getSelect()->where( "sales_flat_order_address.city
like ? OR
sales_flat_order_address.street like ? OR
sales_flat_order_address.postcode like ?" , "%$value%" ); return $this ; } |
As you can see, we are using simple db query condition to filter query results by the columns. This way you can create your own filters for columns with complex values or custom renderers. Feel free to ask any questions and suggest your own improvements.
原文:http://www.atwix.com/magento/grid-filter-for-columns/
PS:在magento的后台grid,用“renderer”来处理最终显示的内容是很常用的一种做法,但这会带来一个问题是,经过“renderer”的那一列没法像普通的列一样用过滤,这篇文章就是针对这个问题给出了解决方案,而且用的还是原生结构就支持的方式,这里的关键词就是“filter_condition_callback”,至于为什么可以这样用,可以看下Core_Adminhtml_Block_Widget_Grid里的_addColumnFilterToCollection方法,这里不再详细解释