как добавить фильтр в мой CGridView, когда я отправляю результат некоторого поиска

#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