popup

Buenas…

Les paso a detallar el inconveniente: La operación está formada por un cuadro y un formulario, una vez que se cargan los datos en el formulario estos pasan al cuadro, para luego con el evento de selección poder elegir uno de las filas y volverlas a editar en el formulario. Uno de los campos del formulario es un ef_popup, en lo que hace a la ejecución del popup y el retorno de los datos todo está bien, pero cuando se pulsa la selección en el cuadro, dentro del formulario en lugar de aparecer la descripción del campo, aparece el código. Por las pruebas que hice, y por los errores que obtuve, entiendo que la descripción debería ser cargada por la función declarada en Método Descripción del ef_popup, hasta donde pude ver, la función se ejecuta, pero la descripción no aparecen en el campo; según la wiki lo que debe responder la función es un texto con la descripción, pero no funciona… ¿que puedo estar haciendo mal?

la versión de TOBA utilizada es la 1.3

desde ya muchas gracias

José

Hola José, el método que utilizas para devolver la descripción como lo tenés implementado?. Ese método debería aceptar como parámetro el valor de la clave necesaria para cargar la descripción. Por ejemplo:


function get_categoria_desc_popup($categoria) 
{
	return categorias::get_categoria_desc_popup($categoria);
}

En este caso se recupera la descripción de una categoría dado el código de la misma. Fijate que simplemente se retorna el texto. Esto se hace en el momento que se configura el formulario. En tu caso, primero se dispara el evento de selección guardando el id del elemento que querés visualizar en el formulario. Luego en el evento conf__formulario deberías recuperar los datos asociados a ese id y luego hacer un $form->set_datos($datos). Esto hace que se cargue el id que irá a parar al ef_popup con la consecuente carga de la descripción.

Contame si estás haciendo bien estos pasos.

Saludos.

Rodrigo.

Rodrigo…

por lo que me dices hago todo, seteo los valores en el formulario y la función retorna un texto (que ahora ves fijo, porque no funciona), aquí te transcribo una porción del código y una imagen del editor de toba

<?php
class ci_editor_asientos_automaticos extends toba_ci
{
	function get_tabla($tabla)
	{
		return $this->controlador()->dep('datos')->tabla($tabla);
	}
	
	function get_nombre_cuenta($cuenta)
	{
		return 'Descripcion';			// como no funcionaba quite la función y puse un texto... pero no funciona
	}


	//-----------------------------------------------------------------------------------
	//---- formulario_detalle -----------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__formulario_detalle(toba_ei_formulario $form)
	{
		if ($this->get_tabla('detalle')->hay_cursor()) {
			$datos = $this->get_tabla('detalle')->get();
			$form->set_datos($datos);
		}
		
		// evita que se agreguen más filas de las definidas en toba_relacion
		if ($this->get_tabla('detalle')->get_cantidad_filas() == $this->get_tabla('detalle')->get_tope_max_filas()) {
			$form->eliminar_evento('alta');
		}
	}
}

?>

Fijate de hacer un debug o dumpeo de valores antes de hacer el return en el método que te recupera la descripción. Por ejemplo var_dump(‘algo’), para asegurarnos que en la configuración del formulario está llamando a este método.

De todas maneras puedo ver que antes de hacer un set_datos en el formulario, estás consultando si hay_cursor(). Lo hay? Si lo hubiera, podrías hacer un ei_arbol($datos) para ver que valores trae ahí?.

hice 3 cosas:

  1. puse el ei_arbol($datos), y me retorna valores, correctos
  2. puse un var_dump(‘estoy aquí’) dentro de la función … y no aparece en la pantalla (???)
  3. quite la función de la clase, y toba me lanza un error que la función no se encuentra…

perdón, pero BUAAAAAAAA!!!.. esto prometía ser fácil… BUAAAAAAAAAAA!

cuando tenga un momento mas de calma voy a armar un ejemplo en TOBA 1.4, no sea cosa…

y muchas gracias por la mano que me estas dando…

Es muy loco esto je, proba de eliminar el ef en cuestión y guarda esos cambios utilizando el editor de toba. Luego volve a crear el ef indicandole todos los parámetros necesarios para la carga. Quizás se deba a que por alguna causa que desconozco, los metadatos no se esten guardando de manera correcta en la base.

Si esto no te sirve, la seguimos. No es un problema común así que deberíamos no solo estar cerca de una solución agotando posibles causas al problema sino que también es posible que estemos en presencia de algún bug (aunque descarto ésta última ya que este tipo de operación es bastante frecuente y por lo general no tenemos inconvenientes).

Saludos!.

te cuento que hay algo que se me paso en cuanto a este tema, y es la versión de PHP que en este caso es la 5.3.0, como te dije hice algunas pruebas y estos fueron los resultados…

[tr][td] toba [/td][td] php [/td][td] resultado prueba [/td][/tr]
[tr][td] 1.4.4 [/td][td] 5.2.6 [/td][td] funciona correctamente [/td][/tr]
[tr][td] 1.3.1 [/td][td] 5.2.11 [/td][td] funciona correctamente [/td][/tr]
[tr][td] 1.3.1 [/td][td] 5.3.0 [/td][td] NO funciona correctamente [/td][/tr]

Luego de mucho andar, una amigo me dio una mano mirando directamente la programación, y la sacamos andando, un parche en realidad, extendiendo el formulario, y poniendo algo de código JS y usando AJAX… mas vueltas que una calesita en domingo…

En fin, andar anda, pero me queda la espina de porque falla… ¿por PHP 5.3.0?.. no lo se…

Saludos, y muchas gracias…

José

Hola José,
Aún no habiamos probado toba en la 5.3 de php, gracias por el reporte de error, en cuanto tengamos la solución avisamos.

José, te cuento que se está laburando en algunos cambios para que toba funcione correctamente con php 5.3. Por ello es que en el paso 2 de la instalación se recomienda 5.2.5 y no se recomienda versiones superiores a ésta (http://desarrollos.siu.edu.ar/trac/toba/wiki/Instalacion). De todas maneras podrías adjuntarnos la solución que encontraron para este bug?.

aquí les paso el código… lo primero es la extensión del formulario en cuestión… lo segundo es la extensión del ci al que el formulario pertenece, deje solo la parte del código referente a la solución del problema…

<?php
class formulario_detalle extends toba_ei_formulario
{
	//-----------------------------------------------------------------------------------
	//---- JAVASCRIPT -------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function extender_objeto_js()
	{
		echo "
		//---- Procesamiento de EFs --------------------------------
		
		{$this->objeto_js}.evt__ID_CTA_MON__procesar = function()
		{
			this.controlador.evt__formulario_detalle__get_desc_cuenta();
		}
	  ";
	}
}

?>


<?php
class ci_editor_asientos_automaticos extends toba_ci
{
	/**
	 * Metodo invocado desde JS para 'get_desc_cuenta'
	 */
	function ajax__get_desc_cuenta($parametros, toba_ajax_respuesta $respuesta)
	{
		$where[] = 'ID_CTA_MON = '.quote("{$parametros['ID_CTA_MON']}");
		$datos = dt_T_CONT_CUENTAS::get_listado($where);
		
		//-- Paso la información a JS
		$respuesta->set(Array('DENOMINACION'=>$datos[0]['DENOMINACION']));
	}

	function extender_objeto_js()
	{
		echo "		
			/**
			 * Acción disparada desde el popup ID_CTA_MON
			 */
			{$this->objeto_js}.evt__formulario_detalle__get_desc_cuenta = function() {
				//--- Construyo los parametros para enviar, en este caso son los valores del form
				var parametros = this.dep('formulario_detalle').get_datos();
				
				//--- Hago la peticion de datos al server, la respuesta vendra en el método this.mostrar_desc
				this.ajax('get_desc_cuenta', parametros, this, this.mostrar_desc);
				
				//--- Evito que el mecanismo 'normal' de comunicacion cliente-servidor se ejecute
				return false;
			}
			
			/**
			 * Acción cuando vuelve la respuesta desde PHP
			 */
			{$this->objeto_js}.mostrar_desc = function(datos)
			{
				if (datos != ''){
					$('ef_form_3359_formulario_detalleID_CTA_MON_desc').value = datos['DENOMINACION'];
				}
			}			
		";
	}
}

?>


Gracias José,
Efectivamente era un bug de Toba en PHP 5.3, una funcion que se estaba usando mal y en versiones anteriores no chillaba.

Ya incluimos este fix junto a otras soluciones de bugs en la versión 1.4.5.

Si vas a trabajar con Toba 1.3 avisanos así subimos el fix a esa rama.

cuanto me alegro que hayan encontrado el problema y, más que nada, la solución…

y contestando a tu pregunta; si, sería importante que el fix se encuentre en la versión 1.3 de TOBA dado que no podemos migrar a la versión 1.4.x

nuevamente gracias por todo

Saludos.

José

Subí el fix a la rama 1.3, si utilizan SVN apuntando a http://desarrollos.siu.edu.ar/svn/toba/trunk_versiones/1.3 toman el cambio haciendo un update sobre la carpeta toba.