2013-10-01 3 views
4

모델을 사용하여 gridview를 표시하고 검색 방법을 필터링하고 결과를 필터링 할 수 있지만 다른 dataprovider 및 다른 모델을 사용하여 gridview를 만들고 결과를 필터링 할 수 있습니까? 필터는 데이터 제공자의 일부 여야합니까?yii CGridView 데이터 제공 업체 및 필터

$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()CDbCriteria 인스턴스가 포함 된 CActiveDataProvider을 반환합니다. CDbCriteriamergeWith()을 사용하여 조합 할 수 있습니다. 당신이 데이터를하고자한다면 새로운 $ 기준이 사용되는 $model

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

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

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

이라면 criterias 중 하나에 "조인"속성이 있고 다른 하나에 "with"속성이 있으면 문제가 생길 것입니다. 그렇습니까? – tinybyte

1

필터는 dataprovider의 일부일 필요는 없지만 필터링에 사용하려면 데이터 공급자가 모델을 고려해야합니다. 방지 아무것도 없다

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

:

이 기본적으로 수행되는 방법과 같이, 모델 값을 기준으로 데이터 공급자의 조건을 설정 모델에 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

그래, 내 나쁜, 내가 편집 한 답이 –