. * */ //Clase que se encargará de manejar los elementos del modelo de datos. define('EDICION', 'Edición'); define('BORRADO', 'Borrado'); define('ANADIR', 'Inserción'); class Mantenimiento { private $descripcion; protected $bdd; protected $url; protected $cabecera; protected $tabla; protected $cadenaBusqueda; protected $campos = array(); protected $foraneas = array(); protected $campoBusca = "Descripcion"; protected $comandoConsulta = ""; protected $perfil; public function __construct($baseDatos, $perfil, $nombre) { $this->bdd = $baseDatos; $this->url = "index.php?$nombre&opc=inicial"; $this->cabecera = 'Location: ' . $this->url; $this->tabla = ucfirst($nombre); $this->perfil = $perfil; } 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']; $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); 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.'; } } 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($pagina, $orden, $sentido) { //Calcula los números de página anterior y siguiente. $pagina = $pagina + 0; $pagSigte = $pagina <= 0 ? 1 : $pagina + 1; $pagAnt = $pagSigte - 2; $pagFwd = $pagSigte + 3; $pagRew = $pagAnt - 3 < 0 ? $pagAnt : $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; 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); } //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); } //Introduce un botón para hacer búsquedas $salida = $this->enlaceBusqueda(); //Esta orden de centrado se cierra en el pie de la tabla $salida.='

Página ' . $pagSigte . '

'; $salida.= $cabecera; //Consulta paginada de todas las tuplas $comando = str_replace('{inferior}', ($pagAnt + 1) * NUMFILAS, $comando); $comando = str_replace('{superior}', NUMFILAS, $comando); //$salida.=$comando; $tabla = strtolower($this->tabla); $this->bdd->ejecuta($comando); 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); } else { $salida = "

No hay registros


"; } } //$salida.=print_r($this->perfil); //$salida.=$comando; while ($fila = $this->bdd->procesaResultado()) { $salida.=''; foreach ($fila as $clave => $valor) { if ($clave == "id") { $id = $valor; } // Comprueba si tiene que añadir el enlace de inventario if (strstr($this->campos[$clave]['Comment'], "link")) { $comen = explode(",", $this->campos[$clave]['Comment']); foreach ($comen as $co) { if (strstr($co, "link")) { $tmpco = explode("/", $co); $datoEnlace = $tmpco[1]; } } $this->campoBusca = $dato[1]; $valor = '' . $valor; } $salida.="$valor\n"; } //Añade el icono de editar if ($this->perfil['Modificacion']) { $salida.='editar'; } //Añade el icono de eliminar if ($this->perfil['Borrado']) { $salida.='  eliminar' . "\n"; } } $salida.="

"; //Añade botones de comandos $enlace = '\"anterior\"\n"; $siguiente = $enlace . $pagSigte . $sufijoEnlace . "\">\"siguiente\"\n"; $fwd = $enlace . $pagFwd . $sufijoEnlace . "\">\"siguiente\"\n"; $rew = $enlace . $pagRew . $sufijoEnlace . "\">\"siguiente\"\n"; if (strlen($orden) > 0) { $az = 'asc'; $za = 'desc'; } else { $az = $za = ''; } if ($this->perfil['Informe']) { $informe = 'informe'; } else { $informe = ""; } } if ($this->perfil['Alta']) { $anadir = '' . 'nuevo'; } else { $anadir = ""; } $salida.='

' . "$rew  $anterior  $az  $anadir  $informe  $za  $siguiente  $fwd

"; return $salida; } private function enlaceBusqueda() { $salida = '

'; $salida.='

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

'; return $salida; } protected function borrar($id) { $comando = "delete from " . $this->tabla . " where id=\"$id\""; if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } header('Location: ' . $this->url); return; } protected function insertar() { $comando = "insert into " . $this->tabla . " ("; $lista = explode("&", $_POST['listacampos']); $primero = true; //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 = ","; } $valor = $_POST[$campo] == "" ? "null" : '"' . $_POST[$campo] . '"'; $comando.="$coma " . $valor; } $comando.=")"; 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() . "

"; } protected function modificar($id, $pag, $orden, $sentido) { //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(); $comando = "update " . $this->tabla . " set "; $lista = explode("&", $_POST['listacampos']); $primero = true; foreach ($lista as $campo) { if ($campo == "id" || $campo == "") continue; if ($primero) { $primero = false; $coma = " "; } else $coma = ","; if (strlen(trim($_POST[$campo])) == 0) $comando.="$coma $campo=null"; else $comando.=$coma . ' ' . $campo . '="' . $_POST[$campo] . '"'; } $comando.=" where id=\"$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; header('Location: ' . $enlace); return; } protected function muestra($id, $tipoAccion, $pag = "", $orden = "", $sentido = "") { if (isset($id)) { $comando = "select * from " . $this->tabla . " where id='$id'"; $resultado = $this->bdd->ejecuta($comando); if (!$resultado) { return $this->errorBD("", "No se han podido encontrar datos del identificador $id"); } $fila = $this->bdd->procesaResultado(); } 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); } //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) { $salida = "\n

"; return $salida; } private function obtenerCampos() { //Si hay un fichero de descripción xml lo utiliza. $nombre = "xml/mantenimiento" . $this->tabla . ".xml"; if (file_exists($nombre)) { $def = simplexml_load_file($nombre); foreach ($def->Campos->Col as $columna) { $this->campos[(string) $columna['Nombre']] = array("Field" => (string) $columna['Titulo'], "Comment" => (string) $columna['Varios'], "Type" => (string) $columna['Tipo'] . "(" . $columna['Ancho'] . ")", "Editable" => (string) $columna['Editable'], "Campo" => (string) $columna['Campo']); } $this->comandoConsulta = $def->Consulta; } else { //Toma los datos de la tabla. $datos = $this->bdd->estructura($this->tabla); for ($i = 0; $i < count($datos); $i++) { $this->campos[$datos[$i]["Field"]][] = $datos[$i]; $this->campos[$datos[$i]["Field"]] = $this->campos[$datos[$i]["Field"]][0]; $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}"; } } private function cabeceraTabla() { $salida = '

'; foreach ($this->campos as $clave => $datos) { $comen = explode(",", $datos["Comment"]); $ordenable = false; foreach ($comen as $co) { if (strstr($co, "ordenable")) { $ordenable = true; } if (strstr($co, "buscable")) { $dato = explode("/", $co); $this->campoBusca = $dato[1]; } } if ($ordenable) { $salida.="\n"; } else { $salida.='' . "\n"; } } $salida.="\n"; return $salida; } /** * * @param string $accion URL de la acción del POST * @param string $tipo ANADIR,EDITAR,BORRAR * @param array $datos Vector con los datos del registro * @return array lista de campos y formulario de entrada */ private function formularioCampos($accion, $tipo, $datos) { $modo = $tipo == BORRADO ? "readonly" : ""; $salida.='' . "\n"; $salida.="

$tipo\n"; foreach ($this->campos as $clave => $valor) { if ($valor["Editable"] == "no") { //Se salta los campos que no deben aparecer continue; } $campo = $valor['Campo']; $salida.=" "; //Se asegura que el id no se pueda modificar. $modoEfectivo = $clave == 'id' ? "readonly" : $modo; $valorDato = $datos == null ? "" : $datos[$campo]; if ($clave == 'id' && $tipo == ANADIR) { $valorDato = null; } if (!isset($this->foraneas[$valor['Campo']])) { $tipoCampo = $valor['Type']; //Si es un campo fecha u hora y está insertando pone la fecha actual o la hora actual if ($tipo == ANADIR) { if (stripos($tipoCampo, "echa") || stripos($tipoCampo, "ate")) { $valorDato = strftime("%Y/%m/%d"); } } // Calcula el tamaño if (stripos($tipoCampo, "echa") || stripos($tipoCampo, "ate")) { $tamano = "19"; } else { list($resto, $tamano) = explode("(", $tipoCampo); $tamano = substr($tamano, 0, -1); } if ($tipoCampo == "Password") $tipo_campo = "password"; else $tipo_campo = "text"; //Si no es una clave foránea añade un campo de texto normal $salida.='

\n"; } else { $salida.=$this->generaLista($this->foraneas[$campo], $campo, $valorDato, $modoEfectivo); } //Genera una lista con los campos que intervienen en el formulario. $campos.="$campo&"; } //genera un campo oculto con la lista de campos a modificar. $salida.='\n"; $salida.="

"; $salida.="  
\n"; return $salida; } protected function errorBD($comando, $mensaje = "") { if (!$mensaje) { return "

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

"; } else { return "

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

"; } } } ?>
url&orden=" . strtolower($clave) . "\"> $clave ' . $clave . 'Acción