*
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
?>