*
  • 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.74 2011-01-13 13:21:53 vnavarro Exp $ * * @author David: * @author Vero: * @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). */ public function __construct() { global $g_error; if(!isset($g_error)) $g_error = new IgepError(); $this->obj_errorNegocio = & $g_error; } public 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. *
    */ public 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()); switch ($str_accion) { case 'gvHautocomplete': //Recogemos los valores $field = $_GET['field']; $value = ($_GET['term']); $claseManejadora = $_GET['claseManejadora']; $objClase = & IgepSession::damePanel($claseManejadora); $objClase->regenerarInstancia(); $resultado = null; //Primero delegamos en el programador $resultado = $objClase->setAutocomplete($field,$value); //Si no tiene programado nada, miramos si tiene matching if($resultado==null) { if(isset($objClase->matching[$field])) { $campoBD = $objClase->matching[$field]['campo']; $tablaBD = $objClase->matching[$field]['tabla']; $query = 'SELECT '.$campoBD.' as "autocomplete" FROM '.$tablaBD.' WHERE upper('.$campoBD.") like '%".strtoupper($value)."%' ORDER BY 1"; $res = $objClase->consultar($query); $resultado = array(); if($res!=-1 and is_array($res)) { foreach($res as $row) $resultado[] = gvHidraUTF8::toUTF8($row['autocomplete']); } } } $objClase->limpiarInstancia(); $json = json_encode($resultado); print $json; die; break; //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 'gvhJSRefreshUI': $this->listasDependientesJs = ''; $this->accionesInterfazJs = ''; $this->comunica->buildDataRefreshUI($actionForm); $resultado = $this->calcularCamposDependientes(); //$this->listasDependientesJs //$this->accionesInterfazJs ob_clean(); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-type: text/javascript;"); //$actionForward = $objDatos->getForward('IgepOperacionJS'); echo $this->listasDependientesJs; echo $this->accionesInterfazJs; ob_flush(); die; break; case 'gvHchangeLanguage': //Cambiamos el idioma $conf = ConfigFramework::getConfig(); $lang = $_REQUEST['lang']; $lang = str_replace("'", "''", $lang); $conf->setLanguage($lang); //Se debe cargar de nuvo el AppMainWindow $principal = new AppMainWindow(); IgepSession::_guardaPanelIgep('principal',$principal); $actionForward = $actionMapping->get('gvHidraSuccess'); 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); $actionForward = $this->abrirVentanaSeleccion($actionMapping); 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('IgepVentanaSeleccion'); //$actionForward = $actionMapping->get('IgepVentanaSeleccion'); 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']; //Recogemos los datos a ordenar $cursor = $objClase->getResultForSearch(); $this->ordenarCursor($cursor,$datosOrdenacion['columna'],$tipo,$datosOrdenacion['orden']); $objClase->setResultForSearch($cursor); $objClase->limpiarInstancia(); ob_clean(); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-type: text/javascript"); $params = array ( 'path'=> '', 'context' => array( 'targetType' =>'self', 'action' =>'reload' ) ); $response = json_encode($params, JSON_FORCE_OBJECT); echo $response; ob_flush(); die; break; case 'IgepSaltoVentana': case 'IgepRegresoVentana': $nombreClase = $_REQUEST['claseManejadora']; $nomForm = $_REQUEST['formActua']; $idBtnCompleto = $_REQUEST['idBtn']; $objClase = & IgepSession::damePanel($nombreClase);//TODO: Quitar & $objClase->regenerarInstancia(); //Creamos el objDatos $objClase->comunica = new IgepComunicacion($objClase->v_descCamposPanel); $objClase->comunica->data2Arrays(); $objClase->comunica->setPanel($_REQUEST['gvhpanel']); $comunicaUsuario = new IgepComunicaUsuario($objClase->comunica, $objClase->v_preInsercionDatos, $objClase->v_listas); //Validamos los campos antes de saltar $checkForm = $objClase->comunica->getCheckForm(); if ($checkForm!=0) { $validacionIgep = $objClase->comunica->checkDataTypes(); if ($validacionIgep!= '0') { $objClase->showMessage('IGEP-17',array($validacionIgep)); $actionForward = new ActionForward('gvHidraNoAction'); $actionForward->put('IGEPclaseManejadora',$nombreClase); return $actionForward; } } //Obtenemos el objSalto if($str_accion == 'IgepSaltoVentana') { $salto = new IgepSalto($nombreClase,$_REQUEST['idBotonSalto']); $salto->setBtnId($idBtnCompleto); $resultadoSalto = $objClase->saltoDeVentana($comunicaUsuario, $salto); } else { $salto = IgepSession::dameSalto(); $salto->setId($_REQUEST['idBotonSalto']); $resultadoSalto = $objClase->regresoAVentana($comunicaUsuario, $salto); } if($resultadoSalto==0) { //Guardamos datos del salto IgepSession::guardaSalto($salto); $actionForward = $actionMapping->get('IgepSaltoVentana'); //Si es una vuelta borramos el panel origen if($str_accion == 'IgepRegresoVentana') { if($salto->isModal()) { $this->obj_IgSmarty = new IgepSmarty(); $salto->js = IgepSmarty::getJsCloseModalWindow(); $this->obj_IgSmarty->addPreScript($salto->js); IgepSession::guardaVariable(IgepSession::GVHIDRA_JUMP,'obj_jsOculto',$this->obj_IgSmarty); $actionForward = $actionMapping->get('gvHidraCloseJDialog'); $returnPath = ''; $width = ''; $height = ''; if(is_object($salto)) { $returnPath = $salto->getDestinoVuelta(); $claseManejadoraRetorno = $salto->getNameSourceClass(); // REVIEW: VERO Clase manejadora para identificar la Ventana Modal $actionForward->put('IGEPclaseManejadora',$salto->getClaseDestino()); $panelRetorno = $salto->getNameSourcePanel(); $returnPath.= '&claseManejadora='.$claseManejadoraRetorno.'&gvhpanel='.$panelRetorno; $actionForward->put('IGEPSaltoDestinoVuelta',$returnPath); } } else { IgepSession::borraPanel($nombreClase); $actionForward->put('IGEPaccionDestinoSalto',$salto->getDestinoVuelta()); } } else { /************ MODAL *********************/ //Comprobamos si es un salto modal o no //Es un salto if($salto->isModal()) { //Si es modal $salto->setForm($nomForm); $actionForwardSalto = new ActionForward('saltoModal'); $actionForwardSalto->setPath($salto->getDestinoIda()); $path = $actionForwardSalto->getPath(); //Si viene de un salto almacenamos los datos para la accion de retorno $actionForward = $actionMapping->get('IgepSaltoVentanaModal'); $actionForward->put('IGEPaccionDestinoSalto',$salto->getDestinoIda()); // REVIEW: VERO Clase manejadora para identificar la Ventana Modal $actionForward->put('IGEPclaseManejadora',$salto->getClaseDestino()); $actionForward->put('IGEPaccionDestinoVueltaSalto',$salto->getDestinoVuelta()); $returnPath = ''; $width = ''; $height = ''; if(is_object($salto)) { $width = $salto->getWidthModal(); $height = $salto->getHeightModal(); $actionForward->put('IGEPmodalWidth',$width); $actionForward->put('IGEPmodalHeight',$height); } } else { $actionForward->put('IGEPaccionDestinoSalto',$salto->getDestinoIda()); } /************ MODAL *********************/ } } else { if(is_object($resultadoSalto)) $actionForward = $resultadoSalto; else { $actionForward = new ActionForward('gvHidraNoAction'); $actionForward->put('IGEPclaseManejadora',$nombreClase); } } break; case 'cambiarPanelDetalle': $nombreClaseMaestro = $_REQUEST['claseManejadoraPadre']; $nombreClaseDetalle = $_REQUEST['claseManejadora']; $objClaseMaestro = & IgepSession::damePanel($nombreClaseMaestro); $objClaseMaestro->regenerarInstancia(); $objClaseMaestro->panelDetalleActivo = $nombreClaseDetalle; IgepSession::borraVariable($nombreClaseDetalle,'obj_ultimaConsulta'); $m_datos = $objClaseMaestro->getResultForSearch(); $tupla[0] = $m_datos[$objClaseMaestro->int_filaActual]; $res = $objClaseMaestro->buildQueryDetails($tupla); $objClaseMaestro->limpiarInstancia(); ob_clean(); header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-type: text/javascript;"); $params = array ( 'path'=> '', 'context' => array( 'targetType' =>'self', 'action' =>'reload' ) ); $response = json_encode($params, JSON_FORCE_OBJECT); echo $response; ob_flush(); die; case 'defaultPrint': $nombreClase = $_REQUEST['claseManejadora']; $actuaSobre = $_REQUEST['actuaSobre']; $titulo = $_REQUEST['titulo']; $objClase = & IgepSession::damePanel($nombreClase); $objClase->regenerarInstancia(); if(!isset($actuaSobre)) $actuaSobre = 'tabla'; if($actuaSobre=='ficha') $data = $objClase->getResultForEdit(); else $data = $objClase->getResultForSearch(); $num_columnas = count($data[0]); $nom_columnas = array_keys($data[0]); $total_registros = count($data); ob_end_clean(); ob_start(); $html = << Impresión página - $titulo cabecera; if($actuaSobre=='ficha') { $html.= "\n"; $html.="\n"; $html.= "\n"; $html.= "\n"; $html.="\n"; foreach($data as $index => $row) { $html.="\n"; $html.="\n"; foreach($row as $name => $value) { $html.="\n"; $html.=""; $html.="\n"; $html.="\n"; } $html.=""; $html.="\n"; $html.="\n"; $html.="\n"; } //Contador $html.="\n"; $html.="\n"; $html.="\n"; $html.= "
    $titulo
    "; if(empty($name)) $name = " "; else $name.=': '; $html.= $name; $html.=""; if(empty($value)) $value = " "; elseif(is_array($value)) $value = $value['seleccionado']; $html.=$value."
    "; $html.="
    "; $html.= "Registro ".(++$index).""; $html.="
    Total registros: $total_registros
    \n"; $html.= "\n"; $html.= "\n"; } else { $html.= "\n"; $html.="\n"; $html.= "\n"; $html.= "\n"; $html.="\n"; $html.="\n"; $html.="\n"; $html.="\n"; foreach($nom_columnas as $col) { if(empty($col)) $col = " "; $html.="\n"; } $html.="\n"; $html.="\n"; foreach($data as $row) { $html.="\n"; $html.="\n"; $html.="\n"; foreach($row as $field) { if(empty($field)) $field = " "; elseif(is_array($field)) $field = $field['seleccionado']; $html.="\n"; } $html.="\n"; $html.="\n"; } //Contador $html.="\n"; $html.="\n"; $html.="\n"; $html.= "
    $titulo
    $col
    $field
    Total registros: $total_registros
    \n"; $html.= "\n"; $html.= "\n"; } print $html; die; break; case 'exportCSV': $nombreClase = $_REQUEST['claseManejadora']; $actuaSobre = $_REQUEST['actuaSobre']; $objClase = & IgepSession::damePanel($nombreClase); $objClase->regenerarInstancia(); if(!isset($actuaSobre)) $actuaSobre = 'tabla'; if($actuaSobre=='ficha') $data = $objClase->getResultForEdit(); else $data = $objClase->getResultForSearch(); //Vaciamos la cache del navegador ob_end_clean(); ob_start(); $nombre_fich='listado-'.date('d-m-H-i-s'); $fecha_hoy=date('d/m/Y'); //Indicamos en el header que se trata de un csv header("Content-Type: application/soffice"); header('Content-Disposition: inline; filename='.$nombre_fich.'.csv'); //Cabeceras $cabeceras = array_keys($data[0]); foreach($cabeceras as $col) { //Comprobamos si tiene etiqueta para la columna. $type = $objClase->getFieldType($col); if($type!=null AND $type->getLabel()!='') echo $type->getLabel()."\t"; else echo $col."\t"; } echo PHP_EOL; foreach($data as $row) { foreach($row as $field){ //Comprobación de fechas if(is_object($field) and method_exists($field,'formatUser')) echo gvHidraUTF8::toUTF8($field->formatUser()); //Comprobación de listas elseif(is_array($field)) { $seleccionado = $field['seleccionado']; foreach($field['lista'] as $value) { if($seleccionado==$value['valor']) echo $field['seleccionado'].' '.$value['descripcion']; } } else //Quitamos retorno de carro echo str_replace("\r\n",'',$field); echo "\t"; } echo PHP_EOL; } //Vaciamos la cache ob_end_flush (); //Ponemos este die para que corte la ejecución y no redireccione la pagina die; 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 */ public 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']); $destinosAdaptados = array(); 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']); //si necesitamos dsn para regenerar lo obtenemos if(method_exists($objPanel,'getDSN')) $dsn = $objPanel->getDSN(); $objPanel->regenerarInstancia($dsn); $objPanel->comunica = new IgepComunicacion($objPanel->v_descCamposPanel); $objPanel->comunica->setPanel($_REQUEST['gvhpanel']); $objPanel->comunica->data2Arrays(); $objPanel->comunica->setOperation('visibles'); $objPanel->comunica->posicionarEnTupla($datosCampoDependiente['registroActivo']); //Validamos los campos antes de saltar // TODO: 02-09-2009. Toni: Validacion de datos en acciones de interfaz // Este codigo permite validar los datos al entrar en una accion de interfaz. // Esta comentado porque provoca efectos no deseados. Bloque la interfaz y no // deja que se ejectuen el resto de acciondes de interfaz. /* $validacionIgep = $objPanel->comunica->checkDataTypes(); if($validacionIgep!= '0') { $jsMensajeError =IgepSmarty::getJsMensaje(new IgepMensaje('IGEP-17',array($validacionIgep))); $this->obj_IgSmarty->addPostScript($jsMensajeError); } else { */ //Si actualizamos listas, tenemos que recorrer cada uno de ellas para obtener la forma en que se cargan. $this->listasDependientesJs = $objPanel->_recalcularListasDependientes($destinos,$destinosAdaptados); $this->obj_IgSmarty->addPreScript($this->listasDependientesJs); //Ahora comprobamos si el campo origen tiene una validación. En este caso ejecutaremos la función de validación correspondiente $this->accionesInterfazJs = $objPanel->_accionesInterfaz($campoOrigen,$datosCampoDependiente['origen']); $this->obj_IgSmarty->addPostScript($this->accionesInterfazJs); //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 */ public function abrirVentanaSeleccion($actionMapping) { $datosVentana = $this->comunica->dameDatos('abrirVentanaSeleccion'); $coleccionVentanas = & IgepSession::dameVariable($datosVentana['claseManejadora'],'v_ventanasSeleccion'); $actionForward = $actionMapping->get('IgepVentanaSeleccion'); if(isset($coleccionVentanas[$datosVentana['nomCampo']])){ $size = $coleccionVentanas[$datosVentana['nomCampo']]->getWindowSize(); $coleccionVentanas[$datosVentana['nomCampo']]->abrirVentanaSeleccion($datosVentana); $coleccionVentanas[$datosVentana['nomCampo']]->buscarVentanaSeleccion($datosVentana,$this->obj_errorNegocio); $actionForward->put('IGEPmodalWidth',$size['width']); $actionForward->put('IGEPmodalHeight',$size['height']); } else{ $panelVentanaSeleccion['mensaje'] = new IgepMensaje('IGEP-19',array($datosVentana['nomCampo'],$datosVentana['claseManejadora'])); IgepSession::_guardaPanelIgep('ventanaSeleccion',$panelVentanaSeleccion); } return $actionForward; } /** * Método encargado de realizar las operaciones necesarias para la fase de busqueda de una ventana de Selección * @access private */ public function buscarVentanaSeleccion() { $datosVentana = $this->comunica->dameDatos('abrirVentanaSeleccion'); $coleccionVentanas = IgepSession::dameVariable($datosVentana['claseManejadora'],'v_ventanasSeleccion'); // IgepDebug::setDebug(DEBUG_USER, print_r($datosVentana,true)); if(isset($coleccionVentanas[$datosVentana['nomCampo']])) $coleccionVentanas[$datosVentana['nomCampo']]->buscarVentanaSeleccion($datosVentana); return 0; } /** * 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) $tipoOrdenacion = SORT_REGULAR; elseif ($es_numero) $tipoOrdenacion = SORT_NUMERIC; else $tipoOrdenacion = SORT_STRING; foreach ($cursor as $fila => $valor) { $vectorClave[$fila] = $valor[$clave]; } if ($tipoOrdenacion == SORT_STRING) { // Para ordenar sin distinguir entre mayúsculas y minúsculas uasort($vectorClave, strcasecmp); if (strtolower($orden) != 'asc') // Reverse para ordenación descendente $vectorClave = array_reverse($vectorClave, true); } else { if (strtolower($orden) == 'asc') asort($vectorClave, $tipoOrdenacion); else arsort($vectorClave, $tipoOrdenacion); } foreach ($vectorClave as $fila => $valor) { $cursorOrdenado[] = $cursor[$fila]; } $cursor = $cursorOrdenado; } public final function isModal() { return false; } }//Fin clase IgepAccionesGenericas ?>