Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii 动态创建显示不同数据的cgridview_Yii_Cgridview - Fatal编程技术网

Yii 动态创建显示不同数据的cgridview

Yii 动态创建显示不同数据的cgridview,yii,cgridview,Yii,Cgridview,我是Yii的新手,我很难弄明白这一点。我想根据用户选择的选项在一个页面上显示多个cgridview,每个gridview只显示该选项的记录。在这种情况下,选项是作业状态,如打开、关闭、进行中等 我有一些代码通过循环数组来显示多个网格视图,但我不确定如何过滤它们: $test = array(1,2,3,4,5); foreach ($test as $value) { $this->widget('zii.widgets.grid.CGridView', array( 'id'

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

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

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


然后在控制器中,您可以从此方法获取多个数据提供程序,每个状态对应一个数据提供程序,将它们发送到视图,最后将它们馈送到不同的cGridView中。

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


然后在控制器中,您可以从此方法获取多个数据提供程序,每个状态对应一个数据提供程序,将它们发送到视图,最后将它们馈送到不同的cgridview中。

您要求使用不同的cgridview,因此:

进入你的模型

现在,您需要编写一些新的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
或在模型之外,例如:

self::CONSTA
ModelName::CONSTA

通过使用const,如果值随时间变化,则不必修改整个代码,也不必在整个项目中查找这些值,因为您要求使用不同的cgridview,因此:

进入你的模型

现在,您需要编写一些新的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
或在模型之外,例如:

self::CONSTA
ModelName::CONSTA

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

这是一个在同一视图中的wiki。

这是一个在同一视图中的wiki。

我认为您只需要一个cGridView,您可以在选择选项时通过ajax更新表……我认为您只需要一个cGridView,就可以进行更新选择选项时使用ajax创建的表格…感谢您的帮助。最后,我在我的工作模型中使用了搜索方法,但我感谢你的努力。谢谢你的帮助。最后,我在我的工作模型中使用了搜索方法,但我感谢你的努力。