[SOLUCIONADO] Problema con múltiples pantallas y CIs

Hola a todos. Les comento que, siguiendo mi filosofía de hacer las cosas de la forma más complicada posible, tengo un problema con varias pantallas y CIs. Específicamente, obtengo un error que dice

componente(2445): No es posible cambiar la pantalla a mostrar porque ya ha sido utilizada.

El detalle del error es un poco más complejo: tengo mis formularios organizados de la siguiente manera

ci_vinculos
– pant_alta
---- ci_alta_vinc
------ pant_seleccion
-------- (montón de efs)
------ pant_datosextra
-------- (más efs)
– pant_modif
---- ci_modif_vinc
------ pant_modif1
-------- (aún más efs)

Como probablemente no pueden verlo así sólo en texto, les comento que con esta estructura lo que uno obtiene es una ventana con dos pestañas (una que dice “alta” y otra que dice “modificación”), donde la primera pestaña tiene dos pantallas, la primera es la de selección de individuo (sobre el cual crear vínculo) y la segunda es para dar los datos que faltan. La segunda pestaña, por su parte, es solamente una pestaña.

Ahora bien, en la primera pestaña, primera pantalla, hay una llamada a “set_pantalla(pant_datosextra)” que me lleva a la segunda pantalla. Si yo, estando en la segunda pantalla, hago click en la pestaña de “modificar” y, una vez que cargó, hago click de vuelta en la pestaña de alta, obtengo el error que comenté más arriba.

Como ven, el error es un error muy particular, pero supongo que a lo mejor alguien tuvo un problema parecido y me puede sugerir por dónde viene el tema.

Gracias de antemano (ya les dí las gracias, así que ahora no se pueden echar atrás)

Aguantame un toque que arranque a probar tu problema y termine arreglando otra cosa XD.

No hay drama, estoy escuchando a Capusotto por Youtube y tengo para rato, así que no tengo apuro

Hola Martin,

despues de conflictos existenciales de indole tobera vuelvo sobre tu problema XD… bueno recree tu situacion con un item en el proyecto toba_referencia, la realidad es que no tuve inconveniente realizando los pasos que me comentas. Amen de eso:

  • Yo estoy trabajandolo en toba 1.4.9, calculo que vos debes estar en alguna de las versiones de la rama 1.4 no? pero no se si en esta misma.
  • Las subclases de los distintos objetos_ci no tienen absolutamente ningun codigo excepto el indispensable para realizar algun cambio de pantalla.

Por tanto y para estar mas en contexto lo que te pediria es si me podes enviar el codigo de las subclases pertenecientes a los objetos_ci, para ver si existe algo que pase por alto.

Gracias (ahora vas a tener que enviarme el codigo)
Richard

Bueno, estuve repasando los pasos necesarios para reproducir el problema, y llegué a los siguientes pasos para hacerlo ocurrir con lo mínimo posible. La versión de toba es 1.4.0, lo cual puede tener algo que ver.
Los pasos son:

  • Crear una nueva operación
  • En la operación, crear un CI con dos pantallas (pant_inicial y pant_secundaria) y definir el tipo de navegación como “Tab Horizontal”.
  • Dentro de pant_inicial, crear un nuevo ci (ci_1) con dos pantallas (pant_11 y pant_12). Crear un archivo .php como subclase de ci_1
  • Dentro del archivo .php, en el método conf__pant_11, agregar el código “$this->set_pantalla(‘pant_12’);”

Con este código, al entrar en la operación se obtiene el mensaje de error “componente(2497): No es posible cambiar la pantalla a mostrar porque ya ha sido utilizada.” También puede obteners al realizar los pasos mencionados anteriormente, pero el problema siempre ocurre al utilizar el método set_pantalla.

Si hace falta, puedo enviar un ejemplo un poco más complejo, pero la esencia del bug está ahí (casi con seguridad por llamar a set_pantalla en el conf_pantalla, calculo)

Hola Martin,
Lamento decirte que se trata de un bug sino de una decision de diseño, una vez que la pantalla se fija la misma no puede ser cambiada por el resto de ese request.
El hecho que estes entrando en el metodo conf__pant_11 implica que dicha pantalla ya fue seleccionada y sera la que se grafique en ese pedido de pagina.
Si lo que deseas es cambiar la pantalla de forma dinamica, lo que deberias hacer es trasladar dicha decision al momento anterior a la seleccion de la pantalla, esto es el metodo conf().

Algo que me olvide de mencionar en mi respuesta anterior y ahora que lo pienso hice automaticamente, fue que yo estaba utilizando un boton con un evento explicito para disparar el cambio de pagina, algo que hice de manera totalmente inconsciente y que esta relacionado con conocer como procesa toba los request. Por eso creo que esta piola pasarte estos links para que te ayuden a entender mejor como trabaja Toba en los pedidos de pagina y de paso si te surgen mas dudas lo podes consultar.

http://desarrollos.siu.edu.ar/trac/toba/wiki/Referencia/Solicitud#Tiposdeservicio

http://desarrollos.siu.edu.ar/trac/toba/wiki/Referencia/Configuracion

Saludos
Richard

Perfecto, eso era, ya parché el código y adiós mensaje.