Filtering CGridView with CArrayDataProvider in Yii: how?
php, yii
Solution
file: `FiltersForm.php` (I put it in components folder)
/**
* 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;
}
}
In your controller:
...
$filtersForm = new FiltersForm;
if (isset($_GET['FiltersForm'])) {
$filtersForm->filters = $_GET['FiltersForm'];
}
$resultData = $filtersForm->filter($resultData);
$this->render('index', array(
'resultData' => $resultData,
'filtersForm' => $filtersForm
)}//end action
And last what need - add filters to `CGridView` config array:
...
'dataProvider' => $dataProvider,
'enableSorting' => true,
'filter' => $filtersForm,
...
Problem
I created a CGridView in Yii whose rows are read from an XML file. I'm not using any models: only a controller (where I read the file) and a view (where I display the grid). What I cannot create is a filter (one input field per column) in the first row of the grid so to visualize only certain rows. How can I do it? This is what I have until now: Controller: ``` <?php class TestingController extends Controller { public function actionIndex() { $pathToTmpFiles = 'public/tmp'; $xmlResultsFile = simplexml_load_file($pathToTmpFiles.'/test.xml'); $resultData = array(); foreach ($xmlResultsFile->result as $entry) { $chromosome = $entry->chromosome; $start = $entry->start; $end = $entry->end; $strand = $entry->strand; $crosslinkScore = $entry->crosslinkScore; $rank = $entry->rank; $classification = $entry->classification; $mutation = $entry->mutation; $copies = $entry->copies; array_push($resultData, array('Chromosome'=>$chromosome, \ 'Start'=>$start, 'End'=>$end, Strand'=>$strand, \ 'Crosslink_Score'=>$crosslinkScore,'Rank'=>$rank, \ 'Classification'=>$classification, 'Mutation'=>$mutation, \ 'Copies'=>$copies)); } $this->render('index', array('resultData' => $resultData)); } } ?> ``` View: ``` <?php $dataProvider = new CArrayDataProvider($resultData, \ array('pagination'=>array('pageSize'=>10,),)); $this->widget('zii.widgets.grid.CGridView', array( 'id' => 'mutationResultsGrid', 'dataProvider' => $dataProvider, 'columns' => array( array( 'name' => 'Chromosome', 'type' => 'raw', ), array( 'name' => 'Start', 'type' => 'raw', ), array( 'name' => 'End', 'type' => 'raw', ), array( 'name' => 'Strand', 'type' => 'raw', ), array( 'name' => 'Crosslink_Score', 'type' => 'raw', ), array( 'name' => 'Rank', 'type' => 'raw', ), array( 'name' => 'Classification', 'type' => 'raw', ), array( 'name' => 'Mutation', 'type' => 'raw', ), array( 'name' => 'Copies', 'type' => 'raw', ), ), )); ?> ``` Thanks for your help Ale