2012-02-24 3 views
10

Я хочу, чтобы кнопка удаления была активна только в определенных условиях в CGgridViewCButtonColumn (или сделать пользовательскую кнопку удаления), если user=='admin' или status=='draft'. Есть идеи? Благодаря!Кнопка условного удаления CGridview

ответ

19

использование 'видимый' параметр -

'buttons'=>array 
    (
     'delete' => array 
     (
      'label'=>'Delete', 
      //other params 
      'visible'=>!Yii::app()->user->checkAccess('admin'), 
     ), 
+2

Спасибо, он работает (если я ставлю «видимое» значение в одинарные кавычки :) – zuups

+0

@Mukesh Soni right, это вводит в заблуждение.Пожалуйста, поместите цитаты вокруг этого выражения в свой ответ, в настоящее время его неправильный –

+1

Это не будет работать для варианта использования проекта. См. Ответы с $ data – guidod

6

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

'visible'=>function($row, $data) { 
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status; 
} 
+0

Не работает – Sky

+0

Я думаю, что это должна быть функция ($ data, $ row), а не функция ($ row, $ data). –

9
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")' 
+1

Чтобы улучшить качество вашего сообщения, укажите, почему/как ваш ответ решает проблему. –

3

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