Pregunta

Quiero que el botón Eliminar esté activo solo en determinadas condiciones en CGgridView CButtonColumn (o crear un botón de eliminación personalizado), por ejemplo, si user=='admin' o status=='draft'.¿Algunas ideas?¡Gracias!

¿Fue útil?

Solución

Usar parámetro 'visible' -

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

Otros consejos

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

También puede usar la función anónima si PHP>= 5.3

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

Como afirma Zuups en Mukesh Post, ¡tiene que usar comillas simples! Y el usuario1584901 tiene razón con la respuesta, en el caso de que el estado sea una propiedad de la instancia del modelo. Entonces,

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

es correcto. (Explicación en la parte inferior)

Quiero agregar algunas cosas interesantes que puedes hacer también. Por ejemplo, considere un usuario con activos. En este caso, me gustaría agregar el botón Eliminar solo a los usuarios que no tienen ningún activo.

En este caso, puede hacer una relación en el modelo de usuario, como

'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')

que devolverá 1 si el usuario tiene activos, o 0 de lo contrario. Y definir el parámetro visible como

'visible' => '!$data->haveAssets',


La razón por la que todo esto funciona (como se le preguntó por 0x7ffffffff) se debe a que YII usa la cadena definida en visible para aplicarla a la función EvalateExpression dentro de la función que rinden los botones (Renderbutton).

de: https:// github.com/yiiisoft/yii_blob/1.1.14/framework/zii/widgets/grid/cbuttoncolumn.php line 337

protected function renderButton($id,$button,$row,$data)
    {
            if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
                      return;

que se define en la clase CComponent: https://github.com/yiisoft/yii_blob /1.1.14/framework/base/ccomponent.php line 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_);
            }
    }

Así que, básicamente, lo que sucede es que la función de EvaluaceExpression pondrá a disposición de las variables $ DATA (que es la instancia del modelo para la fila en cuestión) y $ fila (todo esto utilizando la función de extracción) y evalúe la expresión de su cadena como PHP código. Por lo tanto, cualquier mención de $ DATA o $ ROW usará la variable ya establecida por la función EvaluteExpression en este ámbito. Es por eso que puede usar la instancia modelo correspondiente de la fila correspondiente (como $ DATA-> estado, o $ DATA-> HaveasSets de los ejemplos). Observe que la cadena debe ser una expresión que devuelve un booleano para determinar la visibilidad del botón.

y la razón por la que las cadenas deben estar en una sola cotización es que al usar comillas dobles, PHP asumirá que cualquier cadena que comience con $ es una variable e intentará reemplazarlo con ese valor de variable. Dado que, en su alcance, la variable de datos $ no tiene sentido (o podría definirse), le arrojará un error o lo reemplazará erróneamente. Usando comillas simples, evita tener este comportamiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top