2012-03-27 17 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', 
     ), 
    ), 
)); 

En la opción value puedo añadir variables de PHP, pero para la opción htmlOptions esto no es posible. ¿Por qué?
¿Cómo puedo hacer un atributo con la variable PHP?Yu - CGridView - añadir propio atributo

Respuesta

9

Cuando agrega matrices en la colección columns sin especificar una propiedad class, el tipo de columna que se está creando es CDataColumn. La propiedad CDataColumn::value es explicitly documented para ser

una expresión PHP que será evaluada para cada celda de datos y cuya resultado será mostrado como el contenido de las celdas de datos.

Por lo tanto, value tiene la propiedad especial que se pone eval 'ed para cada fila y es por eso que se puede establecer 'dinámica'. Sin embargo, esta es una excepción, y casi nada más admite la misma funcionalidad.

Sin embargo, está de enhorabuena porque la propiedad cssClassExpression es otra excepción especial que cubre exactamente este caso de uso. Así que usted puede hacerlo de esta manera:

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

Editar: he cometido un error, mientras que copiar/pegar de su ejemplo y no se dio cuenta de que estaba tratando de hacer lo mismo para los atributos adicionales en el interior htmlOptions (I ahora han eliminado la parte relevante del código).

Si necesita agregar más opciones para los valores dinámicos, no tiene más opción que la subclase CDataColumn y anular el método renderDataCell (stock implementation is here).

+1

+1 muy buena explicación –

+0

esto es igual que en mi ejemplo. esto no funciona, nadie se muestra. –

+0

@DirkFograust: Esto definitivamente ** no es el mismo ** que su ejemplo. Eche otro vistazo. Además, asegúrese de estar utilizando la última versión de Yii. – Jon

5

No sé si esto sigue siendo válido o no (dado que hay una respuesta aceptada), pero hay una solución ligeramente mejor en la forma de "rowHtmlOptionsExpression". Esto especifica una expresión que se evaluará para cada fila. Si el resultado de la llamada eval() es una matriz, se usará como htmlOptions para la etiqueta <tr>. Así que básicamente se puede ahora usar algo como esto:

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

Todas las etiquetas tendrán un atributo id con PK de los registros. Simplemente modifique el jQuery ligeramente para obtener el ID de esa etiqueta en lugar de una columna adicional y debe configurarlo.

+0

genial ... justo lo que estaba buscando, pero ¡qué hombre de sintaxis tan extraño! – tinybyte

2

Extender la clase CDataColumn

Bajo protegidas/componentes/crear el archivo DataColumn.php con el siguiente contenido:

/** 
* 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>'; 
    } 
} 

podemos utilizar esta nueva clase como esta:

$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', 
     ), 
    ), 
)); 
Cuestiones relacionadas