diff --git a/AportaContenido.php b/AportaContenido.php index 5c15cb5..99c57ce 100644 --- a/AportaContenido.php +++ b/AportaContenido.php @@ -144,8 +144,8 @@ class AportaContenido { return "Menú Principal"; case 'principal': return "Pantalla Inicial"; - case 'elementos': case 'articulos': $opcion = "artículos"; + case 'elementos': case 'ubicaciones': case 'usuarios': case 'test': diff --git a/Mantenimiento.php b/Mantenimiento.php index 9620a59..c1d1051 100644 --- a/Mantenimiento.php +++ b/Mantenimiento.php @@ -29,7 +29,6 @@ class Mantenimiento { private $descripcion; protected $bdd; protected $url; - protected $cabecera; protected $tabla; protected $cadenaBusqueda; protected $campos = array(); @@ -37,39 +36,85 @@ class Mantenimiento { protected $campoBusca = "Descripcion"; protected $comandoConsulta = ""; protected $perfil; + protected $datosURL = array(); + protected $datosURLb = array(); //para hacer una copia - public function __construct($baseDatos, $perfil, $nombre) { + public function __construct($baseDatos, $perfil, $nombre) + { $this->bdd = $baseDatos; - $this->url = "index.php?$nombre&opc=inicial"; - $this->cabecera = 'Location: ' . $this->url; + $this->url = "index.php?$nombre"; + //$this->datosURL[''] $this->tabla = ucfirst($nombre); $this->perfil = $perfil; + $this->cargaDatosURL(); } - public function ejecuta() { - $opc = $_GET['opc']; - $id = $_GET['id']; - $orden = isset($_GET['orden']) ? $_GET['orden'] : ''; - $sentido = isset($_GET['sentido']) ? $_GET['sentido'] : 'asc'; - //Sólo tiene sentido para las modificaciones. - //Es la página donde estaba el registro - $pag = isset($_GET['pag']) ? $_GET['pag'] : '0'; - $this->cadenaBusqueda = $_GET['buscar']; + /** + * Carga en los atributos de la clase los datos de la URL + * Los datos constantes en la URL son: + * - opc = {inicial, editar, eliminar, nuevo, insertar, modificar, borrar} + * - orden = {id, ... } nombre del campo por el que se ordena la visualización + * - sentido = {asc, desc} + * - pag = nº página 0, 1, 2, ... + * Los datos opcionales de la URL son: + * - buscar = cadena de búsqueda + * - id = nº de la clave necesario para la edición o el borrado + */ + public function cargaDatosURL() + { + $this->datosURL['opc'] = isset($_GET['opc']) ? $_GET['opc'] : 'inicial'; + $this->datosURL['orden'] = isset($_GET['orden']) ? $_GET['orden'] : 'id'; + $this->datosURL['sentido'] = isset($_GET['sentido']) ? $_GET['sentido'] : 'asc'; + $this->datosURL['pag'] = isset($_GET['pag']) ? $_GET['pag'] : '0'; + $this->cadenaBusqueda = isset($_GET['buscar']) ? $_GET['buscar'] : null; + $this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda; + $this->datosURL['buscar'] = $this->cadenaBusqueda; + $this->datosURL['id'] = isset($_GET['id']) ? $_GET['id'] : null; + } + + public function backupURL() + { + $this->datosURLb = $this->datosURL; + } + + public function restoreURL() + { + $this->datosURL = $this->datosURLb; + } + + //Monta una URL con los datos cargados en los atributos de la clase + private function montaURL() + { + //Primero los datos obligatorios + $opc = "&opc=" . $this->datosURL['opc']; + $orden = "&orden=" . $this->datosURL['orden']; + $sentido = "&sentido=" . $this->datosURL['sentido']; + $pag = "&pag=" . $this->datosURL['pag']; + //Ahora los datos opcionales + $buscar = isset($this->cadenaBusqueda) ? "&buscar=$this->cadenaBusqueda" : null; + $id = isset($this->datosURL['id']) ? "&id=" . $this->datosURL['id'] : null; + $enlace = $this->url . $opc . $orden . $sentido . $pag . $buscar . $id; + return $enlace; + } + + public function ejecuta() + { $this->obtenerCampos(); $this->obtieneClavesForaneas(); - switch ($opc) { - case 'inicial':return $this->consulta($id, $orden, $sentido); - case 'editar':return $this->muestra($id, EDICION, $pag, $orden, $sentido); - case 'eliminar':return $this->muestra($id, BORRADO); - case 'nuevo':return $this->muestra(null, ANADIR); + switch ($this->datosURL['opc']) { + case 'inicial':return $this->consulta(); + case 'editar':return $this->muestra(EDICION); + case 'eliminar':return $this->muestra(BORRADO); + case 'nuevo':return $this->muestra(ANADIR); case 'insertar':return $this->insertar(); - case 'modificar':return $this->modificar($id, $pag, $orden, $sentido); - case 'borrar':return $this->borrar($id); - default:return 'La clase Mantenimiento No entiende lo solicitado.'; + case 'modificar':return $this->modificar(); + case 'borrar':return $this->borrar(); + default: return "La clase Mantenimiento No entiende lo solicitado [" . $this->datosURL['opc'] . "]"; } } - protected function obtieneClavesForaneas() { + protected function obtieneClavesForaneas() + { $salida = null; foreach ($this->campos as $clave => $valor) { $trozos = explode(",", $valor["Comment"]); @@ -87,20 +132,21 @@ class Mantenimiento { $this->foraneas = $salida; } - private function consulta($pagina, $orden, $sentido) { + private function consulta() + { + $orden = $this->datosURL['orden']; + $sentido = $this->datosURL['sentido']; //Calcula los números de página anterior y siguiente. - $pagina = $pagina + 0; + $pagina = $this->datosURL['pag']; $pagSigte = $pagina <= 0 ? 1 : $pagina + 1; - $pagAnt = $pagSigte - 2; + $pagAnt = $pagSigte - 2 < 0 ? 0 : $pagSigte -2; $pagFwd = $pagSigte + 3; - $pagRew = $pagAnt - 3 < 0 ? $pagAnt : $pagAnt - 3; + $pagRew = $pagAnt - 3 < 0 ? 0 : $pagAnt - 3; //Tengo que procesar la cabecera antes de lo de la cadena de búsqueda por el tema de las búsquedas $cabecera = $this->cabeceraTabla(); - //Trata con la cadena de búsqueda - $this->cadenaBusqueda = isset($_POST['buscar']) ? $_POST['buscar'] : $this->cadenaBusqueda; + //Trata con la cadena de búsqueda si viene del post debe quedarse con ella sino con la del get y si no está definida => vacía if (isset($this->cadenaBusqueda) && strlen($this->cadenaBusqueda)) { $sufijo = " where $this->campoBusca like '%" . $this->bdd->filtra($this->cadenaBusqueda) . "%'"; - $sufijoEnlace = "&buscar=" . $this->cadenaBusqueda; $comando = str_replace('{buscar}', $sufijo, $this->comandoConsulta); } else { $comando = str_replace('{buscar}', '', $this->comandoConsulta); @@ -114,35 +160,34 @@ class Mantenimiento { } //Introduce un botón para hacer búsquedas y el número de la página $salida = $this->enlaceBusqueda($pagSigte); - //Esta orden de centrado se cierra en el pie de la tabla - //$salida.='

Página ' . $pagSigte . '

'; -// $salida .=''; $salida.= $cabecera; //Consulta paginada de todas las tuplas - $comando = str_replace('{inferior}', ($pagAnt + 1) * NUMFILAS, $comando); + $comando = str_replace('{inferior}', $pagina * NUMFILAS, $comando); $comando = str_replace('{superior}', NUMFILAS, $comando); - //$salida.=$comando; $tabla = strtolower($this->tabla); $this->bdd->ejecuta($comando); + $numRegistros = $this->bdd->numeroTotalTuplas(); + //Si el número de la página fwd es mayor que el total de páginas lo establece a éste + if (NUMFILAS > 0) { + $totalPags = (int) ($numRegistros / NUMFILAS) - 1; + if ($numRegistros % NUMFILAS) { + $totalPags++; + } + } else { + $totalPags = 0; + } + $pagFwd = $pagFwd > $totalPags ? $totalPags : $pagFwd; if ($this->bdd->numeroTuplas() == 0) { if ($pagSigte > 1) { // Si no hay datos en la consulta y no es la primera página, - // carga la página inicial - header('Location: ' . $this->url); + // carga la página final + $this->datosURL['pag'] = $totalPags; + header('Location: ' . $this->montaURL()); } else { $salida = "

No hay registros


"; } } - //$salida.=print_r($this->perfil); //$salida.=$comando; - //var_dump($this->campos); while ($fila = $this->bdd->procesaResultado()) { $salida.=''; foreach ($fila as $clave => $valor) { @@ -169,37 +214,56 @@ class Mantenimiento { } //Añade el icono de editar if ($this->perfil['Modificacion']) { - $salida.='datosURL['id'] = $id; + $salida.='editar'; + $this->restoreURL(); } //Añade el icono de eliminar if ($this->perfil['Borrado']) { - $salida.='  backupURL(); $this->datosURL['opc'] = "eliminar"; $this->datosURL['id'] = $id; + $salida.='  eliminar' . "\n"; + $this->restoreURL(); } } $salida.="

"; //Añade botones de comandos - $enlace = '\"anterior\"\n"; - $siguiente = $enlace . $pagSigte . $sufijoEnlace . "\">\"siguiente\"\n"; - $fwd = $enlace . $pagFwd . $sufijoEnlace . "\">\"mas5p\"\n"; - $rew = $enlace . $pagRew . $sufijoEnlace . "\">\"menos5p\"\n"; - if (strlen($orden) > 0) { - $az = 'asc'; - $za = 'desc'; - } else { - $az = $za = ''; - } + + if ($numRegistros) { + $this->backupURL(); + $this->datosURL['pag'] = $pagAnt; + $anterior = $this->montaURL(); + $this->datosURL['pag'] = $pagSigte; + $siguiente = $this->montaURL(); + $this->datosURL['pag'] = $pagFwd; + $fwd = $this->montaURL(); + $this->datosURL['pag'] = $pagRew; + $rew = $this->montaURL(); + $anterior = '\"anterior\"\n"; + $siguiente = '\"siguiente\"\n"; + $fwd = '\"mas4pags\"\n"; + $rew = '\"menos4pags\"\n"; + $this->restoreURL(); + $this->datosURL['sentido'] = "asc"; + $az = $this->montaURL(); + $az = 'asc'; + $this->datosURL['sentido'] = "desc"; + $za = $this->montaURL(); + $za = 'desc'; + $this->restoreURL(); if ($this->perfil['Informe']) { $informe = 'informe'; } else { $informe = ""; } + $this->restoreURL(); } if ($this->perfil['Alta']) { - $anadir = '' . + $this->datosURL['opc'] = 'nuevo'; + $anadir = '' . 'nuevo'; } else { $anadir = ""; @@ -209,39 +273,35 @@ class Mantenimiento { return $salida; } - private function enlaceBusqueda($pagina) { - //$salida = '

'; - //$salida .='

cadenaBusqueda . '" size="40" />'; - //$salida .= '
'; - //$salida.='

'; + private function enlaceBusqueda($pagina) + { + $valor = isset($this->cadenaBusqueda) ? 'value="' . $this->cadenaBusqueda . '"' : ''; $salida = '
- +
'; - //$salida .= '
'; $salida .= ''; -// $salida .= '
-//
-// Página 5 de 620% Complete -//
-//
'; return $salida; } - protected function borrar($id) { + protected function borrar() + { + //@todo hay que tener en cuenta aquí la cadena de búsqueda y la página en la url + $id = $this->datosURL['id']; $comando = "delete from " . $this->tabla . " where id=\"$id\""; if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } - header('Location: ' . $this->url); + $this->datosURL['opc'] = 'inicial'; + $this->datosURL['id'] = null; + $url = $this->montaURL(); + header('Location: ' . $url); return; } - protected function insertar() { + protected function insertar() + { $comando = "insert into " . $this->tabla . " ("; $lista = explode("&", $_POST['listacampos']); $primero = true; @@ -275,7 +335,7 @@ class Mantenimiento { if (empty($_POST[$campo])) { $valor = "0"; } - $valor = $_POST[$campo] == "on" ? '1' : $valor; + $valor = $_POST[$campo] == "on" ? '1' : $valor; } else { $valor = $_POST[$campo] == "" ? "null" : '"' . $_POST[$campo] . '"'; } @@ -285,19 +345,23 @@ class Mantenimiento { if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } - list($enlace, $resto) = explode("&", $this->url); - $enlace.="&opc=inicial"; - return "

Se ha insertado el registro con la clave " . $this->bdd->ultimoId() . "

"; + $this->datosURL['opc'] = 'inicial'; + $this->datosURL['id'] = null; + $cabecera = "refresh:".PAUSA.";url=".$this->montaURL(); + header($cabecera); + return $this->panelMensaje("Se ha insertado el registro con la clave " . $this->bdd->ultimoId(), "info", "Información"); + //return "

montaURL()."\">Se ha insertado el registro con la clave " . $this->bdd->ultimoId() . "

"; } - protected function modificar($id, $pag, $orden, $sentido) { + protected function modificar() + { //Los datos a utilizar para actualizar la tupla vienen en $_POST. //La lista de atributos de la tupla viene en el campo oculto listacampos //print_r($_GET); //echo "id=$id pag=$pag orden=$orden sentido=$sentido";die(); + //@todo hay que tener en cuenta aquí la página en la que se encuentra y la cadena de búsqueda $comando = "update " . $this->tabla . " set "; $lista = explode("&", $_POST['listacampos']); - //var_dump($lista); $primero = true; foreach ($lista as $campo) { if ($campo == "id" || $campo == "") @@ -323,20 +387,20 @@ class Mantenimiento { } } } - $comando.=" where id=\"$id\""; + $comando.=" where id=\"" . $this->datosURL['id'] . "\""; if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } - - list($enlace, $resto) = explode("&", $this->url); - $enlace.="&opc=inicial&orden=" . $orden . "&sentido=" . $sentido . "&id=" . $pag; - //echo $comando; - header('Location: ' . $enlace); + $this->datosURL['id'] = null; + $this->datosURL['opc'] = inicial; + header('Location: ' . $this->montaURL()); return; } - protected function muestra($id, $tipoAccion, $pag = "", $orden = "", $sentido = "") { - if (isset($id)) { + protected function muestra($tipoAccion) + { + $id = $this->datosURL['id']; + if ($tipoAccion != ANADIR) { $comando = "select * from " . $this->tabla . " where id='$id'"; $resultado = $this->bdd->ejecuta($comando); if (!$resultado) { @@ -346,29 +410,14 @@ class Mantenimiento { } else { $fila = null; } - //list($tipo,$valor)=explode($columna["Type"]); - $accion = "index.php?" . strtolower($this->tabla) . "&id=$id&opc="; - switch ($tipoAccion) { - case EDICION: - $accion.="modificar"; - $accion.=isset($pag) ? "&pag=$pag" : ''; - $accion.=isset($orden) ? "&orden=$orden" : ''; - $accion.=isset($sentido) ? "&sentido=$sentido" : ''; - break; - case BORRADO: - $accion.="borrar"; - break; - case ANADIR: - $accion.="insertar"; - break; - } //Genera un formulario con los datos de la tupla seleccionada. - return $this->formularioCampos($accion, $tipoAccion, $fila); + return $this->formularioCampos($tipoAccion, $fila); } //Función que genera un campo de lista con los valores de descripción de la //tabla a la cual pertenece la clave foránea. - protected function generaLista($datos, $campo, $valorInicial, $modo) { + protected function generaLista($datos, $campo, $valorInicial, $modo) + { $salida = " @@ -524,7 +587,6 @@ class Mantenimiento { } if ($tipoCampo == "Boolean(1)") { $checked = $valorDato == '1' ? 'checked' : ''; - //$salida .= '
'; $modocheck = $modoEfectivo == "readonly" ? 'onclick="javascript: return false;" readonly ' : ''; $salida .= ''; $salida .= '
'; @@ -543,21 +605,33 @@ class Mantenimiento { $salida .= '\n"; $salida .= "

"; $salida .= '

'; - $salida .= ''; + $this->datosURL['opc'] = 'inicial'; + $salida .= ''; $salida .= '  '; $salida .= '  '; $salida .= '
'; return $salida; } - protected function errorBD($comando, $mensaje = "") { - if (!$mensaje) { - return "

No pudo ejecutar correctamente el comando $comando error=" . $this->bdd->mensajeError() . "

"; + protected function errorBD($comando, $texto = "", $tipo = "danger", $cabecera = "¡Atención!") + { + if (!$texto) { + $texto = "No pudo ejecutar correctamente el comando $comando error=" . $this->bdd->mensajeError(); } else { - return "

$mensaje error=" . $this->bdd->mensajeError() . "

"; + $texto = "$texto error=" . $this->bdd->mensajeError(); } + return $this->panelMensaje($texto, "danger", $cabecera="¡Error!"); } - + + private function panelMensaje($info, $tipo = "danger", $cabecera = "¡Atención!") { + $mensaje = '
'; + $mensaje .= '

' . $cabecera . '

'; + $mensaje .= '
'; + $mensaje .= $info; + $mensaje .= '
'; + $mensaje .= '
'; + return $mensaje; + } } ?> \ No newline at end of file diff --git a/Sql.php b/Sql.php index 9ad1c03..65a1f14 100644 --- a/Sql.php +++ b/Sql.php @@ -152,6 +152,22 @@ class Sql { public function numeroTuplas() { return $this->numero; } + /** + * Devuelve el número de tuplas total si se ha hecho una consulta select + * con SELECT SQL_CALC_FOUND_ROWS * ... + * @return integer Número de tuplas. + */ + public function numeroTotalTuplas() + { + $comando = "select found_rows();"; + if (!$peticion=$this->bdd->query($comando)) { + $this->error=true; + $this->mensajeError='No pudo ejecutar la petición: '.$comando; + return false; + } + $numero = $peticion->fetch_row(); + return $numero[0] ; + } /** * Devuelve la condición de error de la última petición * @return boolean condición de error. diff --git a/inc/configuracion.inc b/inc/configuracion.inc index a24ddfd..ba527a2 100644 --- a/inc/configuracion.inc +++ b/inc/configuracion.inc @@ -25,7 +25,7 @@ define('SERVIDOR','localhost'); //Ubicación del servidor MySQL define('BASEDATOS','Inventario2'); //Nombre de la base de datos. define('USUARIO','test'); //Usuario con permisos de lectura/escritura en la base de datos define('CLAVE','tset'); //contraseña del usuario. -define('VERSION','1.02'); +define('VERSION','1.02b'); define('PROGRAMA','Gestión de Inventario.'); define('CENTRO','I.E.S.O. Pascual Serrano'); define('APLICACION',PROGRAMA.VERSION); diff --git a/xml/mantenimientoElementos.xml b/xml/mantenimientoElementos.xml index dac0075..d97ebd8 100644 --- a/xml/mantenimientoElementos.xml +++ b/xml/mantenimientoElementos.xml @@ -2,7 +2,7 @@ Mantenimiento de Elementos - SELECT E.id as id,U.Descripcion as ubicacion,A.Descripcion as articulo,A.Marca as marca,A.Modelo as modelo,E.numserie as numserie, + SELECT SQL_CALC_FOUND_ROWS E.id as id,U.Descripcion as ubicacion,A.Descripcion as articulo,A.Marca as marca,A.Modelo as modelo,E.numserie as numserie, DATE_FORMAT(E.fechacompra, '%d/%m/%Y') as fechaCompra,E.cantidad as cantidad FROM Elementos E inner join Articulos A on E.id_articulo=A.id inner join Ubicaciones U on E.id_ubicacion=U.id {buscar} {orden} limit {inferior},{superior}; diff --git a/xml/mantenimientoUsuarios.xml b/xml/mantenimientoUsuarios.xml index d2ab5bb..6d259a2 100644 --- a/xml/mantenimientoUsuarios.xml +++ b/xml/mantenimientoUsuarios.xml @@ -2,7 +2,7 @@ Mantenimiento de Usuarios - SELECT id, nombre, clave, idSesion, alta, modificacion, borrado, consulta, informe, usuarios, config + SELECT SQL_CALC_FOUND_ROWS id, nombre, clave, idSesion, alta, modificacion, borrado, consulta, informe, usuarios, config FROM Usuarios {buscar} {orden} limit {inferior}, {superior};