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!

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top