如何在CCheckBoxColumn中使用rowdata变量

时间:2014-06-24 10:08:49

标签: yii cgridview

我用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变量?

2 个答案:

答案 0 :(得分:2)

该框架不支持htmlOptions数组的PHP表达式。仅checked中的cssClassExpression disabled valueCCheckBoxColumn支持表达式。请参阅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()来评估您的表达