* @author Keka: * @author Vero: * @author Raquel: * @author Toni: * @package igep */ 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); $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']; //El order by lo montamos a partir de los campos de Busqueda if(count($datosVentana['camposBusqueda'])>0){ $orderBy = ''; foreach($datosVentana['camposBusqueda'] as $campo) $orderBy.=$campo.','; $this->v_defVentana['orden'] = 'ORDER BY '.substr($orderBy,0,-1); } else $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; }//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. */ function setDependencia($listasCamposTpl,$listasCamposBD){ $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; for($i=0;$iv_defVentana['dependencia'] = $dependencia; }//Fin de setDependencia /** * 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){ $datosVentana = ConfIgep::obtenerDefVentanaGeneral($constanteConstruccion); if($datosVentana==-1){ if(function_exists('obtenerDefVentana')) $datosVentana = obtenerDefVentana($constanteConstruccion); else 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']; $str_dependencia = ''; if(isset($dependencia)) { foreach($dependencia as $campoTpl => $campoBD) { $nombreCampo = str_replace($datosVentanaSeleccion['nomCampo'],$campoTpl,$datosVentanaSeleccion['nombreCompleto']); if ($str_dependencia !='') $str_dependencia.= ' AND '; $str_dependencia.= $campoBD."= '".$_REQUEST[$nombreCampo]."' "; } $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(); //Creamos la consulta //Construimos la parte de la búsqueda. $whereBusqueda = ''; //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); foreach ($defVentanaSeleccion['camposBusqueda'] as $campo){ if ($whereBusqueda != '') $whereBusqueda.= ' OR '; $whereBusqueda.=" lower($campo) like '%".$valor."%' "; } if($datosVentanaSeleccion['dependencia']!='') $str_dependencia = ' AND '.$datosVentanaSeleccion['dependencia']; //Hacemos la nueva conexión y lanzamos la consulta. //Esta conexión 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']; $nuevaConexion = new IgepConexion($dsn); //Componemos la Where y lanzamos la consulta (Importante: el límite se tiene que calcular depues de la conexion) $str_where = " ($whereBusqueda)".$str_dependencia; $limite = $nuevaConexion->construirLimite($str_where,50); $posWhere = strpos(strtolower($defVentanaSeleccion['consulta']),'where'); if($posWhere===false) $consulta=$defVentanaSeleccion['consulta'].' WHERE '.$str_where.' '.$defVentanaSeleccion['orden'].' '.$limite; else $consulta=$defVentanaSeleccion['consulta'].' AND '.$str_where.' '.$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']; IgepSession::_guardaPanelIgep('ventanaSeleccion',$panelVentanaSeleccion); } return 0; } //Fin de buscarVentanaSeleccion }//Fin IgepVentanaSeleccion ?>