* @author Keka: * @author Vero: * @author Raquel: * @author Toni: * @package gvHidra */ class IgepVentanaSeleccion{ /** * Array que contiene la definición de la ventana de selección * @access private */ var $v_defVentana; /** * String que contiene el nombre de la ventana de selección * @access private */ var $nombreVentana; /** * Constructor de la clase IgepVentanaSeleccion. Con él se define un objeto de la clase IgepVentanaSeleccion. * @access public * @param string $campoTpl Nombre de la ventana Seleccion. Será el identificador dentro del panel. * @param string $constanteConstruccion Cadena que identifica la fuente de datos de la ventana Selección. * @param array $camposRellenables Array que contiene los campos que se tienen que rellenar en la tpl al seleccionar un valor. * @param array $conexionAlternativa Array de conexión que permite asignarle a la ventana de Selección una conexión alternativa a la propia del panel. */ function IgepVentanaSeleccion($campoTpl,$constanteConstruccion,$camposRellenables,$conexionAlternativa=""){ $this->nombreVentana = $campoTpl; $datosVentana = $this->_procesarDefinicion($constanteConstruccion); if(isset($datosVentana['camposBusqueda'])) $this->v_defVentana['camposBusqueda'] = $datosVentana['camposBusqueda']; if(!is_array($camposRellenables)) die('Error en la introducción de los campos Rellenables de la ventana de Selección que actua sobre el campo TPL '.$campoTpl); $this->v_defVentana['camposRellenables'] = $camposRellenables; $posOrder = strpos(strtolower($datosVentana['consulta']),'order by'); if($posOrder===false){ $this->v_defVentana['consulta'] = $datosVentana['consulta']; //Si no hay order by cogemos el primer campo de la select $this->v_defVentana['orden'] = ' ORDER BY 1'; } else{ $this->v_defVentana['consulta'] = substr ($datosVentana['consulta'],0,$posOrder); $this->v_defVentana['orden'] = substr ($datosVentana['consulta'],$posOrder); } //Añadimos la conexión particular si la tiene $this->v_defVentana['conexion'] = $conexionAlternativa; $this->v_defVentana['queryMode'] = 3; }//Fin de constructor /** * Método que permite asigar dependencia en una ventana Selección. Es decir, si tenemos una ventana de Selección * cuyos valores dependen del valor de otros campos, necesitamos indicar con este método. * @access public * @param array $listaCamposTpl Array que contiene la lista de campos de la tpl de los cuales depende la ventana de Selección * @param array $listaCamposBd Array que, indexado en el mismo orden que el anterior, realiza la correspondencia de los campos del array anterior con los de la Base de Datos. * @param int $tipoDependencia integer indica si es una dependencia fuerte->0 o débil->1(si no tiene valor el campo dependiente lo ignora). */ function setDependencia($listasCamposTpl,$listasCamposBD, $tipoDependencia=0){ $dependencia = array(); if((!is_array($listasCamposTpl)) or (!is_array($listasCamposBD)) or (count($listasCamposTpl)!=count($listasCamposBD))) die('Error en la introducción de la dependencia de la ventana de Selección que actua sobre el campo TPL '.$this->nombreVentana.' . Recuerde que debe introducir dos listas (arrays).'); $i=0; if($tipoDependencia<0 OR $tipoDependencia>1) die('Error en la introducción de la dependencia de la ventana de Selección que actua sobre el campo TPL '.$this->nombreVentana.' . Recuerde el tipo de dependencia puede ser 0 o 1.'); for($i=0;$iv_defVentana['dependencia'] = $dependencia; $this->v_defVentana['tipoDependencia'] = $tipoDependencia; }//Fin de setDependencia /** * Cambia el modo de queryMode * @access public * @param int $modo integer indica si es una dependencia fuerte->0 o débil->1(si no tiene valor el campo dependiente lo ignora). */ function setQueryMode($modo){ $dependencia = array(); if (!is_numeric($modo) or intval($modo)!=$modo or $modo < 0 or $modo > 3) die('Error en la introducción del queryMode de la ventana de Selección que actua sobre el campo TPL '.$this->nombreVentana.' . Recuerde que debe introducir un entero entre 0 y 3.'); $this->v_defVentana['queryMode'] = $modo; } /** * Método que devuelve el nombre de la ventana Selección. * Sólo para uso interno de Negocio. * @access private * @return string */ function getNombreVentana(){ return $this->nombreVentana; }//Fin de getNombreVentana /** * Método que devuelve el array de definición de una ventana de selección * Sólo para uso interno de Negocio. * @access private * @return array */ function getDescripcionVentana(){ return $this->v_defVentana; }//Fin de getDescripcionVentana /** * Método privado que permite obtener la fuente de datos a partir de la cual se obtienen los datos de la * ventana de selección. * @acces private */ function _procesarDefinicion($constanteConstruccion){ $conf = ConfigFramework::getConfig(); $datosVentana = $conf->getDefVS($constanteConstruccion); if($datosVentana==-1){ die('Error: La consulta especificada para la ventana de selección no es valida. Se trata de la ventana de la Tpl '.$this->nombreVentana); } return $datosVentana; }//Fin de obtenerConsulta /** * Método que se utiliza desde IgepNegocio para atender a la acción que corresponde con el inicio de una ventana selección. * Esta acción es abrirVentanaSeleccion. * @acces private * @param array $datosVentanaSeleccion Es un array que contiene los datos de interfaz (nombre del campo, claseManejadora, ...) de dicha ventana selección. */ function abrirVentanaSeleccion(& $datosVentanaSeleccion){ //Debug:Indicamos que ejecutamos la consulta IgepDebug::setDebug(DEBUG_IGEP,'IgepVentanaSeleccion: Abriendo Ventana Selección '.$this->getNombreVentana()); //Esta función se encargará de pasar los parámetros necesarios a la ventana de selección //Vaciamos la anterior búsqueda IgepSession::borraPanel('ventanaSeleccion'); if(IgepSession::existePanel($datosVentanaSeleccion['claseManejadora'])){ //Creamos la dependencia si existe $ventanasSeleccionActivas = $this->getDescripcionVentana(); $dependencia = $ventanasSeleccionActivas['dependencia']; $tipoDependencia = $ventanasSeleccionActivas['tipoDependencia']; $str_dependencia = ''; if(isset($dependencia)) { foreach($dependencia as $campoTpl => $campoBD) { $nombreCampo = str_replace($datosVentanaSeleccion['nomCampo'],$campoTpl,$datosVentanaSeleccion['nombreCompleto']); if(($tipoDependencia==0)OR(!empty($_REQUEST[$nombreCampo]))){ if ($str_dependencia !='') $str_dependencia.= ' AND '; if(!empty($_REQUEST[$nombreCampo])) $str_dependencia.= $campoBD."= '".$_REQUEST[$nombreCampo]."' "; else $str_dependencia.= $campoBD." is null "; } } $panelVentanaSeleccion['dependencia'] = $str_dependencia; } //Guardamos en la SESSION los datos $panelVentanaSeleccion['nomForm'] = $datosVentanaSeleccion['nomForm']; $panelVentanaSeleccion['filaActual'] = $datosVentanaSeleccion['filaActual']; $panelVentanaSeleccion['panelActua'] = $datosVentanaSeleccion['panelActua']; $panelVentanaSeleccion['nomCampo'] = $datosVentanaSeleccion['nomCampo']; $panelVentanaSeleccion["claseManejadora"] = $datosVentanaSeleccion['claseManejadora']; $panelVentanaSeleccion["actionOrigen"] = $datosVentanaSeleccion['actionOrigen']; IgepSession::_guardaPanelIgep('ventanaSeleccion',$panelVentanaSeleccion); } return 0; }//function abrirVentanaSeleccion /** * Método que se utiliza desde IgepNegocio para atender a la acción que corresponde con la búsqueda en una Ventana Selección. * Esta acción es buscarVentanaSeleccion. * @acces private * @param array $datosVentanaSeleccion Es un array que contiene los datos de interfaz de la ventana de selección. * @param IgepError $obj_errorNegocio Referencia a la variable de error de Negocio para poder notificar cualquier tipo de error. */ function buscarVentanaSeleccion(& $datosVentanaSeleccion,& $obj_errorNegocio){ //Debug:Indicamos que ejecutamos la consulta IgepDebug::setDebug(DEBUG_IGEP,'IgepVentanaSeleccion: Buscando en Ventana Selección '.$this->getNombreVentana()); if (IgepSession::existePanel($datosVentanaSeleccion['claseManejadora'])){ //Creamos la Select con los parámetros correspondientes. $defVentanaSeleccion = $this->getDescripcionVentana(); //Obtenemos el DSN sobre el que se quiere trabajar. //Puede ser particular o puede la que tiene el panel por defecto if($defVentanaSeleccion['conexion']=='') { $obj_conexion = IgepSession::dameVariable($datosVentanaSeleccion['claseManejadora'],'obj_conexion'); $dsn = $obj_conexion->getDsn(); } else $dsn = $defVentanaSeleccion['conexion']; //Para evitar la inyección de SQL $valor = strtolower($datosVentanaSeleccion["valor"]); $valor = str_replace('insert into ','',$valor); $valor = str_replace('delete ','',$valor); $valor = str_replace('update ','',$valor); $valor = str_replace('create ','',$valor); $valor = str_replace('alter ','',$valor); $valor = str_replace('drop ','',$valor); //Creamos la consulta //Construimos la parte de la búsqueda. $whereBusqueda = array(); if ($valor != '') { // TODO: el valor falta prepararlo, ya que con comilla simple falla $qm = $defVentanaSeleccion['queryMode']; $val_nolike = IgepDB::unDiacritic($dsn,"'$valor'"); if ($qm == 3 or $qm == 1) { $val_like = IgepDB::unDiacritic($dsn,"'%$valor%'"); $expr2 = ' like '.$val_like; } elseif ($qm == 0) $expr2 = '='.$val_nolike; elseif ($qm == 2) { if((strpos($valor,'%')===false) and (strpos($valor,'_')===false)) $expr2 = '='.$val_nolike; else $expr2 = ' like '.$val_nolike; } foreach ($defVentanaSeleccion['camposBusqueda'] as $campo) { $whereBusqueda[] =IgepDB::unDiacritic($dsn,"lower($campo)").$expr2; } $concatenacion = $this->_concatenarCamposSelect($defVentanaSeleccion['consulta']); if ($concatenacion != '') { $whereBusqueda[] = IgepDB::unDiacritic($dsn,"lower($concatenacion)").$expr2; } } $str_where_a = array(); if ($datosVentanaSeleccion['dependencia']!='') $str_where_a[] = $datosVentanaSeleccion['dependencia']; //Hacemos la nueva conexión y lanzamos la consulta. $nuevaConexion = new IgepConexion($dsn); //Componemos la Where y lanzamos la consulta (Importante: el límite se tiene que calcular depues de la conexion) if (count($whereBusqueda) > 0) $str_where_a[] = "(".implode(' OR ', $whereBusqueda).")"; $str_where = implode(' and ', $str_where_a); $posWhere = strpos(strtolower($defVentanaSeleccion['consulta']),'where'); if($posWhere===false) $consulta = $str_where!=''? ' WHERE '.$str_where : ''; else $consulta = $str_where!=''? ' AND ' .$str_where : ' '; // el limite no se pone correctamente para oracle cuando la select inicial tiene where // por lo que se pone un espacio al final para que no ponga where ya que la consulta // inicial si tiene where $limite = $nuevaConexion->construirLimite($consulta,50); $consulta = $defVentanaSeleccion['consulta'].$consulta.' '.$defVentanaSeleccion['orden'].' '.$limite; $resultado = $nuevaConexion->consultar($consulta); //Si hay error if($obj_errorNegocio->hayError()){ $obj_mensaje = new IgepMensaje('IGEP-15',array('La consulta pertenece al objeto IgepVentanaSeleccion '.$datosVentanaSeleccion['nomCampo'])); $panelVentanaSeleccion['mensaje'] = $obj_mensaje; $resultado =array(); } //Si el resultado es 0 elseif(count($resultado)==0){ $obj_mensaje = new IgepMensaje('IGEP-10'); $panelVentanaSeleccion['mensaje'] = $obj_mensaje; } //Si hay más de 50 tuplas de resultado elseif(count($resultado)==50){ $obj_mensaje = new IgepMensaje('IGEP-14',array('50')); $panelVentanaSeleccion['mensaje'] = $obj_mensaje; } //Devolvemos valores $panelVentanaSeleccion['nomForm'] = $datosVentanaSeleccion['nomForm']; $panelVentanaSeleccion['filaActual'] = $datosVentanaSeleccion['filaActual']; $panelVentanaSeleccion['panelActua'] = $datosVentanaSeleccion['panelActua']; $panelVentanaSeleccion['nomCampo'] = $datosVentanaSeleccion['nomCampo']; $panelVentanaSeleccion['resultado'] = $resultado; $panelVentanaSeleccion['claseManejadora'] = $datosVentanaSeleccion['claseManejadora']; $panelVentanaSeleccion['camposRellenables'] = $defVentanaSeleccion['camposRellenables']; $panelVentanaSeleccion['actionOrigen'] = $datosVentanaSeleccion['actionOrigen']; $panelVentanaSeleccion['dependencia'] = $datosVentanaSeleccion['dependencia']; IgepSession::_guardaPanelIgep('ventanaSeleccion',$panelVentanaSeleccion); } return 0; } //Fin de buscarVentanaSeleccion /** * Método privado que obtiene la lista de campos en la consulta concatenados y separados por un espacio. * Devuelve ese string preparado para añadir una condicion de filtro al where, o cadena vacia si no es * capaz de descifrar los elementos de la consulta. * * @acces private */ function _concatenarCamposSelect($consulta){ $patron = <<