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

时间:2013-12-12 12:15:00

标签: php yii

在Yii Framework上遇到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;
    }

    ...
    ...
}

2 个答案:

答案 0 :(得分: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' => array($model, 'gridFormatDate'),很重要。这里有两种可能性。该函数可以驻留在控制器中,在这种情况下,它应该是'value' => array($this, 'gridFormatDate'),,或者它可以在模型中,在这种情况下,给出正确的代码

答案 1 :(得分:0)

代替array($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;
    }