#yii #filter #cgridview
#yii #Фильтр #cgridview
Вопрос:
Я отправляю результат объединения некоторого findAll() в CGridView, как можно добавить фильтр в мой CGridView
контроллер:
$model1=mymodel::model->finAll($criteria1);
$model2=mymodel::model->finAll($criteria2);
$model3=mymodel::model->finAll($criteria3);
///**
$data=some foreach and combine molde1,model2,model3
**///
$provider = new CArrayDataProvider( $data );
$this->render('list2', array(
'model' => $provider
));
Ответ №1:
Вы должны реализовать метод в своей модели (может быть основан на model::search()
методе), который возвращает вам критерии поиска:
public function getSearchCriteria()
{
$criteria=new CDbCriteria;
$criteria->compare('attribute_1',$this->attribute_1,true);
$criteria->compare('attribute_2',$this->attribute_2);
// Other attributes here
return $criteria
}
Далее вы должны объединить свои $criteria1
, $criteria2
$criteria3
с этими критериями:
$myModel = new MyModel('search');
$myModel ->unsetAttributes();
if(isset($_GET['MyModel']))
$myModel->attributes=$_GET['MyModel'];
$criteria1->mergeWith($myModel->getSearchCriteria(), 'AND');
$criteria2->mergeWith($myModel->getSearchCriteria(), 'AND');
$criteria3->mergeWith($myModel->getSearchCriteria(), 'AND');
$model1=mymodel::model->finAll($criteria1);
$model2=mymodel::model->finAll($criteria2);
$model3=mymodel::model->finAll($criteria3);
///**
$data=some foreach and combine molde1,model2,model3
**///
$provider = new CArrayDataProvider( $data );
$this->render('list2', array(
'model' => $provider
));
И в представлении:
function getFilterParam($modelName, $attributeName, $default = ''){
$value = Yii::app()->request->getParam($modelName);
if(is_array($value) amp;amp; isset($value[$attributeName])){
return $value[$attributeName];
}
else{
return $default;
}
}
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $dataProvider,
'сolumns'=>array(
'attribute_1' => array(
'header' => 'Attribute_1',
'filter' => CHtml::textField('MyModel["attribute_1"]', getFilterParam('MyModel', 'attribute_1')),
'name' => 'attribute_1',
),
'attribute_2' => array(
'header' => 'Attribute_2',
'filter' => CHtml::textField('MyModel["attribute_2"]', getFilterParam('MyModel', 'attribute_2')),
'name' => 'attribute_2',
),
)
);
Комментарии:
1. getSearchCriteria() — это метод поиска или другой?
2. получил ли я dataprovider из $ mymodel? аналогично: $dataProvider = новый CArrayDataProvider($ mymodel);
3. @maryam CArrayDataProvider принимает только массивы. После объединения критериев вы делаете все так же, как в вашем примере (объедините molde1, model2, model3 и создайте новый CArrayDataProvider).
4. в строке $MyModel = new MyModel(‘search’); что такое ‘поиск’? ‘поиск верен или ‘getSearchCriteria’,
5. @maryam Это строка, которая задает сценарий модели. yiiframework.com/doc/api/1.1/CModel#scenario-detail