*
  • camposDependientes: Acción privada de Igep que sirve para recalcular las listas dependientes con el nuevo valor seleccionado. Nunca tiene que ser utilizado por los programadores.
  • *
  • abrirVentanaSeleccion: Acción privada de Igep que sirve para abrir una ventana de Selección. Nunca tiene que ser utilizado por los programadores.
  • *
  • buscarVentanaSeleccion: Acción privada de Igep que sirve para buscar en una ventana de Selección. Nunca tiene que ser utilizado por los programadores.
  • *
  • ordenarTabla: Acción privada de Igep que ordena los registros de una tabla por un campo y en un sentido.
  • * * * * @version $Id: IgepAccionesGenericas.php,v 1.26.2.1 2008-07-11 07:59:40 afelixf Exp $ * * @author David: * @author Keka: * @author Vero: * @author Raquel: * @author Toni: * * @package gvHIDRA */ class IgepAccionesGenericas extends Action{ /** * variable de error * * @var object obj_errorNegocio */ var $obj_errorNegocio; /** * La instancia de IgepComunicación para comunicarnos con la presentación * @access public * @var object $comunica */ var $comunica; /** * Variable que contendrá el posible mensaje a enviar al panel. Tiene que ser de la clase IgepMensaje * * @var object $obj_mensaje */ var $obj_mensaje; /** * Objeto que permite manejar/registrar el javascript de esta clase * @access private * @var object igepArbol */ var $obj_IgSmarty; /** * constructor. Generará a partir de los parámetros que se le pasen una conexión a al base de datos y un * array de manejadores de tablas (una por cada una de las que mantenga el panel hijo). */ function IgepAccionesGenericas(){ global $g_error; if(!isset($g_error)) $g_error = new IgepError(); $this->obj_errorNegocio = & $g_error; } /** * Método que se ejecuta tras el constructor y que permite seleccionar la acción a realizar. * En esta clase se encuentran las siguientes acciones genéricas: *
      * camposDependientes: recalcula listas dependientes y dispara acciones de interfaz. * abrirVentanaSeleccion: abre la ventana de Selección. * buscarVentanaSeleccion: realiza la busqueda en la ventana de Selección. *
    */ function perform($actionMapping, $actionForm) { //Recogemos la accion y le quitamos el prefijo que nos viene de la ventana $str_accion = $actionForm->get('action'); //Debug:Indicamos que entramos en Negocio y la accion a ejecutar IgepDebug::setDebug(5,'IgepAccionesGenericas: ejecutamos acción '.$str_accion); //creamos la instancia de IgepComunicacion $this->comunica = new IgepComunicacion(array(),'',array()); switch ($str_accion) { //Acción Genérica de Igep que lanzan automáticamente los plug-ins cuando se actualiza un campo que tiene otros campos dependientes. Tipicamente las listas. case 'gvHrefreshUI': $this->comunica->buildDataRefreshUI($actionForm); $resultado = $this->calcularCamposDependientes(); $actionForward = $actionMapping->get('IgepOperacionOculto'); break; //Acción Genérica de Igep que se lanza al pulsar al botón que lanza la ventana de selección (el botón de los 3 puntos). case 'abrirVentanaSeleccion': $this->comunica->construirArrayAbrirVentanaSeleccion($actionForm); $this->abrirVentanaSeleccion(); $actionForward = $actionMapping->get('IgepOperacionOculto'); break; //Acción Genérica de Igep que se lanza al pulsar al botón de búsqueda en la ventana de selección (la lupa). case 'buscarVentanaSeleccion': $this->comunica->construirArrayBuscarVentanaSeleccion($actionForm); $this->buscarVentanaSeleccion(); $actionForward = $actionMapping->get('IgepOperacionOculto'); break; case 'ordenarTabla': $this->comunica->construirArrayOrdenarTabla($actionForm); $datosOrdenacion = $this->comunica->dameDatos('ordenarTabla'); $objClase = & IgepSession::damePanel($datosOrdenacion['claseManejadora']); $objClase->regenerarInstancia(); //Recuperamos el tipo de la columna de ordenación $tipo = $objClase->v_descCamposPanel[$datosOrdenacion['columna']]['tipo']; $this->ordenarCursor($objClase->obj_ultimaConsulta,$datosOrdenacion['columna'],$tipo,$datosOrdenacion['orden']); //Si soy un Maestro if(isset($objClase->v_hijos)){ //Buscamos la fila seleccionada en su nueva posición $tuplaActual = $objClase->obj_ultimaConsulta[$objClase->int_filaActual]; foreach($objClase->obj_ultimaConsulta as $indice => $fila) { $iguales = true; foreach($fila as $campo => $valor){ if($valor!=$tuplaActual[$campo]){ $iguales = false; break; } } if ($iguales){ $objClase->int_filaActual = $indice; break; } } } $actionForward = $actionMapping->get('IgepOperacionOculto'); break; case 'IgepSaltoVentana': case 'IgepRegresoVentana': $nombreClase = $_REQUEST['claseManejadora']; $objClase = & IgepSession::damePanel($nombreClase); $objClase->regenerarInstancia(); //Creamos el objDatos $objClase->comunica = new IgepComunicacion($objClase->matching,$objClase->getDSN(),$objClase->v_descCamposPanel); $objClase->comunica->data2Arrays(); $comunicaUsuario = new IgepComunicaUsuario($objClase->comunica,$objClase->v_preInsercionDatos,$objClase->v_listas); //Obtenemos el objSalto if($str_accion == 'IgepSaltoVentana'){ $salto = new IgepSalto($nombreClase,$_REQUEST['idBotonSalto']); $resultadoSalto = $objClase->saltoDeVentana($comunicaUsuario, $salto); } else { $salto = IgepSession::damePanel('saltoIgep'); $salto->_setId($_REQUEST['idBotonSalto']); $resultadoSalto = $objClase->regresoAVentana($comunicaUsuario, $salto); } if($resultadoSalto==0){ //Guardamos datos del salto IgepSession::_guardaPanelIgep('saltoIgep',$salto); $actionForward = $actionMapping->get('IgepSaltoVentana'); //Si es una vuelta borramos el panel origen if($str_accion == 'IgepRegresoVentana') { IgepSession::borraPanel($nombreClase); $actionForward->put('IGEPaccionDestinoSalto',$salto->getDestinoVuelta()); } else $actionForward->put('IGEPaccionDestinoSalto',$salto->getDestinoIda()); } else{ $actionForward = new ActionForward('gvHidraValidationError'); $actionForward->put('IGEPclaseManejadora',$nombreClase); } break; case 'focusChanged': $this->comunica->construirArrayFocusChanged($actionForm); $this->focusChanged(); //Aqui tendremos dos opciones de return... de momento solo hay una //una para el error. No se recarga la página //otra para cuando todo ha ido bien. $actionForward = $actionMapping->get('IgepOperacionOculto'); break; case 'cambiarPanelDetalle': $nombreClaseMaestro = $_REQUEST['claseManejadora']; $nombreClaseDetalle = $_REQUEST['panelActivo']; $objClaseMaestro = & IgepSession::damePanel($nombreClaseMaestro); $objClaseMaestro->regenerarInstancia(); $objClaseMaestro->panelDetalleActivo = $nombreClaseDetalle; IgepSession::borraVariable($nombreClaseDetalle,'obj_ultimaConsulta'); $m_datos = $objClaseMaestro->getResultadoBusqueda(); $tupla[0] = $m_datos[$objClaseMaestro->int_filaActual]; $res = $objClaseMaestro->buildQueryDetails($tupla); $actionForward = $actionMapping->get('IgepOperacionOculto'); break; default: die('Error: La acción '.$str_accion.' no se reconoce.'); break; }//Fin switch return $actionForward; }// Fin de perform /*------------------------ METODOS DE LAS ACCIONES ------------------------*/ /** * Método encargado de realizar la recarga dinamica de las listas Dependientes. * @access private */ function calcularCamposDependientes(){ //Creamos un objeto para la gestión de javascript $this->obj_IgSmarty = new IgepSmarty(); //Recogemos los datos del comunicacion $datosCampoDependiente = $this->comunica->dameDatos('camposDependientes'); //Descomponemos el nombre del campo origen que nos viene con prefijos $descCampoOrigen = explode('___', $datosCampoDependiente['origen']); //El campo puede tener prefijo (cam__ , ins__) o no (si está en un panel de busqueda). Si tiene prefijo count(descCampoOrigen)>1 sino no if(count($descCampoOrigen)>1) $campoOrigen = $descCampoOrigen[1]; else $campoOrigen = $descCampoOrigen[0]; //Obtenemos los campos destino de la validación $destinos = explode(",",$datosCampoDependiente['destino']); //Creamos un array donde almacenaremos el nombre con prefijos y sufijos del campo destino foreach($destinos as $indice => $dest) $destinosAdaptados[$indice] = str_replace($campoOrigen,trim($dest),$datosCampoDependiente['origen']); if (IgepSession::existePanel($datosCampoDependiente['claseManejadora'])){ //Hacemos la nueva conexión. $objPanel = IgepSession::damePanel($datosCampoDependiente['claseManejadora']); $dsn = $objPanel->getDSN(); $objPanel->regenerarInstancia($dsn); $objPanel->comunica = new IgepComunicacion($objPanel->matching,$dsn,$objPanel->v_descCamposPanel); $objPanel->comunica->data2Arrays(); $objPanel->comunica->setOperacion('visibles'); $objPanel->comunica->posicionarEnTupla($datosCampoDependiente['registroActivo']); //Si actualizamos listas, tenemos que recorrer cada uno de ellas para obtener la forma en que se cargan. $this->obj_IgSmarty->addPreScript($objPanel->_recalcularListasDependientes($destinos,$destinosAdaptados)); //Ahora comprobamos si el campo origen tiene una validación. En este caso ejecutaremos la función de validación correspondiente $this->obj_IgSmarty->addPostScript($objPanel->_accionesInterfaz($campoOrigen,$datosCampoDependiente['origen'])); //Por el paso a PHP5 tenemos que eliminar la referencia del mensaje. $objPanel->obj_mensaje=null; $objPanel->limpiarInstancia(); unset($objPanel); } //Arreglamos los destinos IgepSession::guardaVariable('camposDependientes','formulario',$datosCampoDependiente['formulario']); IgepSession::guardaVariable('camposDependientes','origen',$datosCampoDependiente['origen']); IgepSession::guardaVariable('camposDependientes','obj_jsOculto',$this->obj_IgSmarty); return 0; } //Fin de calcularCamposDependientes /** * Método encargado de realizar las operaciones necesarias para la fase de apertura de una ventana de Selección * @access private */ function abrirVentanaSeleccion(){ $datosVentana = $this->comunica->dameDatos('abrirVentanaSeleccion'); $coleccionVentanas = IgepSession::dameVariable($datosVentana['claseManejadora'],'v_ventanasSeleccion'); if(isset($coleccionVentanas[$datosVentana['nomCampo']])){ $coleccionVentanas[$datosVentana['nomCampo']]->abrirVentanaSeleccion($datosVentana); //Para que tenga la dependencia antes de buscar al abrir $panel = IgepSession::damePanel('ventanaSeleccion'); $datosVentana['dependencia'] = $panel['dependencia']; $coleccionVentanas[$datosVentana['nomCampo']]->buscarVentanaSeleccion($datosVentana,$this->obj_errorNegocio); return 0; } else{ $panelVentanaSeleccion['mensaje'] = new IgepMensaje('IGEP-19',array($datosVentana['nomCampo'],$datosVentana['claseManejadora'])); IgepSession::_guardaPanelIgep('ventanaSeleccion',$panelVentanaSeleccion); return -1; } } /** * Método encargado de realizar las operaciones necesarias para la fase de busqueda de una ventana de Selección * @access private */ function buscarVentanaSeleccion(){ $datosVentana = $this->comunica->dameDatos('abrirVentanaSeleccion'); $coleccionVentanas = IgepSession::dameVariable($datosVentana['claseManejadora'],'v_ventanasSeleccion'); if(isset($coleccionVentanas[$datosVentana['nomCampo']])) $coleccionVentanas[$datosVentana['nomCampo']]->buscarVentanaSeleccion($datosVentana,$this->obj_errorNegocio); return 0; } function focusChanged(){ $m_datosFocusChanged = $this->comunica->dameDatos('focusChanged'); //Provisional $composicionCampos=$m_datosFocusChanged['tipoCampo'].'___'.'campo'.'___'.$m_datosFocusChanged['idPanel'].'_0'; $this->obj_IgSmarty = new IgepSmarty(); if (IgepSession::existePanel($m_datosFocusChanged['claseManejadora'])){ //Hacemos la nueva conexión. $objPanel = IgepSession::damePanel($m_datosFocusChanged['claseManejadora']); $dsn = $objPanel->getDSN(); $objPanel->regenerarInstancia($dsn); $objPanel->comunica = new IgepComunicacion($objPanel->matching,$dsn,$objPanel->v_descCamposPanel); $objPanel->comunica->setOperacion('postConsultar'); //Si es un tres modos o un dos modos if(isset($objPanel->obj_ultimaEdicion)) $objPanel->comunica->setArrayOperacion($objPanel->obj_ultimaEdicion); else $objPanel->comunica->setArrayOperacion($objPanel->obj_ultimaConsulta); $objPanel->comunica->posicionarEnTupla($m_datosFocusChanged['filaActual']); $jsGenerado = $objPanel->_focusChanged($composicionCampos,$m_datosFocusChanged['filaActual'],$m_datosFocusChanged['filaProxima']); $this->obj_IgSmarty->addPostScript($jsGenerado); unset($objPanel); } //Arreglamos los destinos IgepSession::guardaVariable('camposDependientes','formulario',$m_datosFocusChanged['nomForm']); IgepSession::guardaVariable('camposDependientes','obj_jsOculto',$this->obj_IgSmarty); } /** * Funcion que ordena cursores (vectores de registros) * por la clave que se indique por argumento y de forma * ascedente o descendente. * TODO: * Si no se define el tipo en v_descCampos, se puede intentar obtener el tipo * a partir del valor de la primera fila * Esta funcion solo se llama desde IgepAccionesGenericas donde no se * inicializa el dsn, luego de momento no se pueden obtener fechas ni numeros * si no se han declarado */ private function ordenarCursor(& $cursor, $clave, $tipo, $orden = 'asc') { if (count($cursor) < 2) return; //Inicializacion de variables $vectorClave = array (); $cursorOrdenado = array (); $es_numero = ($tipo==TIPO_DECIMAL OR $tipo==TIPO_ENTERO); $es_fecha = ($tipo==TIPO_FECHA OR $tipo==TIPO_FECHAHORA); if ($es_fecha or $es_numero) $tipoOrdenacion = SORT_NUMERIC; else $tipoOrdenacion = SORT_STRING; foreach ($cursor as $fila => $valor) { if ($es_fecha) $vectorClave[$fila] = ConfIgep::formatoFechaNegocio($valor[$clave]); elseif ($es_numero) $vectorClave[$fila] = ConfIgep::transformaNumero($valor[$clave]); else $vectorClave[$fila] = $valor[$clave]; } if (strtolower($orden) == 'asc') asort($vectorClave, $tipoOrdenacion); else arsort($vectorClave, $tipoOrdenacion); //Recorremos la matriz original asignado reset($vectorClave); foreach ($vectorClave as $fila => $valor) { $cursorOrdenado[] = $cursor[$fila]; } $cursor = $cursorOrdenado; } }//Fin clase IgepAccionesGenericas ?>