.
*
*/
//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="
";
}
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";
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.='