我用CGridView生成网格
'id'=>'grid',
'type'=>'striped bordered condensed',
'selectableRows'=>2,
'dataProvider'=>$data,
'template'=>"{items}",
'rowCssClassExpression'=>'(($data["deleted"])?"deleted":"")',
'ajaxUpdate'=>true,
'columns'=>array(
array(
'class'=>'CCheckBoxColumn',
'checkBoxHtmlOptions'=>array(
'name'=>'checkbox[id][]',
'class'=>'grid-checkbox',
'data-aaa'=>'$data["aaa"]',
'data-bbb'=>'$data["bbb"]',
),
),
我可以在rowCssClassExpression中访问$ data变量。但同时在CCheckBoxColumn的'checkBoxHtmlOptions'中,$ data被解析为字符串:
<input type="checkbox" ... data-aaa="($data["aaa"])" data-bbb="($data["bbb"])">
如何访问$ data变量?
答案 0 :(得分:2)
该框架不支持htmlOptions数组的PHP表达式。仅checked
中的cssClassExpression
disabled
value
和CCheckBoxColumn
支持表达式。请参阅CCheckBoxColumn
here的属性文档
数据单元格的数据就像这样呈现
public function renderDataCell($row)
{
$data=$this->grid->dataProvider->data[$row];
$options=$this->htmlOptions;
if($this->cssClassExpression!==null)
{
$class=$this->evaluateExpression($this->cssClassExpression,array('row'=>$row,'data'=>$data));
if(!empty($class))
{
if(isset($options['class']))
$options['class'].=' '.$class;
else
$options['class']=$class;
}
}
echo CHtml::openTag('td',$options);
$this->renderDataCellContent($row,$data);
echo '</td>';
}
请参阅here了解来源。
正如您所看到的,只有cssClassExpression
当前正在使用evaluateExpression
函数,该函数会评估基于$data
的表达式。
唯一的解决方案是扩展CCheckBoxColumn
并覆盖功能您可以通过在组件文件夹中创建一个文件MyCheckBoxColumn
来实现此目的
<?php
class MyCheckBoxColumn extend CCheckBoxColumn {
public $htmlOptionsExpression;
public function renderDataCell($row)
{
$data=$this->grid->dataProvider->data[$row];
$options=$this->htmlOptions;
if($this->cssClassExpression!==null)
{
$class=$this->evaluateExpression($this->cssClassExpression,array('row'=>$row,'data'=>$data));
if(!empty($class))
{
if(isset($options['class']))
$options['class'].=' '.$class;
else
$options['class']=$class;
}
}
if($this->htmlOptionsExpression != null){
foreach ( $this->htmlOptionsExpression as $attribute => $optionExpression) {
$value=$this->evaluateExpression($optionsExpresion,array('row'=>$row,'data'=>$data));
$options[$attribute] = $value;
}
}
echo CHtml::openTag('td',$options);
$this->renderDataCellContent($row,$data);
echo '</td>';
}
}
最后在你的CGridview中使用它
'id'=>'grid',
'type'=>'striped bordered condensed',
'selectableRows'=>2,
'dataProvider'=>$data,
'template'=>"{items}",
'rowCssClassExpression'=>'(($data["deleted"])?"deleted":"")',
'ajaxUpdate'=>true,
'columns'=>array(
array(
'class'=>'MyCheckBoxColumn',
'checkBoxHtmlOptions'=>array(
'name'=>'checkbox[id][]',
'class'=>'grid-checkbox',
),
'htmlOptionsExpression'=>array(
'data-aaa'=>'$data["aaa"]',
'data-bbb'=>'$data["bbb"]',
),
),
),
答案 1 :(得分:1)
可以通过扩展类 CCheckBoxColumn ,
来完成如果你看protected function renderDataCellContent($row,$data)
,这是需要被覆盖的函数
然后,您可以在需要时使用$this->evaluateExpression()
来评估您的表达