Mam prosty formularz w HTML, który zawiera dwa przyciski. Przycisk 1, którego akcja w tagu formularza przesyła go do innej strony php np. button1-action.php, który przesyła dane do zewnętrznego API i Buttona 2, który chcę przesłać do tej samej strony, jeśli zostanie kliknięty bez przechodzenia do button1-action.php. W najprostszej metodzie forma wygląda następująco:

<?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>';

?>

To właśnie próbowałem

$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>';

Jednak wydaje się, że to nie działa. Próbowałem szukać rozwiązań, ale bezskutecznie.

Interesuje mnie dowolne rozwiązanie, ale wolałbym je rozwiązać za pomocą PHP, a nie JavaScript.

0
MtDemonics 16 czerwiec 2021, 09:56

5 odpowiedzi

Najlepsza odpowiedź

Wygląda na to, że używasz wartości przesłanej z formularza, aby ustawić działanie formularza. To nie ma sensu - zanim przeczytasz przesłane wartości, akcja już się odbyła. Więc twój kod po prostu ustawi akcję na następne przesłanie formularza. Nieprzydatne.

W centrum tego wydaje się leżeć problem koncepcyjny / projektowy. Bardziej rozsądnym podejściem (ale nie jedynym) byłoby po prostu wysłanie formularza za każdym razem w to samo miejsce, a następnie użycie instrukcji if, aby zdecydować, co dalej.

Na przykład

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
}

Aby to poprawić, zamiast używać gołego require do dołączenia kodu z innego skryptu, moglibyśmy zahermetyzować kod z button1-action.php w funkcję, którą możemy wywołać, zamiast skryptu z Zakres globalny. Dzięki temu kod jest bardziej użyteczny, konserwowalny, testowalny, rzadziej powoduje konflikty zakresu itp.

Na przykład

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
}

(Nawet lepiej, jeśli następnie zamkniesz tę funkcję w klasie zawierającej ściśle powiązaną funkcjonalność, ale na razie przejdźmy do funkcji).


Alternatywnie, odpowiedź Virendera Kumara też byłaby rozsądna – po prostu ustawiając akcję formularza bezpośrednio dla każdego przycisku.

1
ADyson 16 czerwiec 2021, 08:20

Edycja: zignoruj ​​moje rozwiązanie; Rozwiązanie Virendera Kumara tutaj jest poprawne, eleganckie i nie wymaga JS.

Oryginalna odpowiedź: Problem nie dotyczy przycisków, ale faktu, że formularz można publikować tylko w jednym punkcie końcowym (atrybut action). Będziesz musiał zająć się tym, co dzieje się z danymi formularza stamtąd. Jeśli naprawdę chcesz, aby Twój formularz został przesłany do innego punktu końcowego w kliencie na podstawie przycisku, który kliknie użytkownik, nie możesz tego zrobić bez JavaScript.

Jeśli potrafisz żyć z JS, może to zadziałać:

<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 czerwiec 2021, 13:22

Przede wszystkim Twój formularz nie ma prawidłowej struktury.

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 czerwiec 2021, 07:31

To jest rozwiązanie dla Ciebie w 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>

Button 1 prześle formularz do button1-action.php a przycisk 2 prześle formularz do tej samej strony.

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

2
ADyson 16 czerwiec 2021, 08:11

Problem może polegać na tym, że zapomniałeś zamknąć tag <form> za pomocą </form> i powinieneś użyć <input> dla przycisków oraz type="submit" . Jeśli to nadal nie rozwiąże problemu, może powinieneś spróbować tego:

Na tej samej stronie.

    <?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>';
?>

Mam nadzieję, że to odpowie na Twoje pytanie 😊

2
Ahsan Aman 16 czerwiec 2021, 07:13