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

Página '.$pagSigte.'

'; $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); while($fila=$this->bdd->procesaResultado()) { $salida.=""; foreach ($fila as $clave => $valor) { if ($clave=="id") { $id=$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=","; } $comando.="$coma \"$_POST[$campo]\""; } $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; } /** * @todo Hay que hacer lo de las búsquedas automatizadas. Buscar el comment de buscar. * @todo Hay que hacer lo de las ordenaciones automatizadas. Buscar el comment de ordenable. */ 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'],"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;$icampos[$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; break; } } 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==BORRAR?"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 (!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); } //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