Кнопка условного удаления CGridView
-
12-11-2019 - |
Вопрос
Я хочу, чтобы кнопка удаления была активна только при определенном условии в CGgridView
CButtonColumn
(или создайте пользовательскую кнопку удаления), например, если user=='admin'
или status=='draft'
.Есть какие-нибудь идеи?Спасибо!
Решение
используйте параметр "видимый" -
'buttons'=>array
(
'delete' => array
(
'label'=>'Delete',
//other params
'visible'=>!Yii::app()->user->checkAccess('admin'),
),
Другие советы
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
Вы также можете использовать анонимную функцию, если PHP >= 5.3
'visible'=>function($row, $data) {
return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}
Как утверждает зуупс в посте Мукеша, вы должны использовать одинарные кавычки!И пользователь1584901 прав с ответом, в том случае, если статус является свойством экземпляра модели.Итак,
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',
является правильным.(Объяснение внизу)
Я хочу добавить несколько интересных вещей, которые вы тоже можете сделать.Например, рассмотрим пользователя с активами.В этом случае я бы хотел добавить кнопку удаления только для пользователей, у которых нет никаких ресурсов.
В этом случае вы можете создать связь в пользовательской модели, такую как
'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')
Который вернет 1, если у пользователя есть активы, или 0 в противном случае.И определите видимый параметр как
'visible' => '!$data->haveAssets',
Причина, по которой все это работает (как и просил 0x7fffffff), заключается в том, что Yii использует строку, определенную в visible, чтобы применить ее к функции evaluateExpression внутри функции, которая отображает кнопки (renderButton).
От: https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php строка 337
protected function renderButton($id,$button,$row,$data)
{
if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
return;
Который определен в классе CComponent:https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php строка 607
public function evaluateExpression($_expression_,$_data_=array())
{
if(is_string($_expression_))
{
extract($_data_);
return eval('return '.$_expression_.';');
}
else
{
$_data_[]=$this;
return call_user_func_array($_expression_, $_data_);
}
}
Итак, в основном, что происходит, так это то, что функция evaluateExpression сделает доступными переменные $data (которые являются экземпляром модели для рассматриваемой строки) и $row (все это с помощью функции extract) и оценит ваше строковое выражение как php-код.Таким образом, любое упоминание $data или $row будет использовать переменную, уже установленную функцией evaluteExpression в этой области.Вот почему вы можете использовать соответствующий экземпляр модели соответствующей строки (как $data->status или $data->haveAssets из примеров).Обратите внимание, что строка должна быть выражением, которое возвращает логическое значение для определения видимости кнопки.
И причина, по которой строки должны быть в одинарных кавычках, заключается в том, что при использовании двойных кавычек php будет предполагать, что любая строка, начинающаяся с $, является переменной, и попытается заменить ее значением этой переменной.Поскольку в вашей области видимости переменная $data не имеет смысла (или может быть определена), она выдаст ошибку или заменит ее вводящим в заблуждение образом.Используя одинарные кавычки, вы предотвращаете подобное поведение.