Кнопка условного удаления CGridview

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

4 ответов


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

 '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;
}

как утверждает zuups в mukesh post, вы должны использовать одинарные кавычки! И user1584901 прав с ответом, в случае, если статус является свойством экземпляра модели. Итак,

'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 из примеров). Обратите внимание, что строка должна быть выражением, возвращающим логическое значение для определения видимости кнопки.

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