unchanged
Title
Using filters with CGridView and CArrayDataProvider
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,
));
~~~