$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'columns'=>array(
'title', // display the 'title' attribute
'category.name', // display the 'name' attribute of the 'category' relation
'content:html', // display the 'content' attribute as purified HTML
array( // display 'create_time' using an expression
'name'=>'create_time',
'value'=>'date("M j, Y", $data->create_time)',
),
array( // display 'author.username' using an expression
'name'=>'authorName',
'value'=>'$data->author->username',
//HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'htmlOptions'=>array('class'=>'$data->author->username', 'secondAttribute' => $data->author->id),
//HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
),
array( // display a column with "view", "update" and "delete" buttons
'class'=>'CButtonColumn',
),
),
));
在选项value
中,我可以从PHP添加变量,但对于选项htmlOptions
,这是不可能的。为什么?
如何使用PHP变量创建属性?
答案 0 :(得分:9)
在columns
集合中添加数组而未指定class
属性时,正在创建的列的类型为CDataColumn
。 CDataColumn::value
属性explicitly documented为
将为每个数据单元评估的PHP表达式 结果将呈现为数据单元格的内容。
因此,value
具有特殊属性,它为每行获取eval
',这就是您可以“动态”设置它的原因。然而,这是一个例外,几乎没有其他任何东西支持相同的功能。
但是,您很幸运,因为属性cssClassExpression
是另一个特殊的例外,它恰好涵盖了这个用例。所以你可以这样做:
array(
'name'=>'authorName',
'value'=>'$data->author->username',
'cssClassExpression' => '$data->author->username',
),
编辑:我在您的示例中复制/粘贴时犯了一个错误,但没有注意到您正在尝试对htmlOptions
中的其他属性执行相同操作(我现在已删除)代码的相关部分)。
如果您需要为动态值添加更多选项,则别无选择,只能继承CDataColumn
并覆盖renderDataCell
方法(stock implementation is here)。
答案 1 :(得分:5)
不知道这是否仍然适用(假设有一个已接受的答案),但是以“rowHtmlOptionsExpression”的形式有一个稍好的解决方案。这指定了将为每一行计算的表达式。如果eval()调用的结果是一个数组,它将被用作< tr>的htmlOptions。标签。所以你现在基本上可以使用这样的东西:
$this->widget('zii.widgets.grid.CGridView', array
(
...
'rowHtmlOptionsExpression' => 'array("id" => $data->id)',
...
您的所有代码都会有一个带有记录'PK的id属性。 只需稍微修改jQuery以从该标记获取id而不是额外的列,您应该进行设置。
答案 2 :(得分:2)
扩展类CDataColumn
在protected / components /下创建文件DataColumn.php,其中包含以下内容:
/**
* DataColumn class file.
* Extends {@link CDataColumn}
*/
class DataColumn extends CDataColumn
{
/**
* @var boolean whether the htmlOptions values should be evaluated.
*/
public $evaluateHtmlOptions = false;
/**
* Renders a data cell.
* @param integer $row the row number (zero-based)
* Overrides the method 'renderDataCell()' of the abstract class CGridColumn
*/
public function renderDataCell($row)
{
$data=$this->grid->dataProvider->data[$row];
if($this->evaluateHtmlOptions) {
foreach($this->htmlOptions as $key=>$value) {
$options[$key] = $this->evaluateExpression($value,array('row'=>$row,'data'=>$data));
}
}
else $options=$this->htmlOptions;
if($this->cssClassExpression!==null)
{
$class=$this->evaluateExpression($this->cssClassExpression,array('row'=>$row,'data'=>$data));
if(isset($options['class']))
$options['class'].=' '.$class;
else
$options['class']=$class;
}
echo CHtml::openTag('td',$options);
$this->renderDataCellContent($row,$data);
echo '</td>';
}
}
我们可以像这样使用这个新类:
$this->widget('zii.widgets.grid.CGridView', array(
'id' => 'article-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'columns' => array(
'id',
'title',
array(
'name' => 'author',
'value' => '$data->author->username'
),
array(
'class' => 'DataColumn',
'name' => 'sortOrder',
'evaluateHtmlOptions' => true,
'htmlOptions' => array('id' => '"ordering_{$data->id}"'),
),
array(
'class' => 'CButtonColumn',
),
),
));