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
Here is some example code:
Copy and include this class into your application.
/** * 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; } }
// 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); // Render $this->render('index', array( 'filtersForm' => $filtersForm, 'dataProvider' => $dataProvider, ));
$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, 'columns'=>$columns, 'filter'=>$filtersForm, ));
Total 3 comments
i use Chessspider approach, but with minor modification on the filter() function to refresh dataprovider rawData so the pagination will be correct and filter can be perform nicely as we want to.
so here's the filter() function
I had to modify the filter() method to this:
and the controller Render-call to this:
I copied it over 1:1, literally. Yet it still refuses to do any filtering whatsoever.
It shows all data, and the filter box appears. However when I enter text in it, no filtering occurs. There is no change whatsoever.
Any ideas what could be the problem?
Leave a comment
Please login to leave your comment.