Difference between #2 and #1 of Using filters with CGridView and CArrayDataProvider

unchanged
Title
Using filters with CGridView and CArrayDataProvider
unchanged
Category
How-tos
unchanged
Tags
CGridview, CArrayDataProvider, filters, filter
changed
Content
Using filters on CGridView with CActiveDataProvider is easy, but with
CArrayDataProvider it is a bit tricky.

To use the filters you have to create a separate model class. I used some code
from the following forum topic:
[link](http://www.yiiframework.com/forum/index.php?/topic/16435-cgridview-filters-with-carraydataprovider/page__p__90394#entry90394)

Here is some example code:

Model
-----
Copy and include this class into your application.
~~~
[php]
/**
 * Filterform to use filters in combination with CArrayDataProvider and
CGridView
 */
class FiltersForm extends CFormModel
{
    public $filters = array();

	/**
	 * Override magic getter for filters
	 */
    public function __get($name)
    {
        if(!array_key_exists($name, $this->filters))
            $this->filters[$name] = null;
        return $this->filters[$name];
    }

	/**
	 * Filter input array by key value pairs
	 * @param array $data rawData
	 * @return array filtered data array
	 */
	public function filter(array $data)
	{
		foreach($data AS $rowIndex => $row) {
			foreach($this->filters AS $key => $value) {
				// unset if filter is set, but doesn't match
				if(array_key_exists($key, $row) AND !empty($value)) {
					if(stripos($row[$key], $value) === false)
						unset($data[$rowIndex]);
				}
			}
		}
		return $data;
	}
}
~~~

Controller
----------
~~~
[php]
// Create filter model and set properties
$filtersForm=new FiltersForm;
if (isset($_GET['FiltersForm']))
    $filtersForm->filters=$_GET['FiltersForm'];

// Get rawData and create dataProvider
$rawData=User::model()->findAll();
$dataProvider=new
CArrayDataProvider($rawData);$filteredData=$filtersForm->filter($rawData);
$dataProvider=new CArrayDataProvider($filteredData);

// Render
$this->render('index', array(
    'filtersForm' => $filtersForm,
    'dataProvider' => $dataProvider,
));
~~~

View
----
~~~
[php]
$columns = array(
	array(
		'header'=>CHtml::encode('Name'),
		'name'=>'username',
		'value'=>'$data->username',
	),
	array(
		'header'=>CHtml::encode('Organisation'),
		'name'=>'organisation',
		'value'=>'$data->organisation',
	),
);

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'area-grid',
'dataProvider'=>$dataProvider,    'id'=>'area-grid',
    'dataProvider'=>$dataProvider,
    'columns'=>$columns,
    'filter'=>$filtersForm,
));
~~~