Cómo manejar múltiples botones de envío en un formulario con PHP

El procesamiento de los datos de un formulario en PHP es considerablemente más sencillo que en la mayoría de los otros lenguajes de programación web, un hecho que seguramente ya conoces si has estado utilizando el lenguaje durante un tiempo. Esta simplicidad y facilidad de uso hacen posible realizar algunas tareas bastante complejas con los formularios, incluido el tema que discutiremos hoy: el manejo de diferentes acciones a través de múltiples botones de envío en el mismo formulario.

Índice de Contenido
  1. ¿Por qué múltiples botones de envío?
  2. Un formulario de un solo botón
  3. División con if/else
  4. División con switch/case
  5. Uso de botones de envío gráficos

¿Por qué múltiples botones de envío?

Antes de empezar, permíteme responder a la pregunta obvia: dado que la mayoría de los formularios funcionan perfectamente con un solo botón de envío, ¿por qué alguien necesitaría dos (o más)?

La mejor manera de explicar esa necesidad es con un ejemplo real del último proyecto en el que trabajé. En ese proyecto, se me encargó construir un sistema de inventario para una biblioteca de préstamos de libros. Los títulos de los libros estaban almacenados en una base de datos y los administradores podían utilizar una interfaz basada en el navegador para ver el registro de cualquier libro y luego realizar una de cuatro acciones en ese registro: préstamo a un miembro, devolución de un miembro, marcar como perdido y marcar como vendido.

Todas estas actividades se manejaban a través de un solo formulario, que tenía botones correspondientes a las acciones mencionadas anteriormente. Dependiendo de qué botón se hiciera clic, los datos ingresados en el formulario se procesaban de diferentes formas (los préstamos y devoluciones estaban conectados con los registros de membresía; marcar como perdido o vendido actualizaban las tablas de inventario). Dado que un formulario solo puede tener una acción, el mismo script de PHP tenía que manejar las cuatro tareas, identificando qué botón se había hecho clic y ejecutando el código correspondiente. Así surgió la necesidad de un solo formulario con múltiples botones de envío y un script de procesamiento de formularios con la inteligencia necesaria para distinguir entre cada uno.

Un formulario de un solo botón

Comenzaré con un ejemplo sencillo, un formulario único con un solo botón de envío, para asegurarme de que comprendas los conceptos básicos y proporcionar una base para el ejemplo más complejo. Aquí está el formulario:

<html><head>Formulario de un solo botón</head>
<body>
<form action="procesador.php" method="post"> Ingrese un número: <input type="text" name="numero" size="3"> <br>
<input type="submit" name="enviar" value="Enviar"> </form>
</body>
</html>

Y aquí está el script procesador.php que se invoca al enviar el formulario:

Cómo parsear datos XML de manera sencilla con Perl
<?php
// verificar el envío
// recuperar el valor de los datos enviados
if ($_POST['enviar'])
{
    echo "Ingresaste el número " . $_POST['numero'];
}
?>

Cuando se envía un formulario a un script de PHP, PHP crea automáticamente un array asociativo especial llamado $_POST o $_GET, dependiendo del método de envío utilizado (supondré el método POST en este tutorial). Los valores ingresados en los campos de entrada del formulario se convierten automáticamente en pares clave-valor en este array y luego se pueden acceder utilizando la notación de array regular.

Presta especial atención a cómo se maneja el botón de envío en el script anterior. Cuando se envía el formulario, el propio botón de envío se convierte en un elemento en el array $_POST, con una clave correspondiente a su "nombre". Esto es claramente visible al agregar la línea:

print_r($_POST);

al final del script PHP anterior. Puedes ver dentro del array y notar claramente la correspondencia entre los controles del formulario y sus representaciones en PHP.

Ahora veamos cómo manejar formularios con múltiples botones de envío.

División con if/else

Vamos a complicar un poco las cosas agregando un segundo botón de envío al formulario:

<html><head>Formulario de múltiples botones de envío</head>
<body>
<form action="procesador.php" method="post"> Ingrese un número: <input type="text" name="numero" size="3"> <br>
<input type="submit" name="sumar" value="Sumar 10"> 
<input type="submit" name="restar" value="Restar 10"> </form>
</body>
</html>

Dado que ambos botones de envío invocarán el mismo script de procesamiento de formularios de PHP, ese script debe ser modificado para "saber" cuál se hizo clic para poder responder adecuadamente.

Cómo definir y utilizar tipos de datos definidos por el usuario (UDT) en Visual Basic

Dado que ya sabes que el botón de envío aparece en el array PHP $_POST y se identifica por su atributo "name", es simple (1) dar a cada botón de envío en el formulario un nombre único y (2) escribir un simple condicional "if" en la parte superior del procesador de formularios de PHP para verificar qué clave aparece en el array $_POST y ramificar el código de manera apropiada. Eso es exactamente lo que hace el siguiente script:

<?php
// verificar qué botón se hizo clic
// realizar el cálculo
if ($_POST['sumar'])
{
    echo $_POST['numero'] . " + 10 = " . ($_POST['numero']+10);
} 
else if ($_POST['restar']) 
{
    echo $_POST['numero'] . " - 10 = " . ($_POST['numero']-10);
}
?>

Si tienes varios botones de envío, una buena idea es usar un enunciado switch/case para manejar las diferentes ramas de código de manera más eficiente.

División con switch/case

En el ejemplo anterior, distinguí entre botones utilizando nombres de atributos diferentes para los botones de envío en el formulario. Una alternativa es darle a todos los botones de envío el mismo nombre pero valores diferentes:

<html><head>Formulario de múltiples botones de envío con switch/case</head>
<body>
<form action="procesador.php" method="post"> Ingrese un número: <input type="text" name="numero_1" size="3"> <br>
Ingrese otro número: <input type="text" name="numero_2" size="3"> <br>
<input type="submit" name="calcular" value="sumar"> 
<input type="submit" name="calcular" value="restar"> 
<input type="submit" name="calcular" value="multiplicar"> </form>
</body>
</html>

El script de procesamiento necesita verificar el valor del elemento $_POST['calcular'] y dividir el código de manera apropiada. La forma más eficiente de hacer esto es con un enunciado switch-case, de la siguiente manera:

<?php
// dividir en base al valor de 'calcular'
switch ($_POST['calcular']) {
    // si calcular => sumar
    case 'sumar':
        echo $_POST['numero_1'] . " + " . $_POST['numero_2'] . " = " . ($_POST['numero_1']+$_POST['numero_2']);
        break;
    // si calcular => restar
    case 'restar':
        echo $_POST['numero_1'] . " - " . $_POST['numero_2'] . " = " . ($_POST['numero_1']-$_POST['numero_2']);
        break;
    // si calcular => multiplicar
    case 'multiplicar':
        echo $_POST['numero_1'] . " x " . $_POST['numero_2'] . " = " . ($_POST['numero_1']*$_POST['numero_2']);
        break;
}
?>

Según qué botón se haga clic, se pasa el valor correspondiente al script de procesamiento y se invoca el bloque "case" correspondiente. Si tienes un gran número de botones de envío con los que lidiar, este enfoque es más fácil de leer y entender que múltiples bloques de "if-else".

Pero, ¿qué sucede cuando tienes botones de envío gráficos en lugar de basados en texto?

Cómo crear un portal empresarial efectivo para tu negocio

Uso de botones de envío gráficos

Un pequeño giro en la historia ocurre cuando usas un botón de envío gráfico, como en el siguiente formulario simple:

<html><head>Botón de envío gráfico</head>
<body>
<form action="procesador.php" method="post"> Buscar: <input type="text" name="q"> 
<input type="image" name="go" src="/images/go.gif"> </form>
</body>
</html>

Cuando se envía este formulario a PHP para su procesamiento, mira lo que contiene el array $_POST:

Array
(
    [q] => magpie
    [go_x] => 13
    [go_y] => 13
)

Debido a que es un botón gráfico, PHP realmente realiza un seguimiento de las coordenadas del clic del ratón y crea dos elementos en el array resultante para almacenar esas coordenadas. Los elementos se llaman [nombre_boton]_x y [nombre_boton]_y, respectivamente.

¿Por qué es esto importante? Bueno, si hubieras estado utilizando una prueba if() basada en el atributo "name" del control de envío, la prueba habría fallado porque en lugar de crear un solo elemento accesible a través de $_POST['go'], PHP realmente crea dos elementos llamados $_POST['go_x'] y $_POST['go_y'], respectivamente. Haz una nota mental de esto para futuras referencias, podría ahorrarte tiempo cuando las cosas no funcionen como se espera.

Entonces, ¿qué sucede si tienes múltiples botones de envío gráficos en tu formulario?

<html><head>Múltiples botones de envío gráficos</head>
<body>
<form action="procesador.php" method="post"> Ingrese el número de parte: <input type="text" name="parte"> <br> 
<input type="image" name="ver" src="/imagenes/ver.gif"> 
<input type="image" name="editar" src="/imagenes/editar.gif"> 
<input type="image" name="borrar" src="/imagenes/borrar.gif"> 
<input type="image" name="ordenar" src="/imagenes/ordenar.gif"> </form>
</body>
</html>

Tu script de PHP tendría que contener múltiples ramas, algo como esto:

Cómo utilizar el archivo Global.asax en tu aplicación ASP.NET
<?php
if ($_POST['ver_x']) {
    // código para ver el registro
} else if ($_POST['editar_x']) {
    // código para editar el registro
} else if ($_POST['borrar_x']) {
    // código para borrar el registro
} else if ($_POST["ordenar_x"]) {
    // código para realizar un pedido
}
?>

Por último, aquí tienes un ejemplo real para integrarlo todo. Este ejemplo consiste en un formulario generado dinámicamente con una lista de direcciones de correo electrónico desde la libreta de direcciones de un usuario. El usuario puede seleccionar una o varias direcciones de esta lista y luego agregarlas a una lista de permitidos o a una lista de bloqueados; también puede eliminarlas de la libreta de direcciones. El formulario contiene tres botones de acción correspondientes a estas tres tareas. Echa un vistazo al Listado A.

Observa que, en este caso, los botones de envío están nombrados como elementos de array de PHP, con la clave que representa la acción. Cuando se envía el formulario, este esquema de nomenclatura hace que se cree un array de un solo elemento dentro del array $_POST; esto se puede utilizar para identificar la acción y ejecutar el código apropiado mediante un enunciado switch-case, como puedes ver en el Listado B.

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Desarrollo, allí encontraras muchos artículos similares a Cómo manejar múltiples botones de envío en un formulario con PHP , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.