insertaTabla() inserta tabla row, boton, accion.#
/*
COSAS QUE HE ARPRENDIDO DE LA PAGINACIÓN:
- Es necesario utilizar insertaTabla, y no tabla o cosas similares
- Como se va a actualizar por ajax al paginar, necesitamos dos funciones
publicas que puedan invocarse desde fuera, por lo cual han de permitir
acceso publico si dan error *OFF no se que, para ello, en espacios/exportacion
- Estas dos funciones, son: funcionLista y funcionCuenta, ambas se crearán en
misma clase que invoca al insertaTabla
- funcionLista, solicita la query (los campos) y funcionCuenta, hace el conteo
- es MUY IMPORTANTE que al utilizar eso, tanto inserta tabla, como funcionLista
y funcionCuenta, empiecen por $this, y no por otras clases creadas con new
¿por qué? para mantener el filtro actual, incluso aunque se refresque la
petición por ajax.
*/
//====== EJEMPLO ====
/*
Supongamos que tenemos donde sea la necesidad de incluir un control que inserta
una tabla paginada. Los filtros que apliquemos sobre la clase, perdurarán pese
a que se vuelvan a solicitar los datos por ajax. La llamada sería así:
*/
$OdsProyectosObjetivos = new OdsProyectosObjetivos();
if($filtradoPorOds) $OdsProyectosObjetivos->añadeFiltro("idObjetivo = ". $parametros["ods"]);
$OdsProyectosObjetivos->OdsProyectos->añadeFiltro("idAmbito = ". $this->datos->id);
$s .= $OdsProyectosObjetivos->OdsProyectos->listaPaginada();
// - - - - - - - - - - -
//y en el control ListaPaginada (que ya viene filtrado por los filtros aplicados),
//tendriamos el siguiente código:
$s .= $this->insertaTabla(
[
"_class" => "tablaProyectos",
"campos" => [
"nombre" => ["campo" => "nombre", "rotulo" => "Iniciativa", "tipo" => "texto", "soloLectura" => true],
"entidad" => ["campo" => "if(OdsProyectos.uned,'UNED', OdsProyectos.otros)", "rotulo" => "Entidad", "tipo" => "texto", "soloLectura" => true],
],
"fija" => false,
"expandida" => true,
"navegacion" => false,
"paginacion" => ["rango" => 15,"pagina" => 1],
"botones" => [
"detalles" => [
"tipo" => "aceptar",
"rotulo" => "Ver detalles",
"icono" => "info-circle"
]
],
"permiteBorrar" => 0,
"permiteInsertar" => 0,
"funcionLista" => "funcionLista",
"funcionCuenta" => "funcionCuenta"
]
);
// y en la misma clase, creamos una función: funcionLista, con permisos de ajax.
//en este caso, como la función está recibiendo los parametros desde fuera, también
//activamos la sobrecarga, para que pueda pillar todos los parametros de fuera
//sin definirlos
funcionLista:
//- - - - - - - - - - - - - - - - - - - - - - - - - - - -
$this->orden("prioridad DESC");
return $this->lista( $parametros["var1"] );
//y en la misma clase, creamos una función: funcionCuenta, con permisos de ajax.
//en este caso, como la función está recibiendo los parametros desde fuera, también
//activamos la sobrecarga, para que pueda pillar todos los parametros de fuera
//sin definirlos
funcionCuenta:
//- - - - - - - - - - - - - - - - - - - - - - - - - - - -
return $this->cuentaExpandida( $parametros["var1"] );
//IMPORTANTE!
Si estuviesemos haciendo un listado de una tabla con información o campos sensibles,
en las funciones lista y cuenta, en vez de aceptar cualquier parametro con
$parametros["var1"], lo que haríamos sería listar los campos que queremos listar
manualmente, para prevenir que nos pudieran poner otros campos externamente y así
hackear la seguridad.
//INSERTA TABLA
Supongamos que tenemos una lista de libros pertenecientes a un autor. Si permitimos la inserción, normalmente queremos que se inserte el idAutor del padre, esto se hace con requeridosInserción
"requeridosInsercion"=> [
"idAutor"=> $this->datos->id,
],
/*-------------------------------------------------------------------------
InsertaTabla con listado en variable:
cuando la tabla se tiene que hacer a partir de una variable, y no del listado de $this->
-------------------------------------------------------------------------*/
$usuariosAplicaciones = $this->SoporteUsuariosAplicaciones->SoporteColaboradores->lista("apellidos, nombre ");
$s .= $this->insertaTabla(array(
"_escritura" => false,
"lista"=>$usuariosAplicaciones, //si fuera un insertaTabla de la instancia actual no haría falta
"campos"=> 'nombre, apellidos, nombreApp',
"permiteInsertar"=> false ,
"permiteEditar"=> false ,
"permiteBorrar"=> false
));
/*-------------------------------------------------------------------------
InsertaTabla EXPANDIDA:
Cuando queremos mostrar algun campo ascendente, al que podemos llegar a través
de relaciones entre las entidades. Si es descendente creo que se tendrian que
aplanar y concatenar con , (Confirmar)
-------------------------------------------------------------------------*/
$s.$MisProvincias->insertaTabla([
"expandida"=>true,
"campos"=>[
"provincia"=>["campo"=>"provincia"],
"pais"=>["campo"=>"MisPaises.pais","rotulo"=>"Pais"],
"capitulos"=>["campo"=>"MisAutores.MisLibros.titulo","rotulo"=>"libros"]
]
]);
/* Creo que los campos que soporta una columna son los siguientes */
"ordenable"=> ,
"soloLectura"=> ,
"anchura"=> ,
"resaltado"=> ,
"class"=> ,
"visible"=> ,
"rotulo"=> ,
"tipo"=> ,
"editor"=> ,
"parametros"=>
//Para forzar un editor específico
$usuario = new Usuario();
$usuario->añadeFiltro("qinnova = 1");
$usuario->añadeFiltro("activo = 1");
$s .= $usuario->insertaTabla([
"expandida"=>true,
"campos"=>[
"nombre"=>["campo"=>"nombre"],
"apellidos"=>["campo"=>"apellidos"],
"alta"=>[
"campo"=>"alta",
"tipo"=> "FechaA2" //existe un quontrol llamado editorFechaA2, así sustituimos el editor por defecto por el que nos interesa
],
]
]);
//Supongamos que tenemos un listado, quizás construido a mano, que queremos dibujar en forma de tabla
$listado = [...]; //un array con registros
//definimos los campos de la tabla (columnas)
$campos = [
"anio"=>["campo"=>"anio","rotulo"=>"Año","totales"=>"suma","tipo"=>"numero"],
"total"=> ["campo"=> "total", "rotulo"=> "Total", "totales"=>"suma", "tipo"=>"numero"],
"tudela"=>["campo"=>"tudela","rotulo"=> "Tudelanos", "tipo"=>"numero"]
];
//dibujamos la tabla pasándole el listado como parámetro
$s .= $this->insertaTabla(
[
"_escritura" => false,
"_class" => "tablaNoveles",
"expandida" => false,
"exportar" => true,
"totales" => true,
"lista" => $listado,
"campos" => $campos,
]);
botones y acceso a rows:
//PHP
//definimos los campos de la tabla (columnas)
$campos = [
"nombre"=>["campo"=>"nombre","rotulo"=>"Ponente" ,"tipo"=>"texto"],
"archivos"=>["campo"=>"archivos","rotulo"=> "Archivos", "tipo"=>"texto"],
//"id" => ["visible"=> false, "campo"=>"id", "rotulo"=> "id", "tipo"=>"texto"] (el array lo tiene, pero no hace falta mostrarlo como columna)
];
$s .= $webex->insertaTabla([
"_escritura" => false,
"_class" => "tablaArchivosPonentes",
"expandida" => false,
"exportar" => false,
"totales" => false,
"lista" => $tabla, //dataset. La lista tiene que tener un campo id para identificar a la fila
"campos" => $campos, //definición de columnas
"botones"=>[
"ficha"=>[
"rotulo"=>"ficha",
"tipo" => "icono",
"color" => "#369",
"icono"=> "user",
//"ayuda"=>"Ver ficha del ponente"
],
]
]);
//JS
//cuando se hace click en un botón de una fila, se dispara un accion con el identificador del botón (acción) y el campo id de la row (el dataset tiene que tener un id)
var tablaArchivos = $(".tablaArchivosPonentes");
tablaArchivos.on("accion", function(e,accion, id){
if(accion=="ficha"){
var fila = tablaArchivos.accion("valor", id);
}
});
// Cuando tienes un insertaTabla desvinculado, y quieres una agrupación, el truco es poner lo_que_sea as agrupacion
$this->orden("grupo");
$lista = $this->listaExpandida("grupo as agrupacion, nombre, estado, descripcion, ChatHerramientas.ChatMotores.descripcion as motor");
$s .= $this->insertaTabla(
[
"lista"=> $lista,
"_escritura"=> false,
"campos"=>"grupo, nombre, estado, descripcion, motor",
"permiteBuscar"=>true,
"permiteEdicion"=>false,
"permiteBorrar"=>false,
"permiteInsertar"=>false,
"agrupacion"=>"grupo",
"botones"=>[
"ficha"=>["rotulo"=>"Ficha"]
]
]
);