2013-02-04 68 views
0

我會保持這種抽象,因爲我相信(希望)這是一個簡單的解決方法的普遍問題。 我修改了一個gii生成的管理頁面,如下所示。 修改搜索表單以選擇與給定用戶有關的記錄。這工作,並在搜索網格更新罰款。搜索表單和內聯cGridView過濾器的互操作性

我已經定製了網格的輸出以包含各種用戶相關的數據,例如反映一些用戶數據的每條記錄。

當我使用網格過濾器(到小部件的頂部)過濾結果很好,但是我失去了用戶的原始過濾器。

所以,我查詢用戶,它選擇了一些結果,當我想在其他標準上過濾這些結果時,它會生成從整個數據集生成的結果,而不是用戶過濾的結果。

一個側面說明,我已經嘗試安裝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), 
    )); 
} 

如果您的默認篩選條件非常複雜,最好的辦法是創建一個named scope模型是這樣的:

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變量,您可以使用「參數化命名範圍」。見這個頁面上: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或cookie以始終收到您需要的所有數據。

3)CgridView將過濾器添加到當前url併發送給AJAX,我猜想用於選擇user_id的表單是正常的HTTP GET(不適用於AJAX),並且表單字段的名稱用於檢索用戶ID被user_id說明

a)所述過濾字段被命名爲CGridView 「MODEL_NAME [ 'ATTRIBUTE_NAME']」 然後在控制器:

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)如果用戶ID的形式也可作爲一列CGridWiew然後:

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)是你的動作管理就像是動作管理()你必須檢索用戶ID與

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