2013-02-04 4 views
0

이 작업은 쉽게 해결할 수있는 일반적인 문제입니다. 다음과 같이 gii 생성 된 관리 페이지가 수정되었습니다. 검색 양식이 수정되어 주어진 사용자와 관련된 레코드를 선택합니다. 이 작동하고, 그리드 검색을 잘 때 업데이 트됩니다.검색 양식 및 인라인 cGridView 필터 inter-operationability

저는 다양한 사용자 관련 데이터를 포함하도록 그리드의 출력을 사용자 정의했습니다. 예를 들어 각 레코드는 일부 사용자 데이터를 반영합니다.

그리드 필터 (위젯의 상단)를 사용하면 필터 결과가 좋지만 사용자의 원래 필터는 손실됩니다.

그래서 사용자에게 쿼리를 보내고 몇 가지 결과를 선택하고 다른 기준에 따라 결과를 필터링하려면 사용자가 필터링 한 결과가 아닌 전체 데이터 집합에서 생성 된 결과를 생성합니다.

보조 노트, 나는이 사실 나는 그것이 작동하지 않습니다 위의 지정된 필터링,하지만이 페이지를 새로 고침 할 때 등 원하는대로 결과가 정확하게 때와 같은 일부 결과를 생산 http://www.yiiframework.com/extension/remember-filters-gridview/

설치 시도 이전 세션의 두 필터를 모두 저장했습니다.

희망이 분명합니다. 도와주세요! 감사합니다.

답변

1

코드는 항상 유용하지만 사용자를 올바르게 이해하고 있다면 사용자 메시지를 표시하기 위해 비슷한 작업을 수행합니다. 로그인 한 사용자에게 보낸 메시지 만 찾도록 초기 필터를 설정 한 다음 사용자가 제목과 보낸 사람별로 메시지를 필터링하도록해야합니다. 나는 당신의 모델이나 기준의 이름을 모르는, 그래서 여기에 내가 할 방법에 대한 간단한 예는 다음과 같습니다

컨트롤러 :

public function actionIndex() 
{ 
    $model = new Message('search'); 
    $model->unsetAttributes(); 

    if(isset($_GET['Message'])) 
     $model->attributes = $_GET['Message']; 

    // Set default filter 
    $model->msg_to = Yii::app()->user->id; 

    $this->render('index', array('model' => $model)); 
} 

보기 :

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=> 'message-grid', 
    'dataProvider'=> $model->search(), 
    'filter'=> $model, 
)); 

모델 :

public function search() 
{ 
    $criteria = new CDbCriteria; 

    $criteria->compare('from',$this->from); 
    $criteria->compare('msg_to',$this->msg_to); 
    $criteria->compare('from_name',$this->from_name,true); 
    $criteria->compare('subject',$this->subject,true); 
    $criteria->compare('body',$this->body,true); 
    $criteria->compare('read',$this->read); 

    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
     'pagination'=>array('pageSize'=>15), 
    )); 
} 

기본 필터 기준이 매우 복잡하면 가장 좋은 방법은이 같은 모델의 4,489,: 당신의 기준 입력을 요구하는 경우 :

public function scopes() 
{ 
    return array(
     'inbox' => array(
      'condition' => 't.msg_to = :user_id', 
      'params' => array(':user_id' => Yii::app()->user->id), 
      'order' => 'min(t.read) ASC, t.posted_on DESC', 
     ), 
    ); 

} 

당신이 CGridView에 $model->inbox()->search()을 작성합니다 그 범위를 사용하려면 대신 $model->search() 또한 다음

마지막 한가지 $model->msg_to = Yii::app()->user->id; 줄을 제거한다 사용자로부터 $ _GET 변수를 통해 "Parameterized Named Scopes"를 사용할 수 있습니다. 이 페이지의 섹션을 참조하십시오 : 당신은 같은 방법으로 사람들을 사용 http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes : $model->inbox()->search()

0

대답은 코드의 조건에 따라 다를 수 있습니다 :

1) USER_ID의 형태가 GET 또는 POST입니까? POST이면 GET으로 변경해야합니다.CGridView는 GET을위한 것임

2) 우리는 두 개의 폼으로 작업하기 때문에 각 경우에 작업 수행에 필요한 인수를 받으면 코드를 확인해야합니다. 필요한 모든 데이터를 항상 수신하도록 URL 또는 sesion 또는 쿠키를 변경하십시오.

3) CgridView는 필터를 현재 URL에 추가하고 AJAX를 보내면 user_id를 선택하는 양식이 일반 HTTP GET (AJAX가 아님)과 양식 필드 이름이 사용자 ID를 검색한다고 추측됩니다.

를 USER_ID된다

a) 필터 필드 CGridView "MODEL_NAME [ 'ATTRIBUTE_NAME']」를 컨트롤러에 명명되어 형태가 다음 칼럼 CGridWiew로도 사용할 수있는 사용자 ID 경우

public function actionAdmin($user_id="") { 
    ... 
    if (!empty($user_id)) $model->user_id = intval($user_id); 
    if (isset($_GET['model_name']) $model->attributes = $_GET['model_name']; 
    ... 
} 

b) :

public function actionAdmin($user_id="") { 
    ... 
    if (isset($_GET['model_name']) { 
     if (! isset($_GET['model_name']['user_id']) && ! empty($user_id)) { 
      $_GET['model_name']['user_id'] = $user_id; 
     }   
     $model->attributes = $_GET['model_name']; 
    } elseif (!empty($user_id)) $model->user_id = intval($user_id); 
    ... 
} 

c)는 actionAdmin이며 actionAdmin()과 같은 사용자 ID는

yii::app()->request->getParam('user_id');