2010-04-18 11 views
8

Actualmente, cuando diseño mis formularios, me gusta mantener el nombre del botón de envío igual al ID del formulario. Luego, en mi php, acabo de hacer if(isset($_POST['submitName'])) para verificar si se ha enviado un formulario y qué formulario se ha enviado.¿Cuál es la mejor manera de identificar qué formulario se ha enviado?

En primer lugar, ¿hay algún problema de seguridad o defectos de diseño con este método?

Un problema que he encontrado es cuando deseo superponer mis formularios con javascript para proporcionar una validación más rápida al usuario. Por ejemplo, aunque obviamente necesito retener la validación del lado del servidor, es más conveniente para el usuario si se muestra un mensaje de error en línea, al difuminar una entrada. Además, sería bueno proporcionar la validación del formulario completo, al hacer clic en el botón Enviar.

Por lo tanto, cuando el usuario hace clic en el botón de envío del formulario, detengo la acción predeterminada, hago mi validación y luego intento cambiar el nombre de la funcionalidad de envío tradicional, si se aprueba la validación. Para hacer esto, estoy usando el método form.submit() pero, desafortunadamente, esto no envía la variable del botón de envío (como debería ser, ya que se puede llamar a form.submit() sin hacer clic en ningún botón). Esto significa que mi script PHP no puede detectar que el formulario ha sido enviado.

¿Cuál es la forma correcta de evitar esto? Parece que la solución estándar es agregar un campo oculto en el formulario, al pasar la validación, que tiene el nombre de la identificación del formulario. Luego, cuando se invoca form.submit(), esto se transfiere en lugar del botón de envío. Sin embargo, esta solución me parece muy desagradable, por lo que me pregunto si debería:

a) Utilice un método alternativo para detectar qué formulario se ha enviado y no depende de pasar el botón de enviar. Si es así, ¿qué alternativa hay? Obviamente, solo tener un campo oculto adicional desde el comienzo no es mejor.

b) Use una solución alternativa de Javascript que me permita conservar mi diseño que no es de Javascript. Por ejemplo, ¿existe una alternativa a form.submit() que me permita pasar datos adicionales?

c) Chúpalo e inserta un campo oculto usando Javascript.

ACTUALIZACIÓN: He aceptado la respuesta correcta, pero quería aclarar mi error aquí, por lo que sería más útil para los demás. Uso Mootools y muy ingenuamente creí que cuando usaba addEvent ('enviar' ...) necesitaba llamar inmediatamente a event.stop() para evitar que se enviara. En realidad, este no es el caso y solo puedo llamar a event.stop() solo si la validación falla. De lo contrario, el envío predeterminado se activa, como de costumbre, y el uso de form.submit() se vuelve completamente innecesario.

+0

Mi equipo actualmente lo hace de esta manera. No me gusta, ya que ahora se requiere que nuestros formularios tengan un botón de envío. Los chicos que implementaron esto se mudaron a otro equipo; a mí y a otro compañero de equipo nos costó entender por qué nuestros formularios no se enviaban, y luego nos dimos cuenta de que era necesario enviar un botón para validarlo. – b01

Respuesta

6

Puede enviar los formularios a diferentes manejadores con action=file1.php y action=file2.php.

¿Se procesan usando un montón del mismo código? Póngalo en archivos separados, incluya los aspectos comunes y escriba los bits únicos en cada uno de los archivos de manejo. No piratear, organizar.

Para la validación de Javascript, no detienen la acción predeterminada y luego reanudar, en lugar de hacer esto:

if (validation != valid) { 
    return false; 
} 

De esta forma si JS está apagado o la validación falla, la acción del formulario/evento está intacto y se se comporta como se espera, de lo contrario, se agrava. Y sin duda, ciertamente retendrá la validación del lado del servidor. Esa es la validación "real", el lado del cliente es solo para complacer al usuario y ahorrarle tiempo.Nunca confíes en él por TU sake.

+0

He votado esto porque al final es la respuesta "correcta", e incluso si a veces no la usas porque estás pirateando un guión rápido juntos o bajo alguna restricción/fecha límite que no te permite hacerlo, es bueno saber buenas prácticas. –

+0

¡Gracias! ¡Gracias! Esto es perfecto. Mi error fue pensar que para ejecutar cualquier Javascript en el momento de la entrega, tuve que detener inmediatamente la acción de envío predeterminado. En su lugar, puedo hacer todo lo que quiera durante la publicación y el formulario solo se envía después de todo ese código. Por lo tanto, puedo probar la validación fallida y, en ese caso, evitar el valor predeterminado. Esto significa que no necesito form.submit(). ¡Muy agradable! –

+0

¡Genial, me alegro de que sea útil! Hasta que no lo veas, a veces es difícil pensar en la "otra" manera. –

3

Puede personalizar la acción del formulario para agregar una clave/valor get; como action="formhandle.php?formid=10"

+0

Alex Mcp tiene la mejor receta. Pero estoy de acuerdo en que esta es una buena forma rápida de encargarse de las cosas. Cuando tuve esta situación, traté de usar un GET como este; al final, decidí que era más limpio mantener todo en POST. – Smandoli

+0

Curiosamente, acabo de revisar los conceptos RESTful y aprendí que, en principio, GET es para información de "revisión" y POST es para trabajos interactivos o de "edición". No sé cuántas personas se suscriben a esto o lo cumplen. (Lo siento, no puedo vincular-fuente esto en este momento.) – Smandoli

+0

Me gusta esto mejor, porque con la solución de Alex Mcp, aún estás cambiando la acción, pero estás moviendo tu código. ¿Por qué no mantener el código igual y simplemente cambiar la acción? +1 si GET es para revisión. Además, esto es más simple y directo. – b01

Cuestiones relacionadas