.
*/
//Clase que se encargará de manejar los elementos del modelo de datos.
define('EDICION', 'Edición');
define('BORRADO', 'Borrado');
define('ANADIR', 'Inserción');
define('CLONAR', 'Clonar');
class Mantenimiento
{
private $descripcion;
protected $bdd;
protected $url;
protected $tabla;
protected $cadenaBusqueda;
protected $campos = [];
protected $foraneas = [];
protected $campoBusca = 'Descripcion';
protected $comandoConsulta = '';
protected $perfil;
protected $datosURL = [];
protected $datosURLb = []; //para hacer una copia
public function __construct($baseDatos, $perfil, $nombre)
{
$this->bdd = $baseDatos;
$this->url = "index.php?$nombre";
//$this->datosURL['']
$this->tabla = ucfirst($nombre);
$this->perfil = $perfil;
$this->cargaDatosURL();
}
/**
* 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;
//$buscar = isset($this->cadenaBusqueda) ? "&buscar='$this->cadenaBusqueda'" : null;
//$buscar = isset($this->cadenaBusqueda) ? "&buscar=$this->cadenaBusqueda" : null;
$buscar = isset($this->cadenaBusqueda) ? '&buscar='.urlencode($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 ($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();
case 'borrar':return $this->borrar();
case 'clonar': return $this->muestra(CLONAR);
default: return 'La clase Mantenimiento No entiende lo solicitado ['.$this->datosURL['opc'].']';
}
}
private function clonar()
{
}
protected function obtieneClavesForaneas()
{
$salida = null;
foreach ($this->campos as $clave => $valor) {
$trozos = explode(',', $valor['Comment']);
foreach ($trozos as $trozo) {
if (strstr($trozo, 'foreign')) {
$temp = substr($trozo, 8, -1);
list($tabla, $atributos) = explode('->', $temp);
list($clave, $resto) = explode(';', $atributos);
//Quita el paréntesis final
$atributos = substr($atributos, 0, -1);
$salida[$valor['Campo']] = $tabla.','.$resto;
}
}
}
$this->foraneas = $salida;
}
private function consulta()
{
$orden = $this->datosURL['orden'];
$sentido = $this->datosURL['sentido'];
//Calcula los números de página anterior y siguiente.
$pagina = $this->datosURL['pag'];
$pagSigte = $pagina <= 0 ? 1 : $pagina + 1;
$pagAnt = $pagSigte - 2 < 0 ? 0 : $pagSigte - 2;
$pagFwd = $pagSigte + 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 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(urldecode($this->cadenaBusqueda))."%'";
$comando = str_replace('{buscar}', $sufijo, $this->comandoConsulta);
} else {
$comando = str_replace('{buscar}', '', $this->comandoConsulta);
}
//Trata con el orden de mostrar los datos
if (strlen($orden) > 0) {
$comando = str_replace('{orden}', 'order by '.$orden.' '.$sentido, $comando);
$sufijoOrden = '&orden='.$orden.'&sentido='.$sentido;
} else {
$comando = str_replace('{orden}', ' ', $comando);
}
$salida = $this->cargaComplementos();
//Introduce un botón para hacer búsquedas y el número de la página
$salida .= $this->enlaceBusqueda($pagSigte);
//Consulta paginada de todas las tuplas
$comando = str_replace('{inferior}', $pagina * NUMFILAS, $comando);
$comando = str_replace('{superior}', NUMFILAS, $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 final
$this->datosURL['pag'] = $totalPags;
header('Location: '.$this->montaURL());
} else {
$salida .= '
'. "$rew  $anterior  $az  $anadir  $informe  $za  $siguiente  $fwd
"; return $salida; } private function enlaceBusqueda($pagina) { $valor = isset($this->cadenaBusqueda) ? 'value="'.$this->cadenaBusqueda.'"' : ''; $salida = ''; $salida .= ''; return $salida; } 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); } $this->datosURL['opc'] = 'inicial'; $this->datosURL['id'] = null; //Comprueba si existe la imagen en datos para borrarla. Imagen::borraImagenId($this->tabla, $id); $url = $this->montaURL(); header('Location: '.$url); } protected function insertar() { $comando = 'insert into '.$this->tabla.' ('; $lista = explode('&', $_POST['listacampos']); $primero = true; $hayImagen = false; //Añade la lista de campos foreach ($lista as $campo) { if ($campo == '') { continue; } if ($primero) { $primero = false; $coma = ' '; } else { $coma = ','; } $comando .= "$coma $campo"; } $comando .= ') values ('; //Añade la lista de valores $primero = true; foreach ($lista as $campo) { if ($campo == '') { continue; } if ($primero) { $primero = false; $coma = ' '; } else { $coma = ','; } if (isset($this->campos[$campo]['Type']) && $this->campos[$campo]['Type'] == 'Boolean(1)') { $valor = ''; if (empty($_POST[$campo])) { $valor = '0'; } $valor = $_POST[$campo] == 'on' ? '1' : $valor; } else { if (isset($this->campos[$campo]['Comment']) && stristr($this->campos[$campo]['Comment'], 'imagen')) { //procesa el envío de la imagen $imagen = new Imagen(); $accion = $imagen->determinaAccion($campo); if ($accion != NOHACERNADA) { // && $_POST['tipoOperacion'] != CLONAR) { $mensaje = ''; if (!$imagen->procesaEnvio($campo, $mensaje)) { return $this->panelMensaje($mensaje, 'danger', 'ERROR PROCESANDO IMAGEN'); } $hayImagen = true; $campoImagen = $campo; } else { //Comprobamos si hay clonación y hay imagen a clonar. if (isset($_POST[$campo])) { $valor = $_POST[$campo]; } else { $valor = ''; } if ($_POST['tipoOperacion'] == CLONAR && file_exists($valor)) { $hayImagen = true; $campoImagen = $campo; $valorImagen = $valor; $valor = 'null'; } else { $valor = 'null'; } } } else { $valor = $_POST[$campo] == '' ? 'null' : '"'.$this->bdd->filtra($_POST[$campo]).'"'; } } $comando .= "$coma ".$valor; } $comando .= ')'; if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } $id = $this->bdd->ultimoId(); if ($hayImagen) { $mensaje = ' '; //Tiene que recuperar el id del registro insertado y actualizar el archivo de imagen if ($_POST['tipoOperacion'] == CLONAR) { //Tiene que copiar el archivo original. if (!$imagen->copiaImagenId($valorImagen, $this->tabla, $id, $mensaje)) { return $this->panelMensaje($mensaje, 'danger', 'ERROR COPIANDO IMAGEN'); } $archivoImagen = $imagen->archivoCopiado; } else { //Crea el archivo de imagen if (!$imagen->mueveImagenId($this->tabla, $id, $mensaje)) { return $this->panelMensaje($mensaje, 'danger', 'ERROR COMPRIMIENDO IMAGEN'); } $archivoImagen = $imagen->archivoComprimido; } $comando = 'update '.$this->tabla.' set '.$campoImagen."='".$archivoImagen."' where id='".$id."';"; if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } } $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 '.$id, 'info', 'Información'); //return "montaURL().'"> '.$datos['Titulo'].$resFlecha." | \n"; //$salida.="montaURL() . "\"> " . ucfirst($clave) . $resFlecha . " | \n"; $this->restoreURL(); } else { $salida .= ''.$datos['Titulo'].' | '."\n"; //$salida.='' . ucfirst($clave) . ' | ' . "\n"; } } $salida .= "Acción | \n"; return $salida; } /** * @param string $tipo ANADIR,EDICION,BORRADO,CLONAR * @param array $datos Vector con los datos del registro * * @return array lista de campos y formulario de entrada */ private function formularioCampos($tipo, $datos) { $modo = $tipo == BORRADO ? 'readonly' : ''; $nfechas = 0; switch ($tipo) { case CLONAR: 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 = ''; continue; } if (stristr($this->campos[$campo]['Comment'], 'imagen')) { /*if ($tipo == CLONAR) { // De momento no deja clonar las imágenes $valorDato = null; }*/ $salida .= $this->creaCampoImagen($campo, $valorDato, $tipo); continue; } if (stristr($this->campos[$campo]['Type'], 'int')) { $tipo_campo = 'number'; $modoEfectivo .= ' onkeypress = "if ( isNaN(this.value + String.fromCharCode(event.keyCode) )) return false;" '; } //Si no es una clave foránea añade un campo de texto normal $salida .= '
---|