Tengo un formulario simple en HTML que contiene dos botones. Botón 1 cuya acción en la etiqueta del formulario la envía a otra página php, p. Ej. button1-action.php que envía datos a una API de terceros y al Botón 2 que quiero enviar a la misma página si se hace clic en él sin ir a button1-action.php. En su método más simple, la forma es la siguiente:

<?php 
echo '<form name="form123" id="form123" action="button1-action.php" method="POST">';
echo '<input type="text" name="first_name" id="first_name></input>';
echo '<button name="button1" id="button1" value="button1">Button 1</button>';
echo '<button name="button2" id="button2" value="button2">Button 2</button>';

echo '</form>';

?>

Esto es lo que probé hasta ahora

$action = null;
if (isset($_POST['button1'])) {
  $action = 'button1-action.php';
} elseif (isset($_POST['button2'])) {
  $action = $_SERVER["PHP_SELF"];
}
echo '<form name="form123" id="form123" action="' . $action . '" method="POST">';
echo '<input type="text" name="first_name" id="first_name></input>';
echo '<button name=" button1" id="button1" value="button1">Button 1</button>';
echo '<button name="button2" id="button2" value="button2">Button 2</button>';

echo '</form>';

Sin embargo, no parece estar funcionando. Traté de buscar soluciones pero no tuve éxito.

Estoy interesado en cualquier solución, pero preferiría resolverla usando PHP y no JavaScript.

0
MtDemonics 16 jun. 2021 a las 09:56

5 respuestas

La mejor respuesta

Parece que está utilizando el valor enviado desde el formulario para establecer la acción del formulario. Esto no tiene sentido: cuando lea los valores enviados, la acción ya ha ocurrido. Entonces, su código simplemente establecería la acción para la próxima vez que se envíe el formulario. Inútil.

En el corazón de esto parece haber un problema conceptual / de diseño. Un enfoque más sensato (pero no el único) sería simplemente publicar el formulario en el mismo lugar cada vez, y luego usar declaraciones if para decidir qué hacer a continuación.

E.g.

if (isset($_POST['button1'])) {
  require_once "button1-action.php";
} elseif (isset($_POST['button2'])) {
  //do whatever it is you want to do in ths script
}
else {
?>
  <form name="form123" id="form123" method="POST">';
    <input type="text" name="first_name" id="first_name></input>
    <button name=" button1" id="button1" value="button1">Button 1</button>
    <button name="button2" id="button2" value="button2">Button 2</button>
    </form>
<?php
}

Para mejorar un poco más en eso, en lugar de usar un require simple para incluir el código de otro script, podríamos encapsular el código de button1-action.php en una función que podamos llamar, en lugar de un script con alcance global. Esto hace que el código sea más reutilizable, mantenible, comprobable, menos probable que cause conflictos de alcance, etc.

E.g.

if (isset($_POST['button1'])) {
  callTheApi($_POST["first_name"]);
} elseif (isset($_POST['button2'])) {
  doSomethingElse($_POST["first_name"]);
}
else {
?>
  <form name="form123" id="form123" method="POST">';
    <input type="text" name="first_name" id="first_name></input>
    <button name=" button1" id="button1" value="button1">Button 1</button>
    <button name="button2" id="button2" value="button2">Button 2</button>
    </form>
<?php
}

(Aún mejor si luego encapsula esa función en una clase que contiene una funcionalidad estrechamente relacionada, pero vayamos tan lejos como una función por ahora).


Alternativamente, la respuesta de Virender Kumar también sería razonable, simplemente configurando la acción de formulario de cada botón directamente.

1
ADyson 16 jun. 2021 a las 08:20

Editar: ignore mi solución; La solución de Virender Kumar aquí es correcta, elegante y no necesita JS.

Respuesta original: El problema no está en los botones, sino en el hecho de que un formulario solo puede publicarse en un único punto final (el atributo action). Tendrá que manejar lo que sucede con los datos del formulario desde allí. Si realmente desea que su formulario se publique en un punto final diferente en el cliente según el botón en el que haga clic el usuario, no puede hacerlo sin JavaScript.

Si puede vivir con JS, esto podría funcionar:

<body>
  <!-- your form here -->

  <script>
    const form = document.forms[0]; // assuming your form is the first form on the page, or the only one
    document.querySelectorAll('button').forEach(button => {
      button.addEventListener('click', event => {
        if (event.target.name === 'button1') {
          form.action = 'button1-action.php';
        } else if (event.target.name === 'button2') {
          form.action = 'other-destination';
        }
      });
    });
  </script>
</body>
1
Phortuin 16 jun. 2021 a las 13:22

En primer lugar, su formulario no está estructurado correctamente.

index.php

<form name="form123" id="form123" action="button1-action.php">
    <input type="text" name="first_name" id="first_name"></input>
    <button name=" button1" id="button1" value="button1">Button 1</button>
    <button name="button2" id="button2" value="button2">Button 2</button>
 </form>

button1-action.php

if (isset($_GET['button1'])) {
  echo 'button1 submitted'; // Send data to the third party API
} else if (isset($_GET['button2'])) {
  echo 'button1 submitted'; // Submit on the same page
}
1
Biswajit Biswas 16 jun. 2021 a las 07:31

Esta es la solución para ti en html.

<form name="form123" id="form123"  method = "post">
<input type="text" name="first_name" id="first_name"></input>
<button name=" button1" id="button1" value="button1" formaction="button1-action.php" >Button 1</button>
<button name="button2" id="button2" value="button2" >Button 2</button> 
</form>

El botón 1 enviará el formulario a button1-action.php y el botón 2 enviará el formulario a la misma página.

Documentación: https: //developer.mozilla. org / en-US / docs / Web / HTML / Element / button # attr-formaction

2
ADyson 16 jun. 2021 a las 08:11

El problema podría ser que olvidó cerrar la etiqueta <form> con </form> y debería usar <input> para los botones también con type="submit". Si esto aún no resuelve su problema, tal vez debería intentar esto:

En la misma pagina.

    <?PHP
 ////  place this on top
         if($_POST["button1"]) {

         // add code to send data to Third Party API

             }

         if($_POST["button2"]) {

           //  will show data here 

            } ?>
////////



<?php 
echo '<form name="form123" id="form123" action="/">';
echo '<input type="text" name="first_name" id="first_name></input>';
echo '<input type="submit" name="button1" id="button1" value="button1" >';
echo '<input type="submit" name="button2" id="button2" value="button2" >';
echo '</form>';
?>

Espero que esto responda a tu pregunta 😊

2
Ahsan Aman 16 jun. 2021 a las 07:13