Yii - CGridView - добавить собственный атрибут - PullRequest
5 голосов
/ 27 марта 2012
$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?

Ответы [ 3 ]

9 голосов
/ 27 марта 2012

Когда вы добавляете массивы в коллекцию columns без указания свойства class, тип создаваемого столбца - CDataColumn.Свойство CDataColumn::value является явно задокументированным и должно быть

выражением PHP , которое будет оцениваться для каждой ячейки данных и результат которого будет отображаться каксодержимое ячеек данных.

Следовательно, value имеет специальное свойство, которое получает eval 'ed для каждой строки, и поэтому вы можете установить его динамически».Однако это исключение, и почти ничто другое не поддерживает те же функции.

Однако вам повезло, потому что свойство cssClassExpression является еще одним специальным исключением, которое охватывает именно этот случай использования.Таким образом, вы можете сделать это следующим образом:

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

Редактировать: Я допустил ошибку при копировании / вставке из вашего примера и не заметил, что вы пытаетесь сделать то же самое длядополнительные атрибуты внутри htmlOptions (теперь я удалил соответствующую часть кода).

Если вам нужно добавить дополнительные параметры для динамических значений, у вас нет выбора, кроме как создать подкласс CDataColumn и переопределить renderDataCell method ( здесь есть реализация ).

5 голосов
/ 15 апреля 2013

Не знаю, применяется ли это по-прежнему или нет (учитывая, что есть принятый ответ), но есть немного лучшее решение в форме "rowHtmlOptionsExpression". Это указывает выражение, которое будет оцениваться для каждой строки. Если результатом вызова eval () является массив, он будет использоваться как htmlOptions для тега

. Теперь вы можете использовать что-то вроде этого:
$this->widget('zii.widgets.grid.CGridView', array
(
   ...
   'rowHtmlOptionsExpression' => 'array("id" => $data->id)',
   ...

Все ваши теги будут иметь атрибут id с записями PK. Просто немного измените jQuery, чтобы получить идентификатор из этого тега вместо дополнительного столбца, и вы должны быть установлены.

2 голосов
/ 29 июля 2014

Расширить класс CDataColumn

Под защищенным / 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',
        ),
    ),
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...