$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?
Когда вы добавляете массивы в коллекцию columns
без указания свойства class
, тип создаваемого столбца – это CDataColumn
. Свойство CDataColumn::value
явно задокументировано как
выражение PHP, которое будет оцениваться для каждой ячейки данных и результат которого будет отображаться как содержимое ячеек данных.
Поэтому value
имеет специальное свойство, которое получает значение для каждой строки, поэтому вы можете установить его «динамически». Однако это исключение, и почти ничего не поддерживает ту же функциональность.
Однако вам повезло, потому что свойство cssClassExpression
является еще одним особым исключением, которое охватывает именно этот случай использования. Поэтому вы можете сделать это так:
array( 'name'=>'authorName', 'value'=>'$data->author->username', 'cssClassExpression' => '$data->author->username', ),
Изменить: я допустил ошибку при копировании / вставке из вашего примера и не заметил, что вы пытались сделать то же самое для дополнительных атрибутов внутри htmlOptions
(теперь я удалил соответствующую часть кода).
Если вам нужно добавить дополнительные параметры для динамических значений, у вас нет выбора, кроме подкласса CDataColumn
и переопределения метода renderDataCell
( реализация запасов здесь ).
Не знаю, действует ли это или нет (учитывая, что есть принятый ответ), но есть немного лучшее решение в форме «rowHtmlOptionsExpression». Это указывает выражение, которое будет оцениваться для каждой строки. Если результатом вызова eval () является массив, он будет использоваться как htmlOptions для тега <tr>. Поэтому вы можете в основном использовать что-то вроде этого:
$this->widget('zii.widgets.grid.CGridView', array ( ... 'rowHtmlOptionsExpression' => 'array("id" => $data->id)', ...
Все ваши теги будут иметь атрибут id с PK записей. Просто немного измените jQuery, чтобы получить идентификатор из этого тега вместо дополнительного столбца, и вы должны быть установлены.
Расширить класс 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', ), ), ));