[SOLUCIONADO] Consultas sobre ei_formulario_ml

Hola Martin, paso a responderte los puntos:

  1. El ML tiene dos formas de trabajar con los eventos:
    a) JS donde los eventos se trabajan del lado cliente y luego se envian como un todo junto con los datos al servidor para ser procesados alli, esto lo recibis en el evento de modificacion del formulario. Esta es la forma actual que estas trabajando vos.

    b) Tipica de pagina web… donde cada evento dispara un pedido de pagina al servidor, es en este modo en el cual se dispara en el servidor el evento pedido_registro_nuevo.

No desesperes… todo tiene solucion o casi XD… lo que podrias hacer para mantener el esquema actual y realizar el control que necesitas es lo siguiente:

  • Extendes el formulario_ml y en el metodo ‘extender_objeto_js’ tendrias que colocar algo por el estilo:

     function extender_objeto_js()
     {
          echo "
                      var cantidad_filas = 0; 
                      var limite_filas = 5;                        //Este limite lo podes sacar de una variable
                     {$this->objeto_js}.crear_fila = function() {
                             var id_fila_nueva =  this.prototype.crear_fila.call();         //Llamo al padre
                             if (cantidad_filas > limite_filas) {
                                           notificacion.agregar('Superaste tu expectativa de vida', 'error');
                                           return false;
                             }
                             if (id_fila_nueva != 'undefined' && id_fila_nueva !== false) {
                                      cantidad_filas++;
                             }
                           return id_fila_nueva;
                      }
          ";
     }
   
  1. Teniendo algo como lo del punto anterior, lo que podrias hacer es antes de hacer el return id_fila_nueva; llamar a un metodo que te coloque los valores por defecto que necesitas, por ejemplo:

       {$this->objeto_js}.inicializar_valores_defecto = function (id_fila) {
             if (id_fila_nueva != 'undefined' && id_fila_nueva !== false) {
                  this.ef('nombre_ef1').ir_a_fila(id_fila).set_estado('estado_defecto1');   
                  this.ef('nombre_ef2').ir_a_fila(id_fila).set_estado('estado_defecto2');
                  //etc..
             }
       }

  1. Lo que te esta faltando en este caso es guardar los datos antes de lanzar la excepcion, esto podes hacerlo de dos maneras, con una variable de clase extra… o subiendo la llamada del procesar_filas… total hasta que no dispares el metodo de sincronizacion… dichos datos solo estan en el datos_tabla. Aca te presento la opcion de la variable extra por si te resulta mas comodo.

function evt__formulario_emails__modificacion($datos)
{
         $this->temporal_datos_recibidos = $datos;
	$cantidad_predeterminados = 0;
	foreach ($datos as $fila) {
		if ($fila['predeterminado'] == true) {
			$cantidad_predeterminados++;
		}
	}
	if (($cantidad_predeterminados > 1) ||
		(($cantidad_predeterminados == 0) && ($this->dep('formulario_emails')->get_cantidad_lineas() > 1))) {
		throw new toba_error('Debe predeterminarse un único email');
	} else {
		if (($cantidad_predeterminados == 0)  && ($this->dep('formulario_emails')->get_cantidad_lineas() == 1)) {
			$datos[0]['predeterminado'] = true;
		}
		$this->get_relacion()->tabla('docentes_emails')->procesar_filas($datos);	
	}
}

Luego en el metodo conf__formulario_emails:


function conf__formulario_emails($form)
{
    if (isset($this->temporal_datos_recibidos)) {
           $form->set_datos($this->temporal_datos_recibidos);
    }
}

Espero haberte sido de ayuda…
Saludos