2013-03-19 55 views
1

我是Yii的新手,我很難搞清楚這一點。我想根據用戶選擇的選項在頁面上顯示多個CGridView,每個gridview只顯示該選項的記錄。在這種情況下,這些選項是作業狀態,如打開,關閉,進行中等。動態創建顯示不同數據的CGridViews

我有一些代碼工作,通過循環顯示多個網格視圖,但我不知道如何篩選它們:

$test = array(1,2,3,4,5); 

foreach ($test as $value) { 

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid', 
    'dataProvider'=>$model->search(), 
    'columns'=>array(
     'ID', 
     'CustomerCompany', 
     'FirstName', 
     'LastName', 
     /* etc */ 
    ), 
)); 

} 

有關如何從數組中的值過濾每個gridview的任何想法?

謝謝!

UPDATE

好吧,我想通了如何做什麼,我試圖做。我處理它在這樣的控制器:

public function actionBoard() 
{ 
    $models = array(); 

    $statuses = JobStatus::model()->findAll(); 
    foreach ($statuses as $status) 
    { 
    $model=new Job('search'); 
    $model->unsetAttributes(); // clear any default values 

    if(isset($_GET['Job'])) 
     $model->attributes=$_GET['Job']; 
     $model->Status = $status->ID; 
     $models[$status->Status] = $model; 
    } 

    $this->render('board',array('models'=>$models)); 
} 

所以我覺得所有的狀態,然後使用ID字段做搜索,結果放在一個數組,然後將它傳遞給視圖。餘處理像這樣在視圖中:

foreach ($models as $status) 
{ 

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid', 
    'dataProvider'=>$status->search(), 
    'columns'=>array(
     'ID', 
     'CustomerCompany', 
     'FirstName', 
     'LastName', 
     'Phone1', 
     'Phone2', 
     /* etc */ 
    ), 
)); 

基本上,創建「狀態」的陣列中的每個「狀態」一個gridview。似乎工作,只花了一些時間來考慮它的MVC條款,而不是我習慣的舊的ASP.NET數據綁定方法。

+0

我認爲你只需要一個CGridViews,當你選擇選項時,你可以通過ajax更新表... – 2013-03-19 17:35:45

回答

2

你問不同的CGridViews,所以這裏是:

轉到您的模型。

現在,您需要編寫一些新的搜索()方法。

在每一個方法,你會指定你想要的值,比如這2種方法:現在,你有你的搜索方法

public function searchA() { 
// Warning: Please modify the following code to remove attributes that 
// should not be searched. 

     $criteria = new CDbCriteria; 

     $criteria->compare('id', $this->id); 
     $criteria->compare('email', $this->email, true); 
     $criteria->compare('password', $this->password); 
     $criteria->compare('created', $this->created); 
     $criteria->compare('lastmodified', $this->lastmodified); 
     $criteria->compare('confirmed', $this->confirmed); 
     $criteria->compare('is_human', 1);// this is a human 

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

    public function searchB() { 

     $criteria = new CDbCriteria; 

     $criteria->compare('id', $this->id); 
     $criteria->compare('email', $this->email, true); 
     $criteria->compare('password', $this->password); 
     $criteria->compare('created', $this->created); 
     $criteria->compare('lastmodified', $this->lastmodified); 
     $criteria->compare('confirmed', $this->confirmed); 
     $criteria->compare('is_human', 0);//this is not a human, maybe a donkey ... who knows 
     $criteria->compare('username', $this->username, true); 

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

,使用所需的搜索方法對每個cgridview

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid', 
    'dataProvider'=>$model->searchA(), 
    'columns'=>array(
     'ID', 
     'CustomerCompany', 
     'FirstName', 
     'LastName', 
     /* etc */ 
    ), 
)); 

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid2', 
    'dataProvider'=>$model->searchB(), 
    'columns'=>array(
     'ID', 
     'CustomerCompany', 
     'FirstName', 
     'LastName', 
     /* etc */ 
    ), 
)); 

簡單

PS:作爲一招,你可能想使用常量,如:

const CONSTA = 1; 
const CONSTB = 2; 

,並在模型中,然後使用爲:

self::CONSTA 

或模型外:

ModelName::CONSTA 

使用常量,如果你的價值隨時間而改變,你不必修改整個代碼,你不必看看這些值的項目遍佈整個項目

+0

感謝您的幫助。我最終在Job模型上使用Search方法來完成它,但是我很感謝你的努力。 – Jim 2013-03-19 21:34:50

+0

沒問題,隨時 – 2013-03-19 21:58:26

2

您應該從問題的數據部分開始:首先嚐試創建幾個數據提供程序,以返回所需的結果。如果您使用Gii來自動生成某些模型,您可以查看該示例中的search()方法以查看示例,瞭解如何使用不同的查詢條件創建此類提供程序。您應該嘗試將此代碼保存在某個模型中。例如,您可以創建一個searchByStatus($status)方法,該方法返回給定狀態的數據提供程序。

然後在控制器中,您可以從該方法中獲取多個數據提供者,一個用於您想要的每種狀態,將它們發送到視圖並最終將它們饋送到不同的CGridView。

+0

thankx爲解釋,現在跳轉到我的例子:) – 2013-03-19 21:13:18