[SOLUCIONADO] Carga de datos desde un ef_seleccion_multi_check

Hola, tengo el siguiente problema en un ABM de Personas, similar al del proyecto referencia.
Hay varias tablas secundarias asociadas, las cuales están funcionando a la perfección (el manejo de los datos de una de ellas se complicó y luego solucionó, http://comunidad.siu.edu.ar/index.php?topic=1426.msg4654#msg4654).

Ahora me encuentro frente a otra complicación.

Una de las tablas secundarias, Personas_Hobbies, es el nexo entre la tabla Personas y la tabla Hobbies.
Esta es la definición de la tabla:

Personas_Hobbies
id (es un campo autoincremental/serial)
id_persona
id_hobbie

Teniendo esto presente, en la solapa de Hobbies, definí la carga del campo id_hobbie a través de un ef_seleccion_multi_check que se cargará desde la tabla de Hobbies.

Hasta acá todo bien, incluso, obtengo el id de cada hobbie seleccionado en el evt__form_hobbies__modificacion


	function evt__form_hobbies__modificacion($registro)
	{
		foreach ($registro['id_hobbie'] as $id) {
			toba::notificacion()->agregar($id);
                        //acá debería estar armando el array
		} 	
	}

Lo que no termino de acertar en hacer es el armado del array para setear los datos de este formulario para luego sincronizarlos cuando se Guarde la operación completa.

Tengo claro donde están los datos

[tr][td]id[/td][td]se definirá solo por definición[/td][/tr]
[tr][td]id_persona[/td][td]$this->get_relacion()->dep(‘personas’)->get_columna(‘id’);[/td][/tr]
[tr][td]id_hobbie[/td][td]$id[/td][/tr]

Lo que no puedo vislumbrar es la forma de armar el $datos necesario para hacer
$this->get_relacion()->tabla(‘personas_hobbies’)->set($datos);

Mil gracias!!

Bien, en realidad era muy sencillo y lo resolví de esta forma:


	function evt__form_descripcion__modificacion($registro)
	{
		foreach ($registro['id_hobbie'] as $id) {
		    unset($datos);
		    $datos['id_hobbie'] = $id;
		    $this->get_relacion()->tabla('personas_hobbies')->nueva_fila($datos); 
		}
	}

[shadow=red,left]Lo que no puedo hacer ahora, es lo siguiente:[/shadow]

  1. como puedo hacer para chequear si un hobbie ya fue seleccionado (es decir, si hubo o no cambios), para no replicar el alta de un nuevo nexo y generar un error?
  2. recuperar los tildes desde los datos. Recupero los datos, pero no se representan en el ef.

	function conf__form_descripcion(toba_ei_formulario $form)
	{
		$datos = $this->get_relacion()->tabla('docentes_comentarios')->get_filas(null, true);
		//var_dump($datos);
                //array(2) { [0]=>  array(3) { ["id"]=>  int(2) ["id_hobbie"]=>  int(3) ["id_persona"]=>  int(1) }
                //              [1]=>  array(3) { ["id"]=>  int(3) ["id_hobbie"]=>  int(2) ["id_persona"]=>  int(1) }}
		$form->set_datos($datos); //esto no funciona tildando los checkboxes que corresponderían.
	}

en fin…

Lo que podes hacer es usar operaciones de arreglos para calcular diferencias entre los valores viejos y los nuevos, por ejemplo array_diff($val_viejos, $val_nuevos) te diria si se borro alguno, con los parametros al reves te diria cuales se agregaron, de esa forma podes ir agregando unicamente los que se fueron incorporando.

2) recuperar los tildes desde los datos. Recupero los datos, pero no se representan en el ef.

	function conf__form_descripcion(toba_ei_formulario $form)
	{
		$datos = $this->get_relacion()->tabla('docentes_comentarios')->get_filas(null, true);
		//var_dump($datos);
                //array(2) { [0]=>  array(3) { ["id"]=>  int(2) ["id_hobbie"]=>  int(3) ["id_persona"]=>  int(1) }
                //              [1]=>  array(3) { ["id"]=>  int(3) ["id_hobbie"]=>  int(2) ["id_persona"]=>  int(1) }}
		$form->set_datos($datos); //esto no funciona tildando los checkboxes que corresponderían.
	}

en fin…

El tema aqui es la organizacion del arreglo a devolver, tendrias que reorganizar las cosas para que el componente con id ‘id_hobbie’ sea un arreglo de los posibles valores a tomar.
La idea seria devolver algo con la siguiente forma:
//array(1) { [‘id_hobbie’]=> array(3) { [0]=> int(2) [1]=> int(3) [2] => int(1) [3] => int(4)}}


	function conf__form_descripcion(toba_ei_formulario $form)
	{
		$datos_filas = $this->get_relacion()->tabla('docentes_comentarios')->get_filas(null, true);
                $datos['id_hobbie'] = array();
                 foreach($datos_filas as $fila) {
                     $datos['id_hobbie'][] = $fila['id_hobbie'];
                 }
		$form->set_datos($datos);
	}

Saludos
Richard

Si…
Entendí la idea, pero se me escapa por ahora desarrollar esa alternativa (limitaciones de conocimiento).

Momentaneamente, lo resolví con un ei_formulario_ml y listo… procesar_filas() soluciona mi problema.

Puede ser una buena sugerencia que para futuras versiones el multi_check funcione de la misma forma que un ML, se me ocurre que esta situación es bastante común.

Igualmente… GRACIAS… algún día volveré a revisar esto y me saldré con la mía. Por ahora, los tiempos matan intenciones.