.
*
*/
//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 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('{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;
//var_dump($this->campos);
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;
}
if ($this->campos[$clave]['Type'] == "Boolean(1)") {
$checked = $valor == '1' ? 'checked' : '';
$valor = ' ';
}
$salida.=" $valor \n";
}
//Añade el icono de editar
if ($this->perfil['Modificacion']) {
$salida.=' ';
}
//Añade el icono de eliminar
if ($this->perfil['Borrado']) {
$salida.=' ' . "\n";
}
}
$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 ($this->perfil['Informe']) {
$informe = ' ';
} else {
$informe = "";
}
}
if ($this->perfil['Alta']) {
$anadir = '' .
' ';
} else {
$anadir = "";
}
$salida.='' .
"$rew  $anterior  $az  $anadir  $informe  $za  $siguiente  $fwd
";
return $salida;
}
private function enlaceBusqueda($pagina) {
//$salida = '';
//$salida .='
';
//$salida.='';
$salida = '';
//$salida .= '';
$salida .= 'Página '
. $pagina . ' ';
// $salida .= '
//
// Página 5 de 620% Complete
//
//
';
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 = ",";
}
if ($this->campos[$campo]['Type'] == 'Boolean(1)') {
$valor = "";
if (empty($_POST[$campo])) {
$valor = "0";
}
$valor = $_POST[$campo] == "on" ? '1' : $valor;
} else {
$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 "";
}
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']);
//var_dump($lista);
$primero = true;
foreach ($lista as $campo) {
if ($campo == "id" || $campo == "")
continue;
if ($primero) {
$primero = false;
$coma = " ";
} else {
$coma = ",";
}
if ($this->campos[$campo]['Type'] == 'Boolean(1)') {
$valor = "";
if (empty($_POST[$campo])) {
$valor = "0";
}
$valor = $_POST[$campo] == "on" ? '1' : $valor;
$comando.=$coma . ' ' . $campo . '="' . $valor . '"';
} else {
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;
//echo $comando;
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";
list($tabla, $atributos) = explode(",", $datos);
$atributos = str_replace("/", ",", $atributos);
// Elimina las llaves
$atributos = substr($atributos, 1, -1);
$comando = "select id,$atributos from $tabla order by $atributos";
$resultado = $this->bdd->ejecuta($comando);
if (!$resultado) {
return $this->errorBD($comando);
}
$modoEfectivo = $modo == "readonly" ? "disabled" : "";
$primero = true;
while ($fila = $this->bdd->procesaResultado()) {
foreach ($fila as $clave => $valor) {
if ($clave == "id") {
if ($primero) {
$primero = false;
} else {
$salida = substr($salida, 0, -1);
$salida.="\n";
}
$seleccionado = $valor == $valorInicial ? " selected " : "";
$salida.='';
} else {
$salida.=$valor . "-";
}
}
}
$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 = '
';
$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];
}
}
$clave2 = $clave;
$clave = str_ireplace("descripcion", "Descripción", $clave);
$clave = str_ireplace("ubicacion", "Ubicación", $clave);
$clave = str_ireplace("articulo", "Artículo", $clave);
if ($ordenable) {
$salida.="url&orden=" . strtolower($clave2) . "\"> " . ucfirst($clave) . " \n";
} else {
$salida.='' . ucfirst($clave) . ' ' . "\n";
}
}
$salida.="Acción \n";
return $salida;
}
/**
*
* @param string $accion URL de la acción del POST
* @param string $tipo ANADIR,EDITAR,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) {
$modo = $tipo == BORRADO ? "readonly" : "";
$nfechas = 0;
$salida.='';
continue;
}
//Si no es una clave foránea añade un campo de texto normal
$salida.=' \n";
$salida.='';
} else {
$salida.=$this->generaLista($this->foraneas[$campo], $campo, $valorDato, $modoEfectivo);
$salida.="";
}
}
//genera un campo oculto con la lista de campos a modificar.
$salida .= ' \n";
$salida .= "";
$salida .= '
';
$salida .= 'url'" . '" class="btn btn-info">Volver ';
$salida .= ' Cancelar ';
$salida .= ' Aceptar ';
$salida .= ' ';
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() . " ";
}
}
}
?>