Есть ли способ сделать форму отправки дважды? - PullRequest
1 голос
/ 28 июня 2019

Я загружаю значения из файла XML, а затем обновляю XML с помощью формы на странице php. Моя проблема заключается в следующем: у меня есть запрос, выполняющий подсчет узлов, который прекрасно работает, но я также хочу обновить узлы с помощью счетчика и получить точные значения обратно. Когда я отправляю свою форму, она отправляет значения такими, какие они есть, когда я загружаю файл, но для правильного обновления счетчика (потому что мне нужен обновленный счетчик узлов), мне нужно дважды отправить его. Я пытался сделать так, чтобы он отправлял форму в функции загрузки тела, но из того, что я могу выяснить, когда вы нажимаете кнопку «Отправить», он не выполняет полное обновление страницы. Он перезагружает страницу, но я не смог заставить ее запускать какие-либо сценарии или функции загрузки. Альтернатива, о которой я подумал, но не могу понять, как реализовать, - уменьшить счетчик, если я изменю значение параметра на закрытое.

<!DOCTYPE html>
<?php
$xml->load('test.xml');
$xpath = new DOMXpath($xml);
$liftsopen = $xpath->query("//node/Lifts-Open")->item(0);
$lift1status = $xpath->query("//areas/area[@name='Lift1']/lifts/lift[@name='Lift1']/@status")->item(0);
$lift2status = $xpath->query("//areas/area[@name='Lift2']/lifts/lift[@name='Lift2']/@status")->item(0);

$liftcount = 0;
foreach ( $xpath->query('//lifts/lift[@status="OPEN"]') as $count1 )   {
 $liftcount++;
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $lift1->nodeValue = $_POST['lift1statusform'];
    $lift2->nodeValue = $_POST['lift2statusform'];
    $liftsopen->nodeValue = $liftcount;
    $xml->save('test.xml');
}
?>

<body>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
        <h4>Lift1</h4>
        <select name="lift1statusform" >
          <option selected value="<?= htmlspecialchars($lift1status->nodeValue)  ?>"><?= htmlspecialchars($lift1status->nodeValue)  ?></option>
          <option value="OPEN">OPEN</option>
          <option value="CLOSED">CLOSED</option>
        </select>
        <h4>Gondola</h4>
        <select name="lift2statusform" >
          <option selected value="<?= htmlspecialchars($lift2status->nodeValue)  ?>"><?= htmlspecialchars($lift2status->nodeValue)  ?></option>
          <option value="OPEN">OPEN</option>
          <option value="CLOSED">CLOSED</option>
        </select>        
<input name="submit" type="button" value="Save"/>
</form>
</body>
</html>

использовал следующую функцию Ajax для отправки формы дважды:

function Test() {
    var form = $('form');
    $.ajax({
      type: 'POST',
      url: form.attr('action'),
      data: form.serialize(),
      success: function(data) {
        $.ajax({
          type: 'POST',
          url: form.attr('action'),
          data: form.serialize(),
          success: function(data) {
          location.reload(true);
          }
        });
        }
      });
    }

1 Ответ

1 голос
/ 28 июня 2019

Будет ли AJAX верным решением вашей проблемы?

Если вам нужно выполнить несколько «отправок форм», вам следует проверить возможности AJAX.Ajax позволяет отправлять обменные данные с помощью внутреннего PHP-файла, не покидая (или даже не обновляя) текущую страницу.Возможно, это ваше решение.

Как и в большинстве js-действий, оно может быть управляемым событием (то есть вызвано один или несколько раз каким-либо событием) или повторяться внутри цикла и т. Д.

AJAX чаще всего реализуется с использованием библиотеки jQuery:

$(document).ready(function(){
    $.ajax({
        type: 'post',
         url: 'my_backend_file.php',
        data: {varname:value}
    }).done(function(recd){
        console.log('data recd from PHP side, if needed: ' + recd);
    });
});

, хотя он одинаково хорошо обрабатывается и в vanilla js .

Ссылки и другие примеры:

https://stackoverflow.com/a/54332971/1447509

Должен ли я иметь одну форму или две отдельные формы

https://www.html5rocks.com/en/tutorials/file/xhr2

...