Extensión en combo_editable (Problema al recargar combo)

Hola buen dia!
Nos encontramos con el siguiente problema:
Tenemos un formulario con un combo_editable, que se llena con un array de 2 parametros. Al enviar el formulario, si éste no pasa alguna de las validaciones, los EF intentan persistir los datos al recargar la página y el combo_editable se rompe porque intenta recuperar el dato con un valor y recibe un array.

El error que muestra es :

 toba_error_def: Se esta pasando un array o una matriz a un campo que espera un valor escalar [TRAZA]
toba_error_def: Se esta pasando un array o una matriz a un campo que espera un valor escalar in C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\lib\toba_escapador.php:72
Stack trace:
#0 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\lib\toba_escapador.php(23): toba_escapador->quitar_tags(Array)
#1 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\lib\toba_varios.php(866): toba_escapador->escapeHtml(Array)
#2 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\lib\interface\toba_form.php(38): texto_plano(Array)
#3 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\efs\toba_ef_combo_editable.php(76): toba_form::select('ef_form_2426_fr...', '31', Array, 'ef-combo', ' tabindex='2'', NULL)
#4 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_formulario.php(1230): toba_ef_combo_editable->get_input()
#5 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_formulario.php(1241): toba_ei_formulario->generar_input_ef('id_area', true)
#6 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_formulario.php(1176): toba_ei_formulario->get_input_ef('id_area')
#7 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_formulario.php(1140): toba_ei_formulario->get_html_ef('id_area', NULL)
#8 C:\Proyectos_toba\weme3-0\php\consultas\ope_form_desarchivar.php(16): toba_ei_formulario->generar_html_ef('id_area')
#9 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_formulario.php(996): ope_form_desarchivar->generar_layout()
#10 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_formulario.php(976): toba_ei_formulario->generar_formulario()
#11 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_pantalla.php(564): toba_ei_formulario->generar_html()
#12 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_pantalla.php(548): toba_ei_pantalla->generar_layout()
#13 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_pantalla.php(514): toba_ei_pantalla->generar_html_contenido()
#14 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ei_pantalla.php(453): toba_ei_pantalla->generar_html_cuerpo()
#15 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\componentes\interface\toba_ci.php(835): toba_ei_pantalla->generar_html()
#16 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\toba_solicitud_web.php(252): toba_ci->generar_html()
#17 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\toba_solicitud_web.php(185): toba_solicitud_web->servicio__generar_html(Array)
#18 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\toba_solicitud_web.php(60): toba_solicitud_web->procesar_servicios()
#19 C:\Proyectos_toba\weme3-0\vendor\siu-toba\framework\php\nucleo\toba_nucleo.php(96): toba_solicitud_web->procesar()
#20 C:\Proyectos_toba\weme3-0\www\administracion.php(34): toba_nucleo->acceso_web()
#21 {main}

Nuestra solución fue agregarle una validación al archivo toba_ef_combo_editable.php dentro del nucleo:

		if (is_array($this->opciones)){
			$this->opciones = $this->opciones[0];
		}
                   $html .= toba_form::select($this->id_form, $estado ,$this->opciones, 'ef-combo', $js . $this->input_extra.$extra, $this->categorias);

Para que de esta manera, si el valor que recibe es un array, reciba el valor que necesita y recargue correctamente.
Mi pregunta es: Existe alguna manera de extender el combo_editable para no tener que estar tocando el núcleo? O es una especie de bug y esperamos una corrección?

Saludos


error.png

error.png

Hola Lucas,

Cuando decís, “se llena”… asumo que te estas refiriendo al valor que recibe después de pasar por el conf__formulario no?.. o seria una clave compuesta que se envía como respuesta cuando tipeas el valor de búsqueda?.
En el primer caso, como definieron en toba_editor la parte del metodo de carga?.. ahi tuvieron que especificar un par clave/descripcion… como lo cargaron?

Nuestra solución fue agregarle una validación al archivo toba_ef_combo_editable.php dentro del nucleo:
		if (is_array($this->opciones)){
			$this->opciones = $this->opciones[0];
		}
                   $html .= toba_form::select($this->id_form, $estado ,$this->opciones, 'ef-combo', $js . $this->input_extra.$extra, $this->categorias);</blockquote>

El inconveniente real, es que ya sea la columna clave o la descripción… uno de ambos es un arreglo cuando debería ser un valor escalar.
Las unicas dos maneras de que pase eso son:

  • que se coloque un arreglo via set_estado
  • que se coloque un arreglo via set_opciones

Me inclino a pensar que es el segundo caso, si te fijas en el codigo tiene la siguiente leyenda.

//--- No se actualiza $this->opciones_cargadas porque los combos_editables requieren //--- que siempre se refresquen sus opciones porque se basan en su estado //--- En cambio se cambia su descripcion

Que basicamente es lo mismo a decir, esto fija la descripcion unicamente porque las opciones dependen del estado.

Para que de esta manera, si el valor que recibe es un array, reciba el valor que necesita y recargue correctamente. Mi pregunta es: Existe alguna manera de extender el combo_editable para no tener que estar tocando el núcleo? O es una especie de bug y esperamos una corrección?
Lo unico que se podría agregar es un control para que si se envía un arreglo a set_opciones, se dispare un error... y así se pueda corregir en desarrollo el uso del método. Elegir en ese punto una opcion es imposible ya que no necesariamente el ef tiene estado... y nada garantiza que solo exista una.

Saludos