Quiero que el botón de eliminación esté activo solo en ciertas condiciones en CGgridView
CButtonColumn
(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
uso del parámetro 'visible' -
'buttons'=>array
(
'delete' => array
(
'label'=>'Delete',
//other params
'visible'=>!Yii::app()->user->checkAccess('admin'),
),
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;
}
No funciona – Sky
Creo que debe ser function ($ data, $ row) y no function ($ row, $ data). –
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
Para mejorar la calidad de su publicación, incluya por qué/cómo su respuesta resuelve el problema. –
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.
- 1. ejecución condicional después de un desencadenador de eliminación en SQLite
- 2. crear botón de eliminación personalizada para uitableview
- 3. Botón de eliminación personalizada en jqGrid
- 4. Refactorización en C++: expansión condicional y eliminación de bloque
- 5. Botón condicional agregado a jQuery modal
- 6. Yu - CGridView - añadir propio atributo
- 7. ¿Cómo personalizar Yii CGridView Pager?
- 8. ¿Puedo actualizar un Yii CGridView desde js?
- 9. Usando CGridView para mostrar los atributos de otro modelo
- 10. iOS - eliminación de bordes alrededor de un botón Round Rect
- 11. Cómo mostrar las filas de CGridView como un enlace
- 12. Cuadro desplegable del filtro CGridView del array
- 13. Colorbox - eliminación del botón Cerrar desde una ventana específica
- 14. Uso de CGridView para la asociación de un modelo
- 15. Yii CGridView clasificación y búsqueda con la tabla de relación
- 16. usando una matriz como fuente de datos para CGridView
- 17. ¿Cómo uso el parámetro ajaxUrl de CGridView en Yii?
- 18. Yii - Manipulación de consultas para CGridView personalizado con búsqueda avanzada
- 19. Rails validación condicional de derivación
- 20. Eliminación/eliminación de grupo en Xcode
- 21. ¿Cómo imitar un botón de eliminación de brillo rojo en el contacto de iphone/ipad?
- 22. Google maps eliminación de controles
- 23. Eliminación de filas en la cuadrícula de datos WPF utilizando el botón Eliminar
- 24. SP_WHO2 condicional?
- 25. Sucursales condicional
- 26. Expansión de macro condicional
- 27. compilación condicional de Golang
- 28. Parámetros de powershell condicional
- 29. Inclusión condicional de CSS
- 30. Verificación condicional de JSTL
Gracias, funciona (si puse el valor 'visible' en comillas simples :) – zuups
@Mukesh Soni bien, esto es engañoso.Ponga comillas alrededor de esa expresión en su respuesta, actualmente es incorrecta –
Esto no funcionará para el caso de uso del borrador. Ver respuestas que involucran $ datos – guidod