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
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
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.
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; } }