1

我是 Yii 的新手,我很难弄清楚这一点。我想根据用户选择的选项在页面上显示多个 CGridView,每个 gridview 只显示该选项的记录。在这种情况下,选项是作业状态,例如打开、关闭、进行中等。

我有一些代码可以通过遍历数组来显示多个网格视图,但我不确定如何过滤它们:

$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 的任何想法?

谢谢!

更新

好的,我想出了如何做我想做的事情。我在控制器中处理它是这样的:

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 */
    ),
));

基本上,为“状态”数组中的每个“状态”创建一个网格视图。似乎可行,只是花了一些时间用 MVC 术语而不是我习惯的旧 ASP.NET 数据绑定方法来考虑它。

4

3 回答 3

2

你要求不同的 CGridViews,所以这里是:

进入你的模型。

现在,您需要编写一些新的 search() 方法。

在每种方法中,您将指定所需的值,例如以下两种方法:

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

通过使用 const,如果您的值随时间变化,您不必修改整个代码,也不必在整个项目中查看这些值

于 2013-03-19T21:09:17.347 回答
2

您应该从问题的数据部分开始:首先尝试创建几个返回所需结果的数据提供者。如果您使用Gii自动生成一些模型,您可以查看search()那里的方法以查看如何创建具有不同查询条件的此类提供程序的示例。您应该尝试将此代码保存在某个模型中。例如,您可以创建一个searchByStatus($status)方法,该方法返回给定状态的数据提供者。

然后在控制器中,您可以从此方法中获取多个数据提供者,为您想要的每种状态提供一个,将它们发送到视图,最后将它们馈送到不同的 CGridViews。

于 2013-03-19T20:56:04.020 回答
0

这是同一视图中动态网格视图的 wiki 。

于 2013-05-01T20:50:34.633 回答