Я работаю в PHP для создания формы. Я знаю, как отображать форму, а затем принимать представленные значения из переменной $ _POST, и я знаю, как проверять эти переменные и отображать страницу «Спасибо» или «Ошибка» в зависимости от ввода.
Однако я не знаю, как это сделать: создать клиентскую систему, в которой, несмотря на то, что мои пользователи нажимают кнопку «назад» на отдельный экран, я могу затем взять информацию, полученную из первого представления, и отобразить динамические сообщения об ошибках типа «Укажите действующий адрес электронной почты» или «Имя – обязательное поле» рядом с полями, которые были введены неправильно. Я также хотел бы получить все ранее представленные данные, которые были действительными, и заполнить их в форме, чтобы пользователи не расстраивались, теряя все, что они ввели.
Каков правильный подход к выполнению чего-то подобного в PHP? Первоначально я думал, что если я смогу передать массив сообщений об ошибках с тегом input type = "hidden", я мог бы затем вытащить мои значения и динамически отображать сообщения с помощью PHP, но я все время зацикливаюсь на этом подходе.
Вы могли бы добавить ошибки в php-сеанс, но это создает проблемы для пользователей, у которых есть несколько вкладок браузера.
Мой предпочтительный метод состоит в том, чтобы отправить форму на ту же страницу и поместить ошибки непосредственно на эту страницу, чтобы пользователю не нужно было щелкнуть кнопку «Назад». Таким образом вы можете выделить поля непосредственно в форме (сделать фон или контур красным или что-то подобное).
<input type="text" <?php (empty($_POST['field']?'style="backgroung-color: red;"':''))?> name="field" value="<?php echo $_POST['field']?>" />
Вы можете поместить <input type="text" name="field" value="<?php echo $_POST['field']?>" />
Чтобы получить старое значение.
Поскольку веб, по определению, без гражданства, нет действительно хорошего способа отслеживать, что делает пользователь, когда они нажимают кнопку «Назад». Есть хаки, которые работают с использованием скрытого iframe, но это больше проблем, которые вы ищете.
Не смешивайте логику клиента с логикой сервера. Тот же самый скрипт может вывести форму и принять ее. Если вход успешно проверяется, он продолжается. Если нет, он отобразит форму снова, на этот раз с сообщениями об ошибках и уже введенными данными.
В следующий раз, когда пользователь отправит форму, проверка начинается снова, пока она не пройдет успешно.
Таким образом, вы расширяете форму с входными значениями и сообщениями об ошибках в первую очередь, но вы показываете их только в том случае, если они помечены / установлены.
Это можно сделать только с дополнительными переменными рядом с $_POST
– или если вам это нравится – используя полную абстракцию формы из фреймворка, такую как zend framework (что может быть накладным для того, что вам нравится) или просто с библиотекой / как популярный HTML_QuickForm2 .
Редактировать:
Это очень простой код, чтобы продемонстрировать общую методологию, если вы используете библиотеку, она намного приятнее (и вам не нужно ее кодировать, вместо этого вы можете сосредоточиться на фактической форме, как определение сверху). Этот код больше для чтения и понимания потока, чем для использования, я быстро набрал его, чтобы он (безусловно, имеет) синтаксические ошибки, и он не является полным для полномасштабной формы. У этого есть только одно поле электронной почты и даже отсутствует кнопка отправки:
/* setup the request */ $request->isSubmit = isset($_POST['submit']); /* define the form */ $form->fields = array ( 'email' => array ( 'validate' => function($value) {return filter_var($value, FILTER_VALIDATE_EMAIL);}, 'output' => function($value, $name) {return sprintf('<input type="text" value="%s" id="%s">', htmlspecialchars($value), htmlspecialchars($name)}, 'default' => 'info@example.com', ), ); /** * Import form data from post request * * @return array data with keys as field names and values as the input strings * or default form values. */ function get_form_post_data($form, $request) { $data = array(); foreach($form->fields as $name => $field) { $data[$name] = $field->default; if ($request->isSubmit && isset($_POST[$name])) { $data[$name] = $_POST[$name]; } } return $data; } /** * Validate form data */ function validate_form_data($form, $data) { foreach($form->fields as $name => $field) { $value = $data[$name]; $valid = $field['validate']($value); if (!$valid) { $form->errors[$name] = true; } } } function display_form($form, $data) { foreach($form->fields as $name => $field) { $value = isset($data[$name]) ? $data[$name] : ''; $hasError = isset($form->errors[$name]); $input = $field['output']($name, $value); $mask = '%s'; if ($hasError) { $mask = '<div class="error"><div class="message">Please Check:</div>%s</div>'; } printf($mask, $input); } } // give it a run: # populate form with default values -or- with submitted values: $form->data = get_form_post_data($form, $request); # validate form if there is actually a submit: if ($request->isSubmit) { validate_form_data($form, $form->data); } # finally display the form (that can be within your HTML/template part), works like echo: display_form($form, $form->data)
Используйте форму для отправки на ту же страницу, и если форма проверяется, используйте заголовок, чтобы перенаправить пользователя на страницу благодарности.
header("Location: thank-you.php");
Если форма не проходит проверку, вы можете легко отобразить все ошибки на одной странице.