martes, 18 de agosto de 2009

Múltiples botones submit en un formulario

Necesitaba conseguir lo que dice el título, o sea, disponer de varios botones de submit en un formulario, de modo que, además del envío normal del formulario, pudiese detectar qué botón concreto se ha pulsado para realizar ciertas operaciones en función del mismo.

Lo que no sabía era cómo hacerlo "a la Cake".

Bueno, pues es sencillo:

1. En el formulario, añade un control $form->submit con opciones para indicarle un nombre y un valor que luego podrás capturar en el controller. Por ejemplo:
$form->submit(__('Reset Filter', true), array('value' => true, 'name' => 'resetFilter'))
Ahora, para comprobar si el botón ha sido pulsado, no tienes más que mirar en la propiedad params del controlador, de esta manera:
$this->params['form']['resetFilter']
Que contendrá el valor del botón que hayas pulsado. Es decir, puedes tener varios botones con el mismo "name" y distinto valor, o bien simplemente botones con distintos "name" y chequear si dentro de $this->params['form'] existen las claves correspondientes.

11 comentarios:

Rexter dijo...

Disculpa, no he logrado hacer funcionar eso de varios botones submit, podrias colocar un ejemplo mas detallado?

Frankie dijo...

¿Qué es exactamente lo que no entiendes?

Si pones el botón en la vista y un usuario lo pulsa, eso quedará registrado en el controlador en $this->params['form'].

Henrry Chy dijo...

Hola, interesante tu post pero supongo que deberia ser un poco mas explicativo ya que no entiendo algunas cosas; chvr, de esta forma puedo poner un boton cualquiera (que no sea end) para que haga por ejemplo regresar a la vista anterior, dices que hay que mirar en la propiedad params para saber si fue pulsado el boton, y me podrias decir como exactamente seria la comprobacion?? que hago con $this->params['form']['nombre_boton']... ese 'form' a que se refiere, siempre es form??. Dices que se puede especificar el nombre y el valor, entonces el valor no siempre sera true?? que otros valores puede tomar o solamente ademas false???

Frankie dijo...

Vamos a ver Henrry...

'form' se refiere al formulario y siempre es form. Indica que ese parámetro viene del formulario (no viene la URL por ejemplo). Lo pone CakePHP.

Para identificar el botón ponle un atributo 'name' con el nombre que quieras. Puedes poner varios botones con tal de que tengan names distintos.

El valor será el que le pongas en el atributo value del botón. Mira cómo se define y recuerda cuáles son los atributos HTML. Es decir, que puedes poner en 'value' cualquier valor que a tí te sirva (por ejemplo, yo puse true porque me bastaba con saber que el botón había sido pulsado en lugar del submit normal). (Podría usarse para borrar el registro en vez de grabarlo o para cualquier otra cosa que se te ocurra).

Yo no pondría un botón de estos para volver a la vista anterior, entre otras cosas porque son botones submit y envían el formulario a la acción que lo va a procesar. Para esos casos pon un enlace normal.

Henrry Chy dijo...

Ah ok, ya voy entendiendo mejor... si me dices que este boton envia el formulario a la accion, entonces igual que nada, es la misma cosa que el boton end que tambien hace lo mismo y ya depende de la accion de lo que haga, si es agregar, editar o eliminar... poner un enlace al costado de otro boton que diga "Guardar cambios" creo que no daria, por eso pienso en poner un boton para que este a la par las dos opciones,o vuelves a la vista anteror o guardar los cambios , y bueno, pensaba aprovechar como lo pones tu, si fue pulsado el boton entonces redireccionar, por eso preguntaba como podria ser la comprobacion de la pulsacion, pensaba algo asi:

if($this->params['form']['nombre_boton']== true)
$this->redirect(array('action...)

Corrigeme o confirmame si estoy pensando mal o bien de como utilizar este boton...te agradeceria!!

Frankie dijo...

Algo así.

El uso que ahora mismo estoy haciendo es un formulario para filtrar vistas index. Hay un boton que aplica el filtro y otro que lo resetea (se guardan los ajustes en la sesión).

Podrías tener un botón para Guardar y otro para Guardar y volver a Index, de modo que el usuario pueda escoger entre seguir editando o volver al index.

También podrías usarlo para lo que dices, enviar el formulario y no guardar los cambios, aunque yo prefiero hacerlo con un enlace.

Henrry Chy dijo...

Yo estoy ahurita metiendole ajax a mi sistema web, estoy en una vista de editar la info de los usuarios (eso lo hace el administrador del site) entonces desde su cuenta de administrador con un link (aqui si utilizo enlace y no boton) me voy a la vista donde edita la info, aqui el administrador escoge de la lista que le aparece a la izq la cuenta del usuario que va a modificar, pero osea en esta vista le quiero poner una opcion de regresar en el caso que no va hacer nada, por lo tanto no hay ningun formulario para enviar, por eso quiero utilizar un simple boton que le regrese a su cuenta, osea a su panel de administrador... para eso pienso ponerle este boton submit. Te pregunto esta bien la condicion que hago:

if($this->params['form']['nombre_boton']== true)
$this->redirect(array('action...)

xq ya le probe pero no hace nada :S, no me regresa y ni me sale ningun error, simplemente no hace nada... que otra opcion tengo en todo caso para hacer un boton de regreso a la vista anterior.

Frankie dijo...

Con Ajax no lo he mirado. Puedes hacer un debug ($this->params) en la acción que esperas que procese el formulario para ver qué es lo que le llega.

Henrry Chy dijo...

Ok, bueno amigo, agradezco tu atencion... seguire experimentando haber que me sale jajaja, un saludo hasta otra oportunidad!!! :D

Anabel dijo...

Saludos..... Dejeme decirle que su blog esta espectacular, tiene muy buenos astículos y son muy entendibles, ah! por cierto le felicito por el blog y continue de esa manera contribuyendo con articulos útiles para los visitantes, voy a continuar navenagdo por su blog y le visitare en futuras ocasiones. :):):):):):) La entrada ha resultado muy interesante y entrenida, me he quedado un buen rato lyendola, me despido de usted y hasta la proxima oportunidad.

Martin Ballet dijo...

No se porque se complican tanto. haces 2 botones y que cada uno llame a una funcion que edite el action del formulario y luego le mandas el submit

$("button#btn-nombreBotonSubmit2").click(function(){
var url = ' {$this->Html->url(array("controller"=>"nombreControlador","action"=>"nombreDeAccion"))}'+"/"+$parametrosDistintos";
$("#nombreFormulario-form").attr("action",url );
$("#nombreFormulario-form").submit();
});