PHP программно перейти к новой форме, используя сообщение

Я довольно новичок в PHP. У меня есть форма, которую пользователь заполняет различными деталями (дата начала, дата окончания и т. Д.), Называемая purchaseLicence.php. Когда оно отправлено, действие формы перезагружается, чтобы использовать PHP для проверки данных.

Если проверка пройдена, я хочу, чтобы она переместилась на purchaseLicence2.php с помощью метода post, как если бы форма была первоначально размещена непосредственно на purchaseLicence2.php.

Я не против задействовать Javascript для этого, и я предполагаю, что его нужно будет задействовать, так как в конечном итоге он будет смотреть на форму, отличную от той, на которую он иначе рассчитывал бы.

Это мой текущий файл purchaseLicence.php, проблема, с которой я сталкиваюсь, заключается в том, что и buyLicence2.php, и purchaseLicence.php отображаются после публикации формы, а браузер по-прежнему указывает на purchaseLicence.php, а не на purchaseLicence2.php.

    <?php
        include_once('php/strings.php');
        include_once('php/sprocs.php');
        include_once('php/dates.php');

        $encounteredValidationError = false;
        $navigateAway=false ;

        if (isset($_POST['process']))
        {
            if ($_POST['process'] == 1)
            {
                // if here, form has been posted
                $ProductCode = $_POST['ProductCode'];
                $StartDate = $_POST['StartDate'];
                $EndDate = $_POST['EndDateHidden'];

                // standardise the date formats to ISO8601
                $StartDate = date("Y-m-d", strtotime($StartDate));
                $EndDate = date("Y-m-d", strtotime($EndDate));

                echo "<descriptive>" . PHP_EOL;
                echo "ProductCode:" . $ProductCode . "<br/>" . PHP_EOL;
                echo "StartDate:" . $StartDate . "<br/>" . PHP_EOL;
                echo "EndDate:" . $EndDate . "<br/>" . PHP_EOL;
                echo "</descriptive>" . PHP_EOL;


                // validation to happen here

                if (!$encounteredValidationError) 
                {
                    // so we're happy with the values. The form has just reloaded, so we need to put these back from $_POST into the input fields, so
                    // that we can call NavigateToPurchaseLicence2(), which will get them out of the input fields and post them to purchaseLicence2.php
                    // What a faff!

                    $data = array('ProductCode'=>$ProductCode, 'StartDate'=>$StartDate, 'EndDate'=>$EndDate);
                    $options = array(
                                    'http'=>array(
                                                    'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                                                    'method'  => 'POST',
                                                    'content' => http_build_query($data)
                                                )
                                    );

                    $context  = stream_context_create($options);
                    $result = file_get_contents('purchaseLicence2.php', false, $context);
                    if ($result === FALSE) { /* Handle error */ }

                    var_dump($result);
                }
                else
                {
                    // hilite errors in the form here, how? form is not yet loaded
                }
            }
        }
    ?>

</head>
<body>
    <form method="post" action="purchaseLicence.php" id="form1">
        <input type="hidden" name="process" value="1">
        <table border=0 width=800px align=left style="margin: 0px auto;">

            <tr> <!-- Product > -->
                <td style="vertical-align:top" width="500px" bgcolor="lightgray"><descriptive>Product</descriptive></td>
                <td width="500px" bgcolor="lightgray">
                    <?php
                        // creates a dropdown of products
                        OutputSelectFromSQL("SELECT * FROM Product ORDER BY Description", "ProductCode", "ProductCode", "Description", "");
                    ?>
                </td>
            </tr>

            <tr> <!-- Licence Period -->
                <td style="vertical-align:top" width="500px" bgcolor="lightgray"><descriptive>Licence Period</descriptive></td>
                <td width="500px" bgcolor="lightgray"><descriptive>1 year</descriptive></td>
            </tr>

            <tr> <!-- Start Date -->
                <td style="vertical-align:top" width="500px" bgcolor="lightgray"><descriptive>Start/End Dates</descriptive></td>
                <td width="500px" bgcolor="lightgray">
                    <input type="date" style="font-family:verdana;font-size:12px;" name="StartDate" id="StartDate" onchange="updateEndDate(this.value);"></input>
                    <descriptive> to <a id="EndDate"></a></descriptive>
                    <input type="hidden" name="EndDateHidden" id="EndDateHidden"></input> <!-- this is used so we can post the end date to $_POST -->
                </td>
            </tr>

            <tr> <!-- Next > -->
                <td style="vertical-align:top" width="500px" bgcolor="lightgray"><descriptive></descriptive></td>
                <td width="500px" bgcolor="lightgray" align="right"><input type="submit" value="Next"></input></td>
            </tr>

        </table>
    </form>
</body>

Простой пример использования стандартного шаблона был бы действительно полезен.

1 ответ

Решение

Я предлагаю вам использовать $_SESSION чтобы сохранить состояние между вашими формами, ниже приведен очень грубый пример с полем 1 в первой форме, которое, если оно хорошее (числовое), устанавливает полное состояние формы в сеансе, а затем перенаправляет на вторую форму для заполнения дополнительных полей. Очень просто, но вы поняли идею.

dataentry1.php

<?php 
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    // define form state
    $form = [
        'value' => $_POST,
        'error' => []
    ];

    // validate a_field
    if (empty($form['value']['a_field'])) {
        $form['error']['a_field'] = 'a_field is a required field!';
    } elseif (!is_numeric($form['value']['a_field'])) {
        $form['error']['a_field'] = 'a_field should be a number!';
    }

    // all good
    if (empty($form['error'])) {
        $_SESSION['form'] = $form;
        exit(header('Location: dataentry2.php'));
    }
}
?>

<?= (!empty($form['error']['global']) ? $form['error']['global'] : null) ?>

<form action="/dataentry1.php" method="post">
  <lable>a_field:</lable>
  <input type="text" name="a_field" value="<?= (isset($form['value']['a_field']) ? htmlentities($form['value']['a_field']) : null) ?>">
  <?= (!empty($form['error']['a_field']) ? '<br>'.$form['error']['a_field'] : null) ?>
  <br>
  <input type="submit" value="Submit">
</form> 

dataentry2.php - требует заполнения предыдущей формы.

<?php 
session_start();

// set form into scope from session
if (!empty($_SESSION['form'])) {
    $form = $_SESSION['form'];
} else {
    $_SESSION['form']['error']['global'] = 'You must fill out dataentry1 form first';
    exit(header('Location: dataentry1.php'));
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    // define form state
    $form = [
        'value' => array_merge($form['value'], $_POST),
        'error' => []
    ];

    // validate a_field
    if (empty($form['value']['b_field'])) {
        $form['error']['b_field'] = 'b_field is a required field!';
    } elseif (!is_numeric($form['value']['b_field'])) {
        $form['error']['b_field'] = 'b_field should be a number!';
    }

    // all good
    if (empty($form['error'])) {
        exit('Do something cool!');
    }
}
?>

<form action="/dataentry2.php" method="post">
  <lable>a_field:</lable>
  <input type="text" name="a_field" value="<?= (isset($form['value']['a_field']) ? htmlentities($form['value']['a_field']) : null) ?>" readonly="readonly">
  <?= (!empty($form['error']['a_field']) ? '<br>'.$form['error']['a_field'] : null) ?>

  <lable>b_field:</lable>
  <input type="text" name="b_field" value="<?= (isset($form['value']['b_field']) ? htmlentities($form['value']['b_field']) : null) ?>">
  <?= (!empty($form['error']['b_field']) ? '<br>'.$form['error']['b_field'] : null) ?>
  <br>
  <input type="submit" value="Submit">
</form> 
Другие вопросы по тегам