Cuadro multiseleccion

Hola:
Tengo un cuadro multiseleccion que necesito que al procesar me devuelva la lista de los items (ids) seleccionados para por cada uno de ellos realizar un insert en una tabla. Se que con:
var seleccion = this.dep(‘cuadro_detalle’).get_ids_seleccionados(‘seleccion’);
de la extension del objeto js lo puedo obtener pero no me doy cuenta como desde evt_procesar obtener la lista de seleccionados.
Saludos. Ricardo.

Hola Ricardo,

la idea seria enviar el contenido de la variable ‘seleccion’ al servidor mediante un campo hidden, que de esta manera viaje por el POST y luego desde php recuperar dicha seleccion mediante:


function evt__procesar()
{
     $seleccionados = $this->recuperar_seleccionados();
     $this->generar_insert($seleccionados);
}

function recuperar_seleccionados()
{
   $seleccion = array();
   $valores = toba::memoria()->get_parametro('nombre_hidden');
   if (! is_null($valores)) {
            $seleccion = explode(separador_elegido, $valores);
            //Tambien se podria haber hecho con un foreach por si se debia controlar algo.
    }

    return $seleccion;
}

Te aclaro que en la version 1.5 el manejo de los cuadros multiseleccion cambia (en el lado servidor) y que se va a lanzar un evento explicitamente por el cual te llegaran las claves seleccionadas. Mientras tanto podes usar algo parecido a lo de arriba.

Saludos
Richard

Richard:
Perdona mi ignorancia pero donde y como seteo el parámetro ‘nombre_hiden’?
Saludos. Ricardo.

Hola Ricardo,

En realidad ‘nombre_hidden’ era solo para indicarte que alli debia figurar el mismo identificador que lleva el campo hidden que enviaste al cliente para colocar los valores de los ids seleccionados. Digamoslo asi, si por ejemplo yo utilizara ids_seleccionados_cliente como identificador comun, en algun lugar vas a tener que hacer una llamada a:


toba_form::hidden('ids_seleccionados_cliente', '');

Probable lo tengas tambien la extension del objeto javascript:


function extender_objeto_js()
{
      echo " {$this->objeto_js}.evt__procesar = function()
                    {
                            var seleccionados = this.dep('cuadro_detalle').get_ids_seleccionados('seleccion');
                            var input = document.getElementById('ids_seleccionados_cliente');
                            input.value = seleccionados.join('^');
                    }";
}

Y finalmente en PHP vas a tener que recuperar los valores con:


function recuperar_seleccionados()
{
   $seleccion = array();
   $valores = toba::memoria()->get_parametro('ids_seleccionados_cliente');
   if (! is_null($valores)) {
            $seleccion = explode('^', $valores);
            //Tambien se podria haber hecho con un foreach por si se debia controlar algo.
    }

    return $seleccion;
}

Saludos
Richard

No hay caso, no me dispara el javascript. Tengo:


	function conf__cuadro_envios(toba_ei_cuadro $cuadro)
	{
		echo toba_form::hidden('ids_seleccionados_cliente', '');
		$t_recargas = toba::consulta_php('soe_consultas')->get_recargas();
		$cuadro->set_datos($t_recargas);
	}

Luego:


	function evt__procesar()
	{
		$this->dep('t_recargas')->sincronizar();
		$clave = $this->dep('t_recargas')->get_clave_valor(0);

		$seleccionados = $this->recuperar_seleccionados();
//		$this->generar_insert($seleccionados);
	
		$this->dep('t_recargas')->resetear();
		$this->set_pantalla('seleccion');
	}

	function extender_objeto_js()
	{
		echo "
		
			{$this->objeto_js}.evt__procesar = function()
			{
				var seleccionados = this.dep('cuadro_detalle').get_ids_seleccionados('seleccion');
                var input = document.getElementById('ids_seleccionados_cliente');
                input.value = seleccionados.join('^');
				notificacion.agregar (input.value);
//				notificacion.agregar('Seleccionadas: ' + seleccionados.join(', '), 'info');
				return false;
			}
		";
	}


	function recuperar_seleccionados()
	{
		$seleccion = array();
		$valores = toba::memoria()->get_parametro('ids_seleccionados_cliente');
		if (! is_null($valores)) {
            $seleccion = explode('^', $valores);
            //Tambien se podria haber hecho con un foreach por si se debia controlar algo.
		}

		return $seleccion;
	}

En ningun caso al seleccionar el procesar me recupera los seleccionados del cuadro.
Alguna sugerencia?
Saludos. Ricardo.

Existe alguna otra dependencia dentro de la misma pantalla?.. recorda que el hidden debe ‘existir’ dentro de un HTML, si tenes un filtro u algun otro componente con EFs no creo que haya problema, de lo contrario vas a tener que crear el form mediante los metodos abrir y cerrar de la misma clase toba_form.

Luego:

	function extender_objeto_js()
	{
		echo "
		
			{$this->objeto_js}.evt__procesar = function()
			{
				var seleccionados = this.dep('cuadro_detalle').get_ids_seleccionados('seleccion');
                var input = document.getElementById('ids_seleccionados_cliente');
                input.value = seleccionados.join('^');
				notificacion.agregar (input.value);
//				notificacion.agregar('Seleccionadas: ' + seleccionados.join(', '), 'info');
				return false;
			}
		";
	}

En ningun caso al seleccionar el procesar me recupera los seleccionados del cuadro.
Alguna sugerencia?
Saludos. Ricardo.

A primera vista la extension en JS estaria bien, por lo que me decis la variable ‘seleccionados’ nunca llega a tener valores. Podrias subirnos una captura del arbol de la operacion? asi me doy una idea mas acabada de como es que viene la operacion, si podes tambien de la solapa de eventos del cuadro en cuestion.

Saludos
Richard

Hola!
Te paso un ejemplo de cómo lo resolví en una operación:


<?php
class ci_prueba extends toba_ci
{
	function generar_html()
	{
		echo toba_form::hidden($this->_submit.'__filas_seleccionadas', '');
		parent::generar_html();
	}

	function extender_objeto_js()
	{
		echo "
		{$this->objeto_js}.evt__procesar = function() {
			document.getElementById(this._input_submit + '__filas_seleccionadas').value = this.dep('cuadro').get_ids_seleccionados('seleccion');
		}
		";
	}

	function evt__procesar()
	{
		if (isset($_POST[$this->_submit.'__filas_seleccionadas']) && !empty($_POST[$this->_submit.'__filas_seleccionadas'])) {
			ei_arbol(explode(',', $_POST[$this->_submit.'__filas_seleccionadas']));
		}
	}
}
?>

Espero te sea útil…
Saludos! Florencia.

Florencia:
Entiendo tu ejemplo y seguramente debe de funcionar, pero lo pruebo y noto que no se esta capturando el evento procesar, ni en javascript ni en php. Les paso la estructura del IDE y el archivo php con algunas pruebas por si alguien puede identificar que sucede.
Saludos. Ricardo.


<?php
class ci_nav_envios extends toba_ci
{
	//-----------------------------------------------------------------------------------
	//---- Configuraciones --------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__edicion(toba_ei_pantalla $pantalla)
	{
		if (!$this->dep('t_recargas')->esta_cargada() ) {
			$this->pantalla()->eliminar_evento('eliminar');
		}
	}

	function conf__seleccion(toba_ei_pantalla $pantalla)
	{
		if (!$this->dep('t_recargas')->esta_cargada() ) {
			$this->pantalla()->eliminar_evento('eliminar');
		}
	}
	//-----------------------------------------------------------------------------------
	//---- Eventos ----------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function generar_html()
	{
		echo toba_form::hidden($this->_submit.'__filas_seleccionadas', '');
		parent::generar_html();
	}

	function evt__agregar()
	{
			$this->set_pantalla('edicion');
	}

	function evt__cancelar()
	{
			$this->controlador->dep('t_recargas')->resetear();
			$this->set_pantalla('seleccion');
	}

	function evt__eliminar()
	{
			$this->controlador->dep('t_recargas')->eliminar_todo();
			$this->set_pantalla('seleccion');
	}

	function evt__procesar()
	{
		ei_arbol ("aca");
		if (isset($_POST[$this->_submit.'__filas_seleccionadas']) && !empty($_POST[$this->_submit.'__filas_seleccionadas'])) {
			ei_arbol(explode(',', $_POST[$this->_submit.'__filas_seleccionadas']));
		}

/*		$this->dep('t_recargas')->sincronizar();
		$clave = $this->dep('t_recargas')->get_clave_valor(0);

		$seleccionados = $this->recuperar_seleccionados();
//		$this->generar_insert($seleccionados);
	
		$this->dep('t_recargas')->resetear();
*/		$this->set_pantalla('seleccion');
	}

/*	function extender_objeto_js()
	{
		echo "
		
			{$this->objeto_js}.evt__procesar = function()
			{
				var seleccionados = this.dep('cuadro_detalle').get_ids_seleccionados('seleccion');
                var input = document.getElementById('ids_seleccionados_cliente');
                input.value = seleccionados.join('^');
				notificacion.agregar (input.value);
//				notificacion.agregar('Seleccionadas: ' + seleccionados.join(', '), 'info');
				return false;
			}
		";
	}
*/

	function extender_objeto_js()
	{
		echo "
		{$this->objeto_js}.evt__procesar = function() {
			document.getElementById(this._input_submit + '__filas_seleccionadas').value = this.dep('cuadro').get_ids_seleccionados('seleccion');
		}
		";
	}

	function recuperar_seleccionados()
	{
		$seleccion = array();
		$valores = toba::memoria()->get_parametro('ids_seleccionados_cliente');
		if (! is_null($valores)) {
            $seleccion = explode('^', $valores);
            //Tambien se podria haber hecho con un foreach por si se debia controlar algo.
		}

		return $seleccion;
	}

	//-----------------------------------------------------------------------------------
	//---- cuadro_envios ----------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__cuadro_envios(toba_ei_cuadro $cuadro)
	{
		echo toba_form::hidden('ids_seleccionados_cliente', '');
		$t_recargas = toba::consulta_php('soe_consultas')->get_recargas();
		$cuadro->set_datos($t_recargas);
	}

	function evt__cuadro_envios__seleccion($seleccion)
	{
		$this->dep('t_recargas')->cargar($seleccion);
		$this->set_pantalla('edicion');
	}

}

?>


Fijate de reemplazar

this.dep('cuadro')

por

this.dep('cuadro_detalle')

Nop. Para mi es que no atrapa el evento javascript. Les paso el analizador de log.


Hola Ricardo,

te cuento, el tema esta en que tenes el codigo JS en el objeto Ci incorrecto, dicho de otra manera… si miras el arbol de la operacion el cuadro_detalle es dependencia directa del objeto editor y no del objeto Envio a recarga, podes hacer 2 cosas… moves el codigo a la subclase del objeto_ci editor (seria lo mas recomendable) o la otra opcion es que navegues por la estructura para llegar al objeto correcto, en ese caso seria algo asi:


function extender_objeto_js()
	{
		echo "
		{$this->objeto_js}.evt__procesar = function() {
			document.getElementById(this._input_submit + '__filas_seleccionadas').value = this.dep('editor').dep('cuadro_detalle').get_ids_seleccionados('seleccion');
		}
		";
	}

Como veras estoy incluyendo un segundo nivel de dependencia para acceder primero al editor y luego si a la dependencia ‘cuadro_detalle’.

Saludos
Richard