2012-02-24 12 views
10

Quiero que el botón de eliminación esté activo solo en ciertas condiciones en CGgridViewCButtonColumn (o haga un botón de eliminación personalizado) e g si user=='admin' o status=='draft'. ¿Algunas ideas? ¡Gracias!Botón de eliminación condicional CGridview

Respuesta

19

uso del parámetro 'visible' -

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

Gracias, funciona (si puse el valor 'visible' en comillas simples :) – zuups

+0

@Mukesh Soni bien, esto es engañoso.Ponga comillas alrededor de esa expresión en su respuesta, actualmente es incorrecta –

+1

Esto no funcionará para el caso de uso del borrador. Ver respuestas que involucran $ datos – guidod

6

También puede utilizar la función anónima si PHP> = 5,3

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

No funciona – Sky

+0

Creo que debe ser function ($ data, $ row) y no function ($ row, $ data). –

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

Para mejorar la calidad de su publicación, incluya por qué/cómo su respuesta resuelve el problema. –

3

Como zuups establece en Mukesh posterior, usted tiene que utilizar una sola ¡citas! Y user1584901 tiene razón con la respuesta, en el caso de que el estado sea una propiedad de la instancia del modelo. Por lo tanto,

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

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

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

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

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

que devolverá 1 si el usuario tiene activos, o 0 en caso contrario. y definir el parámetro visible como

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

La razón de todo esto funciona (como se le preguntó por 0x7fffffff) se debe a Yii utiliza la cadena se define en visible para aplicarlo a la función evaluateExpression dentro de la función que hacen que la botones (renderButton).

Desde: https://github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/CButtonColumn.php línea 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 CCable: https://github.com/yiisoft/yii/blob/1.1.14/framework/base/CComponent.php línea 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 evaluateExpression pondrá a disposición de las variables $ datos (que es la instancia del modelo para la fila en cuestión) y $ row (todo esto mediante el uso de la función de extracción) y evaluar la expresión de su cadena como código php. Entonces cualquier mención a $ data o $ row usará la variable ya establecida por la función evaluteExpression en este ámbito. Es por eso que puede usar la instancia de modelo respectiva de la fila respectiva (como $ data-> status, o $ data-> haveAssets de los ejemplos). Observe que la cadena debe ser una expresión que devuelve un valor booleano para determinar la visibilidad del botón.

Y la razón por la cual las cadenas deben estar entre comillas simples es que al usar comillas dobles, php asumirá que cualquier cadena que comience con $ es una variable e intentará reemplazarla con ese valor de variable. Dado que, en su ámbito, la variable $ data no tiene sentido (o podría definirse) arrojará un error o lo reemplazará de manera engañosa. Usando comillas simples previene tener este comportamiento.

Cuestiones relacionadas