【问题标题】:Dynamically create CGridViews that show different data动态创建显示不同数据的 CGridView
【发布时间】:2013-03-19 16:45:24
【问题描述】:

我是 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 数据绑定方法来考虑它。

【问题讨论】:

  • 我认为您只需要一个 CGridViews 并且您可以在选择选项时通过 ajax 更新表格...

标签: yii cgridview


【解决方案1】:

您要求不同的 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

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

【讨论】:

  • 感谢您的帮助。我最终在我的 Job 模型上使用了 Search 方法,但我感谢你的努力。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是同一视图中dynamic gridviews 的 wiki。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      相关资源
      最近更新 更多