Cuando escribimos con el symfony un form_remote_tag(), si luego pretendemos, a traves de javascript, realizar acciones cuando el evento ’submit’ del formulario ocurra, tendremos que andarmos con mucho ojo.
Cuando en symfony escribimos:

 echo form_remote_tag(array(
    'update'=>'formulario',
    'url'=>'forms/microMasInfo',
    'script'=>'true'));

el symfony genera:

<form onsubmit="new Ajax.Updater('formulario',
                                 '/forms/microMasInfo',
                                 {
                                   asynchronous:true,
                                   evalScripts:true,
                                   parameters:Form.serialize(this)
                                  }); return false;"
        action="/forms/microMasInfo" method="post">

Es decir, el symfony genera un form que dispara, en el evento submit, un ajax updater y luego cancela el evento submit. Así que si ponemos un

Event.observe('form','submit',testFunction);

‘testFunction’ se disparará con el evento submit, pero después del ajax.updater ; return false; (he investigado y no se puede cambiar el orden de la cola en la que se van poniendo las funciones que escuchan a cierto evento), así que si pretendíamos que ‘testFunction’ hiciera algún código que tenía que hacerse previamente al submit, no nos va a funcionar, porque el submit ya murió, y los datos del form se envían de “otra forma” (a través del Form.serialize(this) ).
Yo me enfrenté a esta situación porque necesitaba que, en ciertos microsites, se realizaran ciertas acciones javascript antes de que se enviaran los datos del formulario. Al final tuve que hacer:

/** cancelamos los retornos de carro en los inputs de texto **/
myForm.getInputs('text').each(function(iE)
                              {
                                Event.observe(iE,'keypress',cancelReturnKey);
                               });
/** observamos el evento 'click' en el submit **/
myForm.getInputs('submit').each(function(sE)
                                {
                                  Event.observe(sE,'click',addPromo);
                                 });

function cancelReturnKey(e)
{
  if(e.keyCode == Event.KEY_RETURN)
  {
    Event.stop(e);
  }
}
function addPromo(e)
{
/** codigo para hacer cosas 'antes' de que el formulario envie la info **/
.. ...
.. ..
}

2 Comments on “el form_remote_tag() y el evento submit”

You can track this conversation through its atom feed.

  1. Sergio says:

    Hola,

    para poder antes ejecutar javascript y luego realizar el llamado a la accion podes emplear el uso de:

    echo form_remote_tag(array(
    ‘update’=>’formulario’,
    ‘url’=>’forms/microMasInfo’,
    ‘before’ => ‘if(!fxMsg(“pepe”)) return false’,
    ));

    la linea: ‘before’ => ‘if(!fxMsg(“pepe”)) return false’,
    hace el llamado a javascript

  2. JoeZ says:

    Muchas gracias!

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>