Magento custom filter on grid

Sometimes, you need a special column on your grid from another table or with some calculation.
It works well, column is displayed but filter doesn’t work.
Here a small example how to customize your filter :

On your grid class (Adin_Sponsorship_Block_Adminhtml_Sponsorship_Grid.class.php), override your _prepareColumns() function

protected function _prepareColumns()
{
        $this->addColumn('sponsor_email', array(
                'header'    => Mage::helper('evian_customer')->__('Sponsor Email'),
                'index'     => 'sponsor_email',
                'align'     => 'center',
                'filter_condition_callback' => array($this, '_filterSponsortEmail'),
            )
        );
}

The ‘filter_condition_callback’ option indicates to use as filter a specific method, on the current class ($this) the method _filterSponsortEmail().

So next step, create this method.

    protected function _filterSponsortEmail($collection, $column)
    {
        if (!$value = trim($column->getFilter()->getValue())) {
            return;
        }
        $this->getCollection()->addFieldToFilter('customer.email', array('like' => '%'.$value.'%'));
    }

Yes, this is this simple.

If you use a datetime column, it’s just a bit more complicated, see below

        $this->addColumn('created_at', array(
            'header'    => Mage::helper('evian_customer')->__('Date of sponsorship'),
            'index'     => 'created_at',
            'align'     => 'center',
            'type' => 'datetime',
            'filter_condition_callback' => array($this, '_filterDate'),
            )
        );

and the filter method

    protected function _filterDate($collection, $column)
    {
        $filters = $column->getFilter()->getValue();

            $from = $filters['from'];
            $to = $filters['to'];


       $this->getCollection()->addFieldToFilter('main_table.created_at', array('gteq' => $from->toString('yyyy-MM-dd')));
        $this->getCollection()->addFieldToFilter('main_table.created_at', array('lteq' => $to->toString('yyyy-MM-dd')));
    }