【问题标题】:Yii CGridView handle special cases using model functionYii CGridView 使用模型函数处理特殊情况
【发布时间】:2014-07-21 17:01:44
【问题描述】:

在 Yii 框架上使用 CGridView 遇到一些问题...

我希望根据列的值替换列的内容。 我需要处理特殊情况,因此我在模型中添加了一个函数以将值返回给 GridView。 我得到了结果错误“Undefined variable: model”。

我敢肯定这很简单。是不是因为我的 dataProvider 不是模型?

这是我的代码的缩短版本:

<?php
/* @var $this BookController */
/* @var $dataProvider CActiveDataProvider */
/* @var $model Book */

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'book-grid',
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name'=>'userName',
            'header'=>'Name',
            ),
        array(
            'name'=>'status',
            'header'=>'Status',
            'type'=>'raw',
            'value'=>array($model, 'statusText')
            ),
    )
));

?>

这是models/Book.php中的代码

class Book extends CActiveRecord
{
    ...
    ...

    public function statusText($data, $row) {
        $content = '';

        if (CHtml::encode($data->status) == "processed") {
            $content = "Process completed";
        }
        else if ($data->status=="") {
            $content = "Queued for Processing";
        }
        else {
            $content = CHtml::encode($data->status);
        }

        return $content;
    }

    ...
    ...
}

【问题讨论】:

  • 我可能错了,但你真的把你的模型传递给了视图文件吗?这可以解释你得到的错误。你的控制器应该有类似 $this->render('view', array('dataProvider' => $dataProvider, 'model' => $model));使模型在视图文件中可用。
  • @JoeMiller 这确实是错误的。 CGridView 使用给定的 CActiveDataProvider,并通过它进行迭代。因此,这里的“$model”是动态的,它依赖于 CGridView 小部件的迭代。在本次迭代中,使用的是 $data 而不是 $model。
  • 啊,这不太正确。在 CGridView 的定义中,如果您以您的方式声明用户定义的函数,那么您需要直接引用模型。您的 CGridView 语句是正确的,但视图文件还没有访问名为 $model 的变量,这就是您收到错误消息的原因。尝试将模型添加到您的控制器渲染语句中,看看是否可行。
  • @JoeMiller 但是,如果您已经通过 DataProvider 提供了一堆相同的模型,为什么要这样做?
  • @veelen 因为您想在视图文件中引用变量 $model 。如果您不这样做,那么您将无法访问您想要的用户定义函数。我通常做的只是将模型传递给视图文件,然后将 CGridView 的 dataProvider 声明为 $model->search() 或类似的东西。无论哪种方式,CGridView 都需要知道您用于声明函数的模型,而 dataProvider 没有该信息。

标签: php yii


【解决方案1】:

这是我当前项目的一个简化示例;

    <?php

    //My controller
    class NewsController extends CController {


//The admin action
        public function actionAdmin() {
            $model = new News;

            $this->render('admin', array(
                'model' => $model
            ));
        }

    }

    //In my view file
    $this->widget('ext.widgets.MyTbGridView', array(
        'dataProvider' => $model->search(),
        'columns' => array(
            array(
                'name' => 'id',
                'filter' => false,
            ),
            array(
                'name' => 'title',
            ),
            array(
                'value' => array($model, 'gridDate')
            ),
        ),
    ));

    //My model function
    class News extends CActiveRecord {

        public function gridDate($data, $row) {
            return 'Date formatted!';
        }

    }
    ?>

代码'value' =&gt; array($model, 'gridFormatDate'), 很重要。这里有两种可能性。该函数可以驻留在控制器中,在这种情况下它应该是'value' =&gt; array($this, 'gridFormatDate'),,或者它可以在模型中,在这种情况下给出正确的代码

【讨论】:

    【解决方案2】:

    试试'$data-&gt;statusText',而不是array($model, 'statusText')

    你的模型中的方法应该是这样的:

    public function getStatusText() {
            $content = '';
    
            if (CHtml::encode($this->status) == "processed") {
                $content = "Process completed";
            }
            else if ($this->status=="") {
                $content = "Queued for Processing";
            }
            else {
                $content = CHtml::encode($this->status);
            }
    
            return $content;
        }
    

    【讨论】:

    • 这给了我这个:未定义属性“Book.statusText”。嗯,你的东西...
    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多