2013-10-01 3 views
4

Я знаю, что мы можем показать сетку с моделью и ее метод поиска и отфильтровать результаты, но можем ли мы сделать gridview с другим dataprovider и другой подобной моделью и фильтровать ее результаты? Должен ли фильтр быть частью dataprovider?yii CGridView dataprovider и filter

$attr = Yii::app()->request->getParam($name); 

$model = new User('search'); 
$model->unsetAttributes(); 
$model->setAttributes($attr); 

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $myDataProvider, 
'filter' => $model, 
'columns' => array(
    array(
     'name' => 'username', 
     'type' => 'raw', 
     'value' => 'CHtml::encode($data->username)' 
    ), 
    array(
     'name' => 'email', 
     'type' => 'raw', 
    ), 
), 

));

Вышеупомянутый код не работает, и мне нужно добавить фильтр к ранее сделанному поставщику данных.

Btw $attr имеет действительные данные, но сетка не фильтруется.

ответ

3

$model не влияет на $myDataProvider, так как поставщик данных не получен с этой модели.

$model->search() возвращает CActiveDataProvider, который содержит экземпляр CDbCriteria. Различные CDbCriteria можно комбинировать с использованием mergeWith(). Так что, если вы хотите данные для фильтрации с использованием значений из $model

... 
$model->setAttributes($attr); 

$newDataProvider=$model->search(); 
$myDataProvider->criteria->mergeWith($newDataProvider->criteria); 

$this->widget('zii.widgets.grid.CGridView', array(
... 
+0

, если один из критериев имеет свойство «присоединиться» и другое свойство «с», у вас будут проблемы, не так ли? – tinybyte

1

Фильтр не обязательно должен быть частью датаподатчика, но поставщик данных должен учитывать модель, если вы хотите использовать ее для фильтрации.

Как это делается по умолчанию, чтобы создать поставщик данных с помощью search метода на модели, которая устанавливает условия поставщика данных на основе значений модели, например, так:

'dataProvider' => $model->search() 

Там ничто не мешает вы от создания другого поставщика данных, например:

'dataProvider' => $model->createAnotherDataProvider() 

И в модели пользователя:

public function createAnotherDataProvider() { 
{ 
    // create your second data provider here 
    // with filtering based on model's attributes, e.g.: 

    $criteria = new CDbCriteria; 
    $criteria->compare('someAttribute', $this->someAttribute); 

    return new CActiveDataProvider('User', array(
     'criteria' => $criteria, 
    )); 
} 
+0

, где используется новый $ критерии? (Это не используется в этом методе!) – tinybyte

+0

да, мой плохой, я редактировал ответьте –

Смежные вопросы