Php Yii CGridView使用模型函数处理特殊情况

Php Yii CGridView使用模型函数处理特殊情况,php,yii,Php,Yii,在Yii框架上使用CGridView时遇到一些问题 我希望根据列所包含的值替换列的内容。 我需要处理特殊情况,所以我在模型中添加了一个函数,以向GridView返回一个值。 我得到了结果错误“未定义变量:model” 我相信这很可能是件简单的事。是不是因为我的数据提供程序不是模型 以下是我的代码的简化版本: <?php /* @var $this BookController */ /* @var $dataProvider CActiveDataProvider */ /* @var $

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

我希望根据列所包含的值替换列的内容。 我需要处理特殊情况,所以我在模型中添加了一个函数,以向GridView返回一个值。 我得到了结果错误“
未定义变量:model

我相信这很可能是件简单的事。是不是因为我的数据提供程序不是模型

以下是我的代码的简化版本:

<?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')
            ),
    )
));

?>
代替
数组($model,'statusText')
,尝试
'$data->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;
    }

下面是我当前项目中的一个简化示例

    <?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'=>数组($model,'gridFormatDate'),
很重要。这里有两种可能性。该函数可以驻留在控制器中,在这种情况下,它应该是
'value'=>数组($this,'gridFormatDate'),
或者它可以在模型中,在这种情况下,给出了正确的代码,给出了以下属性:未定义“Book.statusText”。嗯,你的模型有问题……我可能错了,但是你真的把模型传递到视图文件了吗?这可以解释你所犯的错误。您的控制器应该有类似$this->render('view',array('dataProvider'=>$dataProvider,'model'=>$model));使模型在视图文件中可用。@JoeMiller这确实是错误的。CGridView使用给定的CActiveDataProvider,并对其进行某种程度的迭代。因此,这里的“$model”是动态的,它是在CGridView小部件的迭代上进行的。在这个迭代中,使用的是$data,而不是$model。啊,这不太正确。在CGridView的定义中,如果您以自己的方式声明用户定义的函数,那么您需要直接引用模型。您的CGridView语句是正确的,但是视图文件还没有访问名为$model的变量的权限,这就是您收到错误消息的原因。尝试将模型添加到您的控制器呈现语句中,看看是否有效。@JoeMiller但如果您已经通过数据提供程序提供了一组相同的模型,为什么要这样做?@veelen,因为您希望在视图文件中引用变量$model。如果不这样做,则将无法访问想要访问的用户定义函数。我通常只需将模型传递给视图文件,然后将CGridView的数据提供程序声明为$model->search(),或者类似的内容。无论哪种方式,CGridView都需要知道您用于声明函数的模型,而数据提供程序没有这些信息。
    <?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!';
        }

    }
    ?>