[SOLUCIONADO] - Se pueden armar formularios dinámicos ?

El caso es el siguiente:

Deseo, en tiempo de ejecución, agregar efs a un formulario.

No me sirve el multilineas porque los efs a agregar no son iguales ni contienen el mismo campo.

El objetivo es agregar efs en función de los parámetros de requisitos que los usuarios definan para distintos tipos de habilitación. Dado que estos requisitos varian tanto por tipo de habilitación como en el tiempo según leyes y ordenanzas, quería hacer el pedido de requisitos de forma paramétrica.

He probado con lo siguiente, y si bien no me da error, no me muestra el ef ‘ef04’:

function conf__prueba_ptll(toba_ei_formulario $form) { //$form->set_datos();
		$form->ef('ef01')->set_estado('201001090151200');
		$form->ef('ef02')->set_estado('mi valor');
		$form->ef('ef02')->set_etiqueta('mi valor:');
		$vector=$form->get_id();
		//toba::notificacion()->agregar('id: '.$vector[1]);
		$form->agregar_dependencia('ef04','prclaudio',$vector[1],'ef_editable');
		

}</blockquote>

No se si voy más o menos rumbeao.

Gracias por vuestra atención.

Hola Claudio, eso no te funciona porque el agregar_dependencia solo agrega componentes, no efs. Te recomiendo la lectura de este hilo de discusión que se origino en la vieja lista de mails de toba

[Toba.usuarios] ef's creados dinámicamente
. Cualquier duda lo continuamos por acá dale?.

Saludos.

Hola Rodrigo, gracias por atenderme.

Te cuento que seguí el hilo que me indicaste.
De allí copié el código del método ini() y lo adapté a mis valores.
Eliminé una linea porque blanqueaba el array.

Evidentemente setea los metadatos extendidos porque un print_r en el método de configuración del formulario me trae los datos del ef que defino dinámicamente, pero este no se ve reflejado en el formulario. Ahí me perdí.

Te envío imágenes y el código para que, cuando tengas un ratito de ganas, le pegues una mirada.

Gracias.

class ci_prueba_ptll extends toba_ci
{
	//-----------------------------------------------------------------------------------
	//---- frm_prueba_ptll --------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__prueba_ptll(toba_ei_formulario $form)
	{
		//$form->set_datos();
			$vector=$this->dep('prueba_ptll')->get_id();
			$clave = array('componente' => $vector[1], 'proyecto' => $vector[0]);
			
	        $metadatos = toba_cargador::instancia()->get_metadatos_extendidos($clave, 'toba_ei_formulario');
			print_r($metadatos['_info_formulario_ef'][3]);
			
		
		
			$form->ef('ef01')->set_estado('201001090151200');
			$form->ef('ef02')->set_estado('mi valor');
			$form->ef('ef02')->set_etiqueta('mi valor:');
			
			

	}

	function ini()
	{
			$vector=$this->dep('prueba_ptll')->get_id();
			
			
			
			$clave = array('componente' => $vector[1], 'proyecto' => $vector[0]);
			
	        $metadatos = toba_cargador::instancia()->get_metadatos_extendidos($clave, 'toba_ei_formulario');
	        
	        
	        
	        $nuevo_ef = array(
	            'identificador'  => 'ef04',
	            'columnas' => 'ef04',
	            'obligatorio' => 0,
	            'elemento_formulario' => 'ef_editable',
	            'etiqueta' => 'NUEVO!!!',
	            'descripcion' => 'Este ef se añadio dinámicamente',
	            'inicializacion' => '',
	            'colapsado' => 0,
	            'desactivado' => 0,
	            'objeto_ei_formulario_proyecto' => $vector[0],
	            'objeto_ei_formulario' => $vector[1],
	            'orden' => 4,
	            'oculto_relaja_obligatorio' => 0
	        				);
	        				
	        //$metadatos['_info_formulario_ef'] = array();
	        $metadatos['_info_formulario_ef'][] = $nuevo_ef;
	        
	        toba_cargador::instancia()->set_metadatos_extendidos($metadatos, $clave);
	}
	.....


Agrego información para quienes quieran investigar el tema:

Al evento aceptar del botón que se ve en pantalla, le agregué unas lineas de código que no navegan hacia ningún otro lado, así que, cuando se hace click en el mismo me muestra una notificación y, automáticamente, toba recarga la pantalla.
La sorpresa es que cuando la recarga me muestra el ef “ef04” que defino en el evento ini().
La segunda sorpresa es que, cada vez que hago click, me agrega otro ef más.

Para evitar los efectos de la “segunda sorpresa”, puse el código que agrega el ef en el evento ini__operacion(), y lo agrega solo una vez.

Lo que no puedo lograr es que lo agregue de entrada, es decir, que cuando entro a la pantalla ya me muestre el formulario con el ef agregado dinámicamente, y no luego del primer click en aceptar.


Espero que a quienes conocen toba con más profundidad esta información les sea de utilidad para encontrar la solución.

Desde ya, gracias por su atencion.

Hola Claudio,

el tema es el siguiente, si miras al comienzo de tu codigo tenes una llamada ‘$vector=$this->dep(‘prueba_ptll’)->get_id();’ , el tema es que esa llamada hace que se cargue la dependencia del formulario, el mismo se inicializa con los metadatos que trae de la base y la lista de efs que se van a utilizar se arma en ese momento.
Para cuando vos haces el set_metadatos_extendidos() esa lista ya se armo y no tenes forma de modificarla, sin embargo para el proximo pedido de pagina los metadatos ya fueron modificados y la lista que se arma ahora incluye el nuevo ef.

Para que eso no te suceda lo que tenes que hacer es armar el arreglo de la forma que esta en el ejemplo que te paso rodrigo. Osea la cosa vendria a ser asi:


$clave = array('componente' => 'id_componente', 'proyecto' => toba::proyecto()->get_id());

No te preocupes por fijar el Id del componente en codigo ya que a menos que lo borren y lo vuelvan a crear no va a cambiar por mas que lo trasladen a otra maquina.

Saludos

Estimado Richard, como siempre, ud. dió en el centro.

Ahora funciona perfectamente, lo que me abre posibilidades interesantes a la hora de parametrizar un sistema que está en etapa de análisis. Desde ya, muchas gracias.

Adjunto imágen y el código para que pueda ser útil a otros colegas.

	//-----------------------------------------------------------------------------------
	//---- frm_prueba_ptll --------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function conf__prueba_ptll(toba_ei_formulario $form)
	{
		//$form->set_datos();
		
			$form->ef('ef01')->set_estado('201001090151200');
			$form->ef('ef02')->set_estado('mi valor');
			$form->ef('ef02')->set_etiqueta('mi valor:');
			$form->ef('ef04')->set_estado(255);

	}
        
       #------
	function ini__operacion()
	{
			//$vector=$this->dep('prueba_ptll')->get_id();
						
			$clave = array('componente' => 1000944, 'proyecto' => 'prclaudio');
			
	        $metadatos = toba_cargador::instancia()->get_metadatos_extendidos($clave, 'toba_ei_formulario');
	        
	        
	        
	        $nuevo_ef = array(
	            'identificador'  => 'ef04',
	            'columnas' => 'ef04',
	            'obligatorio' => 0,
	            'elemento_formulario' => 'ef_editable',
	            'etiqueta' => 'NUEVO!!!',
	            'descripcion' => 'Este ef se añadio dinámicamente',
	            'inicializacion' => '',
	            'colapsado' => 0,
	            'desactivado' => 0,
	            'objeto_ei_formulario_proyecto' => $vector[0],
	            'objeto_ei_formulario' => $vector[1],
	            'orden' => 4,
	            'oculto_relaja_obligatorio' => 0
	        				);
	        				
	        //$metadatos['_info_formulario_ef'] = array();
	        $metadatos['_info_formulario_ef'][] = $nuevo_ef;
	        
	        toba_cargador::instancia()->set_metadatos_extendidos($metadatos, $clave);
	        
	        
	        
	}