Actualizar en cascada desde un formulario a un combo de un formulario multilinea

Hola!
Les comento que me encuentro con la siguiente situación:
Tengo un formulario que entre otros efs tiene un combo “Dependencia”, y después otro formulario multilinea con otro combo “Empleados”, la idea es que al seleccionar una dependencia desde el primer formulario, se filtre en cascada el combo de “Empleados” que está en un multilinea con los empleados que pertenezcan a la dependencia seleccionada. La cuestión es que por toba editor no encontré la forma de encarar esta situación, también hice la siguiente prueba por código:

#en el js del formulario que tiene el combo dependencia:


		{$this->objeto_js}.evt__id_dependencia__validar = function()
		{
		var parametro =this.ef('id_dependencia').get_estado();
                this.controlador.buscar();
                return true;
                 }

#en js del ci de la operación:


	function js_caso_html()
	{
		echo "		
			{$this->objeto_js}.buscar = function() {
				var parametro = this.dep('form_incidente').ef('id_dependencia').get_estado();
				var nodo_html = this.dep('ml_empleados').ef('numero_legajo').input();												
				this.ajax_html('actualizar_form_empleados', parametro, nodo_html);						
				return false;
			}		
		";
	}	

#y después el método php ajax__actualizar_form_empleados


	function ajax__actualizar_form_empleados($parametro, toba_ajax_respuesta $respuesta)
	{				
		$empleados= dao_consultas::get_empleados_dependencia($parametro);
		$result =  '<option value="nopar">--Seleccione--</option>';		
		foreach($empleados as $empleado)
		{
			$result .=  "<option value='{$empleado['numero_legajo']}'> {$empleado['nombre_completo']}</option>";
		}		
		$respuesta->set($result);
	}

La cuestión de que de esta forma me filtra correctamente en cascada el combo de empleados, mostrando los que correspondan con la dependencia seleccionada, pero el cambio lo hace únicamente a la primer fila del multilinea, y las demás filas quedan con el combo vacio…

Que cambios debería aplicar para que la cascada se aplique a todas las filas del multilinea?, desde ya muchas gracias :).

Saludos,
Fernando Korol.

Hola Fernando,

como ya habras notado el esquema de cascadas esta pensado para funcionar dentro del componente y no entre componentes, pero por lo que veo tambien notaste que con un poco de garfio se puede simular.
El tema con el ML (si lo tenes configurado para agregar filas en JS) es que usa una fila ‘modelo’ a partir de la cual genera las que vos ves y editas.
Por lo que entiendo en tu caso el combo del formulario de arriba se cambia y queda fijo para toda la edicion del ML… es decir… no se esta cambiando con cada fila que agregas… sino que queda fijo para todo el conjunto.
La idea entonces seria modificar dicha fila modelo para que cuando el ML la clone salga con los valores ya filtrados.
Lo que se me ocurre es un garfio como el siguiente:

  • Vamos a usar el metodo ir_a_fila() del ef que nos permite navegar por las lineas del ML
  • Le vamos a decir que vaya a la fila modelo… que se identifica con ‘fila’ y asi obtener el nodo correcto

function js_caso_html()
{
	echo "		
		{$this->objeto_js}.buscar = function() {
			var parametro = this.dep('form_incidente').ef('id_dependencia').get_estado();                      
			var nodo_html = this.dep('ml_empleados').ef('numero_legajo').ir_a_fila('__fila__').input();												
			this.ajax_html('actualizar_form_empleados', parametro, nodo_html);						
			return false;
		}		
	";
}	

Si todo anda bien deberias tener filtrado el combo que se usa como modelo para todas las filas y por tanto cada vez que agregas una el combo ya deberia tener los valores correctos.
Si no es asi… entonces es que mi idea no funca XD y tenemos que buscar un metodo alternativo.

Saludos

Hola Ricardo
Te comento que los cascadas con los ajustes que me recomendaste anduvo re bien!, al final quedó de la siguiente manera:

#en el js del formulario que tiene el combo dependencia:


                {$this->objeto_js}.evt__id_dependencia__validar = function()
                {
                       this.controlador.buscar();
                       return true;
                }

#en js del ci de la operación:


	function js_caso_html()
	{
		echo "		
			{$this->objeto_js}.buscar = function() {
				var parametro = this.dep('form_incidente').ef('id_dependencia').get_estado();
				this.ajax('actualizar_form_empleados', parametro, this, this.actualizar_datos);
				return false;
			}
	

			{$this->objeto_js}.actualizar_datos = function(datos)
			{
				var filas = this.dep('ml_empleados').filas();
				for (id_fila in filas) {
					this.dep('ml_empleados').ef('numero_legajo').ir_a_fila(filas[id_fila]).set_opciones(datos);
				}
				this.dep('ml_empleados').ef('numero_legajo').ir_a_fila('__fila__').set_opciones(datos);
			}
			
		";
	}	

//Cuando cambia la dependencia se actualizan todas las filas con los empleados de la dependencia seleccionada y se fija también el combo modelo para las nuevas filas.

#y después el método php ajax__actualizar_form_empleados


	function ajax__actualizar_form_empleados($parametro, toba_ajax_respuesta $respuesta)
	{
		$empleados= dao_consultas::get_empleados_dependencia($parametro);
		$result = array();		
		foreach($empleados as $empleado)
		{
			$result[$empleado['numero_legajo']] =  $empleado['nombre_completo'];
		}
		$respuesta->set($result);
	}

De esta forma queda resuelto el problema de los cascadas entre el formulario y el ML, el tema ahora ya es algo un poco mas generico: cuando se intenta guardar los cambios después de cargar el combo por medio de ajax, aparece el error: “Error Interno… El ef “numero_legajo” no posee a la opción “XXXX” entre las enviadas”.
Si inicialmente se carga el combo empleados y está el id XXXX entre los valores del array de carga no se produce el error, si no está el id o inicialmente no se carga nada se produce ese error interno…
Tenés alguna idea de como se puede configurar para desactivar el control que genera ese error interno?

Saludos,
Fernando

Hola Fernando,

Disculpa la demora pero anduve con otras cosas, ese control se agrego como medida de seguridad para prevenir que se tome como estado valido un valor que no estaba entre los posibles. Eso trae como consecuencia estos detalles… en los cuales uno quiere recuperar los valores mediante ajax y el control molesta… pero bueno hay que encontrarle la vuelta.

  • Una opcion que se me ocurre es tratar de hacerlo pasar por el esquema de cascadas (con un ef_oculto o algo por el estilo).
  • Otra opcion seria tratar de cargar la dependencia en ese momento (osea el formulario) y setearle los valores al ef correspondiente (antes de enviar la respuesta ajax) para que cuando vuelva desde el cliente con los datos ya tenga las opciones correctas cargadas en memoria.
  • Matufiar directamente los valores guardados en memoria… aunque puede terminar siendo mas complicada y propensa a errores que las anteriores.

En principio se me ocurren esas opciones, ya que el control no se puede desactivar.

Saludos