CGridview condicional botão excluir
-
12-11-2019 - |
Pergunta
Eu quero que o botão excluir para estar ativo apenas em determinados condição de CGgridView
CButtonColumn
(ou fazer um personalizado botão excluir) e g se user=='admin'
ou status=='draft'
.Qualquer idéias?Obrigado!
Solução
use 'visível' parâmetro -
'buttons'=>array
(
'delete' => array
(
'label'=>'Delete',
//other params
'visible'=>!Yii::app()->user->checkAccess('admin'),
),
Outras dicas
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
Você também pode usar a função anônima se o PHP >= 5.3
'visible'=>function($row, $data) {
return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}
Como zuups estados Mukesh post, você tem que utilize aspas simples!E user1584901 é direito com a resposta, no caso, o estado é uma propriedade do modelo de instância.Assim,
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',
está correto.(Explicação na parte inferior)
Eu gostaria de acrescentar algumas coisas interessantes que você pode fazer bem.Por exemplo, considere um usuário com ativos.Neste caso, eu gostaria de adicionar o botão excluir apenas para os usuários que não têm quaisquer ativos.
Neste caso, você pode fazer uma relação no modelo de usuário, tais como
'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')
Que vai retornar 1 se o usuário tem bens, ou 0 caso contrário.E definir o parâmetro visível como
'visible' => '!$data->haveAssets',
A razão de tudo isso funciona (como solicitado pelos 0x7fffffff) é porque o Yii utiliza a seqüência definida de visível para o aplicar ao evaluateExpression função dentro da função que processam os botões (renderButton).
A partir de: https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php linha 337
protected function renderButton($id,$button,$row,$data)
{
if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
return;
Que é definido no CComponent classe:https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php linha 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_);
}
}
Então, basicamente o que acontece é que o evaluateExpression a função de disponibilizar as variáveis $dados (que é o modelo de instância para a linha em questão) e us $linha (tudo isso usando a função de extrair) e avaliar a sua expressão de string como código php.Assim, qualquer menção aos dados $ou $linha vai usar a variável já definida pelo evaluteExpression função neste âmbito.É por isso que você pode usar o respectivo modelo de instância da respectiva linha (como $dados->status, ou seja, $dados->haveAssets a partir de exemplos).Observe que a seqüência de caracteres deve ser uma expressão que retorna um valor booleano para determinar a visibilidade do botão.
E a razão as cadeias de caracteres devem estar entre aspas simples é que, enquanto usando aspas duplas, o php irá assumir que qualquer seqüência de caracteres que começa com $ é uma variável e vai tentar substituir ele com que o valor da variável.Uma vez que, no seu âmbito de us $variável de dados é sem sentido (ou poderia ser definido), ele irá gerar um erro ou substituí-lo erradamente.Usar aspas simples você evitar ter este comportamento.