在我的控制器中:
$model = new Sheets();
$criteria = new CDbCriteria;
$criteria->compare('id', $model->id);
$criteria->compare('track_name', $model->track_name, true);
$criteria->addCondition('user_id = '.Yii::app()->user->getId().' and '.$listSetups[$i]['condition']);
$setups = new CActiveDataProvider($model, array('criteria' => $criteria));
在我看来:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id' => 'sheets-grid',
'dataProvider' => $model,
//'filter' => $model,
'template'=>'{items}<div class="nav-controller">{pager}</div>',
'enableSorting' => false,
'columns' => array(
array(
'header' => 'Track',
'name' => 'track_name',
'value' => $model->track_name,
'htmlOptions' => array(
'width' => '135px',
),
),
但是我收到了这个错误:
错误:未定义属性“CActiveDataProvider.track_name”。
任何人都可以告诉我这是为什么?我该如何修复它。我不想使用$data->track_name
,因为我想在此代码中使用$ model-&gt; track_name来自定义按钮'添加':
array(
'header' => '',
'class' => 'CButtonColumn',
'template' => '<div class="wrapper-tools">{share}{facebook}{twitter}{download}{add}{update}{delete2}</div>',
'buttons'=>array (
'add' => array
(
'label'=>'Add favorite',
'imageUrl'=> (Users::model()->checkFavorite(Yii::app()->user->getId(), $model->track_name)) ? Yii::app()->themeManager->baseUrl."/default/images/favorite.png" : Yii::app()->themeManager->baseUrl."/default/images/favorite-disabled.png",
'url'=>'Yii::app()->createUrl("/sheets/", array("id"=>$data->id))',
'options' => array('id' => 'add-favorite', 'class' => 'admin-tools' ),
//'visible' => 'Users::model()->checkFavorite(Yii::app()->user->getId(), $data->id) == false',
),
),
'htmlOptions' => array(
'class' => 'admin-tools-2',
),
)
谢谢
答案 0 :(得分:3)
在CGridView中你必须使用$data->track_name
,以下行是错误的:
'value' => $model->track_name,
您需要像这样设置值:
'value' => '$data->track_name',
<强>更新强>
正如您所提到的,您希望在每个行的按钮中使用数据,您仍然需要使用数据参数,因为CGridView小部件一次使用$data
参数中给定行的数据呈现一行,$model->attribute
在这里仍然没有上下文,因为它对于CGridView中的每一行都是不同的。
由于未评估imageUrl
param,默认情况下不能在其中使用$data
param,但是如果您创建自定义类来扩展CButtonColumn并覆盖此行为,则可以。< / p>
您可以创建一个类,比如MyCButtonColumn
,并将其保存在components
文件夹中名为MyCButtonColumn.php
的文件中(这样会在需要时自动加载)。
现在,您需要在此新类中创建一个renderButton
方法,以便在需要评估时评估imageUrl
,然后使用新评估的方法返回标准CButtonColumn::renderButton()
方法的结果imageUrl
喜欢这样:
class MyCButtonColumn extends CButtonColumn
{
protected function renderButton($id,$button,$row,$data)
{
if(isset($button['imageUrl']) && is_string($button['imageUrl']) && strpos($button['imageUrl'],'$data')!==false)
$button['imageUrl'] = $this->evaluateExpression($button['imageUrl'],array('row'=>$row,'data'=>$data));
return parent::renderButton($id,$button,$row,$data);
}
}
最后,您需要将按钮列的类别从CButtonColumn
更改为MyCButtonColumn
。完成后,您就可以通过$data
变量解析imageUrl
变量,如下所示:
array(
...
'class' => 'MyCButtonColumn',
...
'buttons'=>array (
'add' => array(
...
'imageUrl'=> '(Users::model()->checkFavorite(Yii::app()->user->getId(),$data->track_name)) ? Yii::app()->themeManager->baseUrl."/default/images/favorite.png" : Yii::app()->themeManager->baseUrl."/default/images/favorite-disabled.png"',
...
),
...
),
...
),