You can easily filter column in a magento grid (see my previous post) but customize a sort is a little bit more hand made.
In this example in the order grid, I want to sort by increment_id, but this is a text fields and I want to sort it by numeric.
default sort : 1, 10, 100, 2, 3 …
numeric sort : 1, 2, 3, 10, 100 …
If you look the SQL request, you got this
1 | SELECT `main_table`.* FROM `sales_flat_order_grid` AS `main_table` ORDER BY increment_id DESC LIMIT 20
|
To tell MySQL to sort this text column by numeric, you can add “+ 0″ to the ORDER BY clause, this will transform the text field into numeric field
1 | SELECT `main_table`.* FROM `sales_flat_order_grid` AS `main_table` ORDER BY increment_id + 0 DESC LIMIT 20
|
Now, how to tell Magento to add “+ 0″ to this sort ?
Override your grid class and modify the “_setCollectionOrder($column)” function.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Adin_Sales_Block_Adminhtml_Sales_Order_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid {
protected function _setCollectionOrder( $column )
{
$collection = $this ->getCollection();
if ( $collection ) {
$columnIndex = $column ->getFilterIndex() ? $column ->getFilterIndex() : $column ->getIndex();
if ( $columnIndex == 'increment_id' )
{
$columnIndex = 'increment_id + 0' ;
}
$collection ->setOrder( $columnIndex , strtoupper ( $column ->getDir()));
}
return $this ;
}
}
|