Кнопка условного удаления CGridview - PullRequest
10 голосов
/ 24 февраля 2012

Я хочу, чтобы кнопка удаления была активна только в определенных условиях в CGgridView CButtonColumn (или создайте пользовательскую кнопку удаления), например, если user=='admin' или status=='draft'.Есть идеи?Спасибо!

Ответы [ 4 ]

19 голосов
/ 24 февраля 2012

использовать параметр 'visible' -

 'buttons'=>array
    (
        'delete' => array
        (
            'label'=>'Delete',
            //other params
            'visible'=>!Yii::app()->user->checkAccess('admin'),
        ),
9 голосов
/ 08 августа 2012
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
6 голосов
/ 25 февраля 2012

Вы также можете использовать анонимную функцию, если PHP> = 5.3

'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}
3 голосов
/ 19 декабря 2013

Как говорится в сообщении Мукеша, вы должны использовать одинарные кавычки!И пользователь 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, чтобы применить ее к функцииvaluExpression внутри функции, которая отрисовываеткнопки (renderButton).

From: 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_);
            }
    }

Таким образом, в основном получается, что функцияvaluExpression сделает доступными переменные $ data (который является экземпляром модели для рассматриваемой строки) и $ row (все это с помощью функции extract) и оценит вашу строкуВыражение в виде PHP-кода.Поэтому при любом упоминании $ data или $ row будет использоваться переменная, уже установленная функцией evaluteExpression в этой области.Вот почему вы можете использовать соответствующий экземпляр модели соответствующей строки (как $ data-> status или $ data-> haveAssets из примеров).Обратите внимание, что строка должна быть выражением, которое возвращает логическое значение для определения видимости кнопки.

И причина, по которой строки должны заключаться в одинарные кавычки, заключается в том, что при использовании двойных кавычек php будет предполагать, что любая строка,начинается с переменной $ и будет пытаться заменить ее значением этой переменной.Поскольку в вашей области видимости переменная $ data не имеет смысла (или может быть определена), она выдаст ошибку или введет ее в заблуждение.Используя одинарные кавычки, вы предотвращаете подобное поведение.

...