【发布时间】: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 没有该信息。