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.
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
Posted on September 24, 2008 at 7:44 pm.
Muchas gracias!
Posted on September 25, 2008 at 1:28 pm.