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.='backupURL(); $this->datosURL['opc'] = "editar"; $this->datosURL['id'] = $id;
+ $salida.=' ';
+ $this->restoreURL();
}
//Añade el icono de eliminar
if ($this->perfil['Borrado']) {
- $salida.=' backupURL(); $this->datosURL['opc'] = "eliminar"; $this->datosURL['id'] = $id;
+ $salida.=' ' . "\n";
+ $this->restoreURL();
}
}
$salida.=" ";
//Añade botones de comandos
- $enlace = ' \n";
- $siguiente = $enlace . $pagSigte . $sufijoEnlace . "\"> \n";
- $fwd = $enlace . $pagFwd . $sufijoEnlace . "\"> \n";
- $rew = $enlace . $pagRew . $sufijoEnlace . "\"> \n";
- if (strlen($orden) > 0) {
- $az = ' ';
- $za = ' ';
- } 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 = ' \n";
+ $siguiente = ' \n";
+ $fwd = ' \n";
+ $rew = ' \n";
+ $this->restoreURL();
+ $this->datosURL['sentido'] = "asc";
+ $az = $this->montaURL();
+ $az = ' ';
+ $this->datosURL['sentido'] = "desc";
+ $za = $this->montaURL();
+ $za = ' ';
+ $this->restoreURL();
if ($this->perfil['Informe']) {
$informe = ' ';
} else {
$informe = "";
}
+ $this->restoreURL();
}
if ($this->perfil['Alta']) {
- $anadir = '' .
+ $this->datosURL['opc'] = 'nuevo';
+ $anadir = ' ' .
' ';
} else {
$anadir = "";
@@ -209,39 +273,35 @@ class Mantenimiento {
return $salida;
}
- private function enlaceBusqueda($pagina) {
- //$salida = '';
- //$salida .='
';
- //$salida.='';
+ private function enlaceBusqueda($pagina)
+ {
+ $valor = isset($this->cadenaBusqueda) ? 'value="' . $this->cadenaBusqueda . '"' : '';
$salida = '';
- //$salida .= '';
$salida .= 'Página '
. $pagina . ' ';
-// $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 "";
+ $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 "";
}
- 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 = "\n";
list($tabla, $atributos) = explode(",", $datos);
$atributos = str_replace("/", ",", $atributos);
@@ -401,7 +450,8 @@ class Mantenimiento {
return $salida;
}
- private function obtenerCampos() {
+ private function obtenerCampos()
+ {
//Si hay un fichero de descripción xml lo utiliza.
$nombre = "xml/mantenimiento" . $this->tabla . ".xml";
if (file_exists($nombre)) {
@@ -420,11 +470,12 @@ class Mantenimiento {
$this->campos[$datos[$i]["Field"]]["Campo"] = $datos[$i]["Field"];
$this->campos[$datos[$i]["Field"]]["Editable"] = "si";
}
- $this->comandoConsulta = "select * from " . $this->tabla . " {buscar} {orden} limit {inferior},{superior}";
+ $this->comandoConsulta = "select SQL_CALC_FOUND_ROWS * from " . $this->tabla . " {buscar} {orden} limit {inferior},{superior}";
}
}
- private function cabeceraTabla() {
+ private function cabeceraTabla()
+ {
//$salida = '
';
$salida = '
';
foreach ($this->campos as $clave => $datos) {
@@ -444,7 +495,10 @@ class Mantenimiento {
$clave = str_ireplace("ubicacion", "Ubicación", $clave);
$clave = str_ireplace("articulo", "Artículo", $clave);
if ($ordenable) {
- $salida.="url&orden=" . strtolower($clave2) . "\"> " . ucfirst($clave) . " \n";
+ $this->backupURL();
+ $this->datosURL['orden'] = $clave2;
+ $salida.="montaURL() . "\"> " . ucfirst($clave) . " \n";
+ $this->restoreURL();
} else {
$salida.='' . ucfirst($clave) . ' ' . "\n";
}
@@ -456,14 +510,26 @@ class Mantenimiento {
/**
*
- * @param string $accion URL de la acción del POST
- * @param string $tipo ANADIR,EDITAR,BORRADO
+ * @param string $tipo ANADIR,EDICION,BORRADO
* @param array $datos Vector con los datos del registro
* @return array lista de campos y formulario de entrada
*/
- private function formularioCampos($accion, $tipo, $datos) {
+ private function formularioCampos($tipo, $datos)
+ {
$modo = $tipo == BORRADO ? "readonly" : "";
$nfechas = 0;
+ switch ($tipo) {
+ case ANADIR:
+ $this->datosURL['opc'] = "insertar"; $this->datosURL['id'] = null;
+ break;
+ case EDICION:
+ $this->datosURL['opc'] = "modificar";
+ break;
+ case BORRADO:
+ $this->datosURL['opc'] = "borrar";
+ break;
+ }
+ $accion = $this->montaURL();
$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};