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