Как поместить контрастную информацию в столбец CGridView на основе условия?
Я смотрю на показ / скрытие определенных данных столбца на CGridView
виджет для Wii Framework.
у меня есть CButtonColumn
который содержит 3 кнопки. Однако при определенных условиях я хочу отобразить что-то другое для конкретной строки. У меня есть 3 различных условия, которые определяют, что отображается для определенного ряда.
Ниже показано, что я хочу сделать:
| 1 | Title A | [hide][view][update] <-- if (condition == 'a')
| 2 | Title B | [hide][view][update] <-- if (condition == 'a')
| 3 | Title C | display text or link or button <-- if (condition == 'b')
| 4 | Title D | display alternative buttons <-- if (condition == 'c')
Какой мой лучший подход, чтобы взять здесь?
Я не могу использовать 'visible'=> $model->processingStatus != "processed"
на столбце, потому что это удалит весь столбец. Мне нужно нацелиться на каждый ряд.
Должен ли я использовать 'visible'
параметр на каждой отдельной кнопке? Я пробовал это, используя закомментированный код ниже, но это ломает страницу. К вашему сведению: я успешно попробовал параметр "visible" на самом CButtonColumn, но это не то, что мне нужно. Плюс не уверен, какой статус строки он читает.
Или я должен добавить функцию в контроллер? Пусть он выполнит оператор if/else и вернет обратно то, что должно отображаться. Как это будет работать?
Вот мой код:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'my-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
array(
'name'=>'myid',
'header'=>'ID',
),
'Title',
array(
'class'=>'CButtonColumn',
'visible'=> $model->status != "done",
'template'=>'{hide}{view}{update}',
'buttons'=>array(
'hide'=>array(
'label'=>'Hide', //Text label of the button.
'imageUrl'=>Yii::app()->request->baseUrl . '/img/icons/bulb-off.png' //Image URL of the button.
//'click'=>'function(){alert("Toggle Hide!");}', //A JS function to be invoked when the button is clicked.
//'options'=>array(), //HTML options for the button tag.
//'url'=>'javascript:void(0)', //A PHP expression for generating the URL of the button.
//'visible'=> $model->status == "done", //A PHP expression for determining whether the button is visible.
),
'view'=>array(
//Text label of the button.
'label'=>'View',
//Image URL of the button.
'imageUrl'=>Yii::app()->request->baseUrl . '/img/icons/view-record.png'
),
'update'=>array(
'label'=>'Update/Edit',
'imageUrl'=>Yii::app()->request->baseUrl . '/img/icons/edit-pencil.png',
'url'=>'Yii::app()->createUrl("metadataandchapters/create?bookid=" . $data->bookid)',
)
)
)
)
)); ?>
Надеюсь, у меня есть достаточно смысла здесь!
2 ответа
Вы должны использовать visible
опция кнопки, но это должна быть строка выражения PHP, например:
'visible'=> '$data->status == "done"',
Расширьте CButtonColumn своим собственным классом, и тогда вы сможете изменить эту функцию на любую необходимую вам для рендеринга или скрытия кнопок или внесения любых изменений, которые вы захотите.
/**
* Renders a link button.
* @param string $id the ID of the button
* @param array $button the button configuration which may contain 'label', 'url', 'data-icon', 'imageUrl' and 'options' elements.
* @param integer $row the row number (zero-based)
* @param mixed $data the data object associated with the row
*/
protected function renderButton($id, $button, $row, $data)
Подробнее о функции http://www.yiiframework.com/doc/api/1.1/CButtonColumn