diff --git a/CHANGELOG b/CHANGELOG index a42d6a6..fb94ad0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +Versión 1.15 29-06-2014 +-Crear la opción de clonar registro en Mantenimiento. +-Crear iconos de clonado en todos los estilos. +-Corregido determinaAccion en Imagen para aceptar el clonado +-Corregido codificación/decodificación de la cadena de búsqueda en la URL + Versión 1.14.1 02-06-2014 -Añadidos enlaces a manual y a aplicación de ejemplo en readme.md -Arreglado que los créditos salgan centrados en lugar de alineados a la derecha diff --git a/Imagen.php b/Imagen.php index fa268b9..1b18ffb 100644 --- a/Imagen.php +++ b/Imagen.php @@ -29,6 +29,7 @@ class Imagen { public $archivoComprimido; private $extension; private $dirData; + public $archivoCopiado; public function __construct() { @@ -39,7 +40,7 @@ class Imagen { { if (isset($_POST[$campo]) && $_POST[$campo] == "") { return HAYQUEBORRAR; //Hay que borrar el archivo de imagen - } elseif ($_FILES[$campo]['error'] == 0) { + } elseif (isset($_FILES[$campo]['error']) && $_FILES[$campo]['error'] == 0) { return HAYQUEGRABAR; //Hay que guardar el archivo de imagen enviado } else { return NOHACERNADA; //No hay que hacer nada @@ -111,6 +112,18 @@ class Imagen { } } } + public function copiaImagenId($valorImagen, $tabla, $id, &$mensaje) + { + $extension = strrchr($valorImagen, "."); + $nombre = $this->dirData . "/" . $tabla . "_" . $id . $extension; + if (!@copy($valorImagen, $nombre)) { + $errors= error_get_last(); + $mensaje = "No pudo copiar el archivo " . $valorImagen . " en " . $nombre . " Error = [" . $errors['message'] . "]"; + return false; + } + $this->archivoCopiado = $nombre; + return true; + } public function mueveImagenId($tabla, $id, &$mensaje) { diff --git a/Mantenimiento.php b/Mantenimiento.php index ee20ba5..3335b82 100644 --- a/Mantenimiento.php +++ b/Mantenimiento.php @@ -23,6 +23,7 @@ define('EDICION', 'Edición'); define('BORRADO', 'Borrado'); define('ANADIR', 'Inserción'); +define('CLONAR', 'Clonar'); class Mantenimiento { @@ -91,7 +92,10 @@ class Mantenimiento { $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=$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; @@ -109,10 +113,15 @@ class Mantenimiento { 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; @@ -146,7 +155,7 @@ class Mantenimiento { $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($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); @@ -244,6 +253,18 @@ class Mantenimiento { } //Añade los botones de acciones $salida .= ''; + //Añade el icono de clonar + if ($this->perfil['Alta']) { + //$salida.='datosURL['id'] = $id; + if (ESTILO == 'bootstrap') { + $salida.='  '; + } else { + $salida.='clonar  '; + } + $this->restoreURL(); + } //Añade el icono de editar if ($this->perfil['Modificacion']) { //$salida.='montaURL()."'".'">'; + $anadir = ''; } else { $anadir = '' . 'nuevo'; @@ -412,7 +433,7 @@ class Mantenimiento { //procesa el envío de la imagen $imagen = new Imagen(); $accion = $imagen->determinaAccion($campo); - if ($accion != NOHACERNADA) { + if ($accion != NOHACERNADA) { // && $_POST['tipoOperacion'] != CLONAR) { $mensaje = ""; if (!$imagen->procesaEnvio($campo, $mensaje)) { return $this->panelMensaje($mensaje, "danger", "ERROR PROCESANDO IMAGEN"); @@ -420,7 +441,16 @@ class Mantenimiento { $hayImagen = true; $campoImagen = $campo; } else { - $valor = "null"; + //Comprobamos si hay clonación y hay imagen a clonar. + $valor = $_POST[$campo]; + 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]) . '"'; @@ -434,11 +464,22 @@ class Mantenimiento { } $id = $this->bdd->ultimoId(); if ($hayImagen) { + $mensaje = " "; //Tiene que recuperar el id del registro insertado y actualizar el archivo de imagen - if (!$imagen->mueveImagenId($this->tabla, $id, $mensaje)) { - return $this->panelMensaje($mensaje, "danger", "ERROR COMPRIMIENDO 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 . "='" . $imagen->archivoComprimido . "' where id='" . $id ."';"; + $comando = "update " . $this->tabla . " set " . $campoImagen . "='" . $archivoImagen . "' where id='" . $id ."';"; if (!$this->bdd->ejecuta($comando)) { return $this->errorBD($comando); } @@ -657,7 +698,7 @@ class Mantenimiento { /** * - * @param string $tipo ANADIR,EDICION,BORRADO + * @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 */ @@ -666,6 +707,7 @@ class Mantenimiento { $modo = $tipo == BORRADO ? "readonly" : ""; $nfechas = 0; switch ($tipo) { + case CLONAR: case ANADIR: $this->datosURL['opc'] = "insertar"; $this->datosURL['id'] = null; break; @@ -695,7 +737,7 @@ class Mantenimiento { //Se asegura que el id no se pueda modificar. $modoEfectivo = $clave == 'id' ? "readonly" : $modo; $valorDato = $datos == null ? "" : $datos[$campo]; - if ($clave == 'id' && $tipo == ANADIR) { + if ($clave == 'id' && ($tipo == ANADIR || $tipo == CLONAR)) { $valorDato = null; } if (!isset($this->foraneas[$valor['Campo']])) { @@ -744,6 +786,10 @@ class Mantenimiento { 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; } @@ -762,6 +808,8 @@ class Mantenimiento { } //genera un campo oculto con la lista de campos a modificar. $salida .= '\n"; + //genera un campo oculto con el tipo de operación asociado al formulario + $salida .= '\n"; $salida .= "

"; $salida .= '

'; $this->datosURL['opc'] = 'inicial'; diff --git a/README.md b/README.md index bb88173..0a4874e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,8 @@ Para instalar la aplicación basta con seguir estos pasos: ###2. Crear un directorio temporal y dar derechos de escritura a los ficheros de configuración. mkdir tmp - chown apache tmp + mkdir img.data + chown apache tmp img.data chown apache inc/configuracion.inc chown apache inc diff --git a/img/bluecurve/clonar.png b/img/bluecurve/clonar.png new file mode 100644 index 0000000..9569ec7 Binary files /dev/null and b/img/bluecurve/clonar.png differ diff --git a/img/clonar.png b/img/clonar.png new file mode 100644 index 0000000..6dfbe3a Binary files /dev/null and b/img/clonar.png differ diff --git a/img/cristal/clonar.png b/img/cristal/clonar.png new file mode 100644 index 0000000..1c05eab Binary files /dev/null and b/img/cristal/clonar.png differ diff --git a/img/personal/clonar.png b/img/personal/clonar.png new file mode 100644 index 0000000..ddaeffd Binary files /dev/null and b/img/personal/clonar.png differ diff --git a/inc/version.inc b/inc/version.inc index bdf28d8..3e1bff5 100644 --- a/inc/version.inc +++ b/inc/version.inc @@ -23,5 +23,5 @@ */ define('AUTOR', 'Ricardo Montañana Gómez'); -define('VERSION', '1.14.1'); +define('VERSION', '1.15'); ?> diff --git a/xml/inventarioArticuloEtiquetas.xml b/xml/inventarioArticuloEtiquetas.xml index 75a2f88..5a82a1a 100644 --- a/xml/inventarioArticuloEtiquetas.xml +++ b/xml/inventarioArticuloEtiquetas.xml @@ -3,7 +3,7 @@ - select A.id as id, A.Descripcion as articulo, A.Marca as marca, A.Modelo as modelo, E.id as idEl, U.id as idUbic,U.Descripcion as ubicacion,E.numserie as numserie, + select A.id as idArt, A.Descripcion as articulo, A.Marca as marca, A.Modelo as modelo, E.id as idEl, U.id as idUbic,U.Descripcion as ubicacion,E.numserie as numserie, E.fechaCompra as fechaCompra,E.Cantidad as cantidad, E.Cantidad as cantReal, 'N' as Baja from Elementos E, Articulos A, Ubicaciones U where A.id=E.id_Articulo and U.id=E.id_Ubicacion and A.id='{id}' order by U.Descripcion,numserie;