Cambio de pantalla desde icono de utilería

Hola, estoy modificando el proyecto de referencia para probar de hacer esto, y por algún detalle no he tenido exito…
Adjunté el código al icono_limpiar… el alerta, funciona… el cambio de pantalla, no hace nada.
La navegación está definida por la subclase… es decir, no muestra los tabs.
En otras pruebas:

  • pude replicar el funcionamiento que deseo con 2 botones, y set_pantalla en php…
  • en js, pude ocultar/mostrar las pantallas (usando tabs horizontales, pero no pude con nav. def. x la subclase).
  • en js, modificando el código anterior, no pude hacerlo funcionar con ir_a_pantalla

El código de ci_iconos_utilerias me quedó así:


<?php
php_referencia::instancia()->agregar(__FILE__);

class icono_informacion implements toba_ef_icono_utileria
{
	function get_html(toba_ef $ef)
	{
		$objeto_js = $ef->objeto_js();
		$javascript = "alert('Estado actual: ' + $objeto_js.get_estado());";
		$salida = "<a class='icono-utileria' href='#' onclick=\"$javascript\">";
		$salida .= toba_recurso::imagen_toba('info_chico.gif', true, null, null, "Ver estado actual del campo");
		$salida .= "</a>";
		return $salida;
	}
}

class icono_limpiar implements toba_ef_icono_utileria
{
    protected $id_ci_contenedor;
	
    function __construct($ci_objeto_js)
    {
    	$id_ci_contenedor = $ci_objeto_js;
    }
    
	function get_html(toba_ef $ef)
	{
		$objeto_js = $this->id_ci_contenedor;
		$javascript = "alert('quiero ir a B');
						{$objeto_js}.ir_a_pantalla('b');
					  ";
		$salida = "<a class='icono-utileria' href='#' onclick=\"$javascript\">";
		$salida .= toba_recurso::imagen_toba('limpiar.png', true, null, null, null);
		$salida .= "</a>";
		return $salida;
	}
}

class ci_iconos_utilerias extends toba_ci
{
	function conf__form(toba_ei_formulario $form)
	{
		//-- Se agrega un icono de información al lado de cada ef
		$icono_informacion = new icono_informacion();
		foreach ($form->get_nombres_ef() as $ef) {
			$form->ef($ef)->agregar_icono_utileria($icono_informacion);
		}
		//-- Para el ef_combo se agrega otra utileria
		$form->ef('combo')->agregar_icono_utileria(new icono_limpiar($this->get_id_objeto_js()));
	}
}
?>

El regreso a la pantalla de origen, lo haré desde el evento de presión de un botón por php y set_pantalla.
Mil gracias!


Hola Martin,

si mal no entiendo la api para ocultar/mostrar tabs unicamente funciona cuando la navegacion no la maneja la subclase, de la misma manera creo sucede con el ir_a_pantalla, lo que podrias hacer es en dicho icono disparar el evento como si se tratara de un boton y luego en PHP capturar el evento para realizar el seteo de la pantalla de manera explicita.

Los eventos los podes definir en el ci (pero no los agregues a botonera), luego obtenes el objeto correspondiente al evento y le solicitas el codigo js con get_invocacion_js, eso lo pones en el icono de utileria y al clickearlo en el servidor deberias recibir el evento en el cual vos disparas el cambio de pagina con set_pantalla

Saludos

Bien… me superó… podrás tirarme unas líneas genéricas de código… pseudocodigo o algo así…

Los eventos los podes definir en el ci (pero no los agregues a botonera),
Esto es sencillo.
luego obtenes el objeto correspondiente al evento y le solicitas el codigo js con get_invocacion_js, eso lo pones en el icono de utileria
Acá me mareo... sería algo como:

<?php
php_referencia::instancia()->agregar(__FILE__);

class icono_informacion implements toba_ef_icono_utileria
{
	function get_html(toba_ef $ef)
	{
		$objeto_js = $ef->objeto_js();
		$javascript = "alert('Estado actual: ' + $objeto_js.get_estado());";
		$salida = "<a class='icono-utileria' href='#' onclick=\"$javascript\">";
		$salida .= toba_recurso::imagen_toba('info_chico.gif', true, null, null, "Ver estado actual del campo");
		$salida .= "</a>";
		return $salida;
	}
}

class icono_limpiar implements toba_ef_icono_utileria
{
    protected $id_ci_contenedor;
	
    function __construct($ci_objeto_js)
    {
    	$id_ci_contenedor = $ci_objeto_js;
    }
    
	function get_html(toba_ef $ef)
	{
		$objeto_js = //ACA TENDRIA QUE REFERENCIARLO??;
		$javascript = //COMO;
		$salida = "<a class='icono-utileria' href='#' onclick=\"$javascript\">";
		$salida .= toba_recurso::imagen_toba('limpiar.png', true, null, null, null);
		$salida .= "</a>";
		return $salida;
	}
}

class ci_iconos_utilerias extends toba_ci
{
	function conf__form(toba_ei_formulario $form)
	{
		//-- Se agrega un icono de información al lado de cada ef
		$icono_informacion = new icono_informacion();
		foreach ($form->get_nombres_ef() as $ef) {
			$form->ef($ef)->agregar_icono_utileria($icono_informacion);
		}
		//-- Para el ef_combo se agrega otra utileria
		$form->ef('combo')->agregar_icono_utileria(new icono_limpiar //ACA TENDRIA QUE OBTENER EL ID DEL EVENTO Y PASARLO COMO PARAMETRO???);
	}
}
?>

y al clickearlo en el servidor deberias recibir el evento en el cual vos disparas el cambio de pagina con set_pantalla
Esto puedo figurarme como hacerlo, pero solo tengo una vaga idea. Supongo debe ser más sencillo de lo que me lo pinto.

Necesito esto medio urgente, pero pese a que lo entendí, todavía me cuesta ver donde y como uso lo que me decís.

Otra opción (que puede ser más sencilla para mi):, creo un evento en la solapa del formulario, como si fuera un botón para la botonera, pero “mover” ese botón en el layout al lado del ef que ahora tiene el ícono de utilería. Como hago para incluír dicho botón en el layout? Se generar un layout a mano, lo que no sé es como agregar ese boton y asociarlo al evento definido.

Gracias!

Maldito foro degenerado que hiciste con mi respuestaaaaaa???

Bueno luego de la descarga de ira hacia este medio de comunicacion procedo nuevamente a escribir algo parecido a lo del viernes (maldito foro <.<).
Lo que te decia sobre el evento seria mas o menos asi:


<?php
php_referencia::instancia()->agregar(__FILE__);
class icono_limpiar implements toba_ef_icono_utileria
{
    protected $ci_contenedor;
	
    function __construct($ci_objeto)
    {
    	$this->ci_contenedor = $ci_objeto;
    }
    
	function get_html(toba_ef $ef)
	{
                $javascript = $this->ci_contenedor->evento('pasa_pantalla')->get_invocacion_js();
		$salida = "<a class='icono-utileria' href='#' onclick=\"$javascript\">";
		$salida .= toba_recurso::imagen_toba('limpiar.png', true, null, null, null);
		$salida .= "</a>";
		return $salida;
	}
}

class ci_iconos_utilerias extends toba_ci
{
	function conf__form(toba_ei_formulario $form)
	{
		//-- Se agrega un icono de información al lado de cada ef
		$icono_informacion = new icono_informacion();
		foreach ($form->get_nombres_ef() as $ef) {
			$form->ef($ef)->agregar_icono_utileria($icono_informacion);
		}
		//-- Para el ef_combo se agrega otra utileria
		$form->ef('combo')->agregar_icono_utileria(new icono_limpiar($this));
	}
}
?>

Para la parte de PHP, lo que tendrias seria dentro del ci algo como lo siguiente, con esto cambiarias de pantalla:


function evt__pasa_pantalla()
{
     $this->set_pantalla('pant_edicion');
}

Espero no haberte mareado mas…
Saludos

Para nada… no estaba tan lejos (en un pseudocodigo tipo “me tarzan, you jane” pero…)

Salió andando sin problemas… MIL GRACIAS… hasta ahi.

El objetivo final, es poder dar de alta datos secundarios desde un abm principal que los utiliza, sin perder los datos ya ingresados (algo así como un popup, pero con la posibilidad de seleccionar en un combo los valores existentes y solo si falta uno, ir a dar de alta uno nuevo. Al margen de no gustarme los popups en general).

Ahora, unos “detalles” más:

  • Logré ir a una pantalla oculta.
  • Logro volver a la original, ya sea que cancele o que acepte el dato ingresado (el valor ingresa perfectamente).
    - No puedo recuperar la información ya ingresada en la pantalla original, ni el dato recientemente cargado.

El evento en PHP es (definido para mantener datos):


<?php
	function evt__nuevo_pais($datos)
	{	
                //aca probe haciendo un $this->dep('localidades')->set($datos);
		$this->dep('ci_nuevo_pais')->set_pantalla_origen('pant_inicial', 'formulario', 'id_pais');
		$this->set_pantalla('pant_nuevo_pais');
                //aca probe con hacer $this->dep('formulario')->set_datos($datos);
	}

El alta de datos secundarios, está definido lo siguiente:


<?php
class ci_nuevo_pais extends toba_ci
{
	protected $s__pantalla_origen;
	protected $s__form;
	protected $s__ef_asociado;

	function set_pantalla_origen($pantalla_origen, $form, $ef_asociado)
	{
		$this->s__pantalla_origen	= $pantalla_origen;
		$this->s__form				= $form;		
		$this->s__ef_asociado 		= $ef_asociado;
	}
	
	//-----------------------------------------------------------------------------------
	//---- formulario -------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function evt__formulario__aceptar($datos)
	{
		$this->dep('paises')->set($datos);
		$this->dep('paises')->sincronizar();
		$pantalla = $this->s__pantalla_origen;
		$this->controlador->set_pantalla($pantalla);
		$this->dep('paises')->resetear();
		//$this->controlador->dep($this->s__form)->ef($this->s__ef_asociado)->set_estado($datos['id']);
	}	

	function evt__formulario__cancelar()
	{
		$pantalla = $this->s__pantalla_origen;
		$this->controlador->set_pantalla($pantalla);
		$this->dep('paises')->resetear();
	}	
}
?>

Se me está escapando algo…
Si ves otra forma posible de hacer lo que necesito, no dudes en indicarmela! (si es más complicada… es más complicado para vos!!! :slight_smile: )

``` <?php function evt__nuevo_pais($datos) { //aca probe haciendo un $this->dep('localidades')->set($datos); $this->dep('ci_nuevo_pais')->set_pantalla_origen('pant_inicial', 'formulario', 'id_pais'); $this->set_pantalla('pant_nuevo_pais'); //aca probe con hacer $this->dep('formulario')->set_datos($datos); } ```
Esto supongo que esta en el Ci exterior no?... el/los formularios de dicha pantalla tienen eventos de modificacion implicitos? Podrias adjuntarme el codigo del resto del CI donde esta este metodo?. Saludos

Sip… y si… te adjunto…


<?php
require_once('recursos/manipulacion_cadenas.php');
require_once('datos_fijos/provincias_argentinas.php');
require_once('datos/dt_cfg_valores_por_defecto.php');
require_once('recursos/iconos_utileria.php');

class ci_localidades extends toba_ci
{
	protected $s__datos_filtro;
	protected $s__where_filtro;
	
	function evt__nuevo_pais($datos)
	{	
		$this->dep('ci_nuevo_pais')->set_pantalla_origen('pant_inicial', 'formulario', 'id_pais');
		$this->set_pantalla('pant_nuevo_pais');
	}

	//-----------------------------------------------------------------------------------
	//---- filtro -----------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__filtro($filtro)
	{
		if (isset($this->s__datos_filtro)) {
			$filtro->set_datos($this->s__datos_filtro);
		}
	}
	
	function evt__filtro__filtrar($datos)
	{
		$this->s__datos_filtro = $datos; 
		$this->s__where_filtro = $this->dep('filtro')->get_sql_where();
	}

	function evt__filtro__limpiar()
	{
		unset($this->s__datos_filtro);
		unset($this->s__where_filtro);
	}

	//-----------------------------------------------------------------------------------
	//---- cuadro -----------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__cuadro(toba_ei_cuadro $cuadro)
	{
		if (isset($this->s__where_filtro)) {
			$cuadro->set_datos($this->dep('localidades')->get_listado($this->s__where_filtro));
		} else {
			$cuadro->set_datos($this->dep('localidades')->get_listado());
		}
	}

	function evt__cuadro__seleccion($seleccion)
	{
		$this->dep('localidades')->cargar($seleccion);
	}

	//-----------------------------------------------------------------------------------
	//---- formulario -------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__formulario(toba_ei_formulario $form)
	{
		if ($this->dep('localidades')->esta_cargada()) {
			$datos      = $this->dep('localidades')->get();
			$provincias = provincias_argentinas::obtener_provincias_argentinas();
			if (!in_array(array($datos['provincia'],$datos['provincia']), $provincias)) {
				$datos['provincia_otra'] = $datos['provincia'];
				$datos['provincia']      = provincias_argentinas::provincia_otra;
			} else {
				$datos['provincia_otra'] = null;
			}
			$form->set_datos($datos);
		} else {
            $cfg   = dt_cfg_valores_por_defecto::get_configuracion();
			$datos = array('provincia' 	=> provincias_argentinas::provincia_defecto,
						   'id_pais' 	=> $cfg['id_pais_argentina']
						);
			$form->set_datos_defecto($datos);
		}
		$form->ef('id_pais')->agregar_icono_utileria(new icono_nuevo_dato_secundario($this, 'nuevo_pais'));
	}
	
	function evt__formulario__alta($datos)
	{
		$this->aceptar_datos($datos);
	}

	function evt__formulario__eliminar()
	{
		$this->dep('localidades')->eliminar_todo();
		$this->resetear();
	}

	function evt__formulario__modificacion($datos)
	{
		$this->aceptar_datos($datos);
	}

	function evt__formulario__cancelar()
	{
		$this->resetear();
	}
	
	function resetear()
	{
		$this->dep('localidades')->resetear();
	}

	function aceptar_datos($datos)
	{
		manipulacion_cadenas::arreglo_en_mayusculas($datos);
		if (isset($datos['provincia_otra']) && $datos['provincia'] == provincias_argentinas::provincia_otra) {
		  $datos['provincia'] = $datos['provincia_otra'];
		}
		$this->dep('localidades')->set($datos);
		$this->dep('localidades')->sincronizar();
		$this->resetear();
	}
}
?>

Hola Martin,

el inconveniente que tenes es el siguiente, del codigo puedo ver que los eventos para los componentes de la pantalla inicial no estan a nivel de CI, sino a nivel de los propios componentes.
Eso significa que los componentes no enviaran sus datos por interaccion de algun otro elemento de la pantalla, para ponerlo en castellano, si no se presiona el evento de modificacion en el formulario este no enviara sus datos.

Por lo tanto, para poder recibir los datos del formulario el mismo deberia o bien contener el evento ‘nuevo_pais’ que se disparara desde alli (hay que hacerle unas modificaciones al codigo que traiamos para obtener la invocacion_js del evento) o sino simplemente tener un evento modificacion implicito y que sea el CI el que maneje cuando se guarda o no el registro, en tu caso como tenes un filtro y un cuadro en la misma pantalla creo que seria mejor trasladar el evento ‘nuevo_pais’ al formulario, de esa forma cuando se dispare en el metodo evt__formulario__nuevo_pais vas a poder obtener los datos del formulario y guardarlos para poder accederlos cuando vuelvas de la otra pantalla.

Cualquier cosa avisame… que me parece me quedo un poco enroscada la redaccion.
Saludos