2012-03-27 63 views
5
$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变量的属性?的Yii - CGridView - 添加自己的属性

回答

9

当您在columns集合中添加阵列而未指定class属性时,创建的列的类型为CDataColumn。属性CDataColumn::valueexplicitly documented

一个PHP表达式,将每个数据单元进行评估,其结果 将呈现为数据单元的内容。

因此,value具有它得到的每一行eval“版的特殊性质,这就是为什么你可以设置为‘动态’。然而,这是一个例外,几乎没有其他东西支持相同的功能。

但是,您很幸运,因为属性cssClassExpression是另一个特别的例外,它完全涵盖了此用例。所以,你可以做这样的:

array(
    'name'=>'authorName', 
    'value'=>'$data->author->username', 
    'cssClassExpression' => '$data->author->username', 
), 

编辑:我犯了一个错误,同时从例如复制/粘贴,并没有注意到你试图做内部htmlOptions为其他属性同样的事情(我现在已经删除了代码的相关部分)。

如果您需要为动态值添加更多选项,您别无选择,只能继承CDataColumn并覆盖renderDataCell方法(stock implementation is here)。

+1

+1非常好的解释 – 2012-03-27 18:19:25

+0

这和我的例子一样。这不工作 - 没有人显示。 – 2012-03-28 09:29:02

+0

@DirkFograust:这绝对是**不像你的例子一样**。再看看。另外,请确保您使用的是最新版本的Yii。 – Jon 2012-03-28 09:38:37

5

不知道这是否仍然适用(鉴于有一个公认的答案),但有一个稍微好一点的解决方案,以“rowHtmlOptionsExpression”的形式。这指定了一个将针对每一行进行评估的表达式。如果eval()调用的结果是一个数组,它将用作<tr>标记的htmlOptions。所以你现在可以基本上使用这样的东西:

$this->widget('zii.widgets.grid.CGridView', array 
(
    ... 
    'rowHtmlOptionsExpression' => 'array("id" => $data->id)', 
    ... 

所有的标签将有一个id属性与记录的PK。 只需稍微修改jQuery以从该标记中获取id而不是额外的列,并且应该设置。

+0

太棒了......正是我在找的东西,但是一个奇怪的语法人! – tinybyte 2016-01-04 18:43:33

2

扩展类CDataColumn

在保护/组件/创建文件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', 
     ), 
    ), 
));