Многошаговая форма в PHP - Приложение MVC - PullRequest
0 голосов
/ 23 октября 2009

Я собираюсь запрограммировать многоэтапную форму в моем приложении MVC (Самодельная структура MVC), в которую не нужно вставлять данные до завершения последнего шага.

Я получил следующие вопросы / вопросы

  • Мне бы очень хотелось найти шаблон для решения этой проблемы, есть ли?
  • Я хочу, чтобы было легко выполнить действие возврата и вернуть данные на последнем шаге. Вопрос: является ли сеанс единственным способом передачи данных? Параметр get может быть лучше / проще?
  • Как вы решили эту проблему до

Ответы [ 7 ]

1 голос
/ 23 октября 2009

Дурот дал несколько хороших предложений. Другим вариантом является сохранение данных в базе данных по мере продвижения, шаг за шагом, но сохраняя флажок для этих данных, чтобы показать, что они неполные. Когда они отправят последнюю страницу формы, вставьте данные и отметьте их как завершенные. Проблемы, с которыми вы столкнетесь при использовании этого метода:

  • В таблице остаются неполные данные
    • Вам потребуется выполнить некоторое обслуживание, чтобы удалить старые неполные данные (старше недели или что-то в этом роде)
  • Это может сделать всю логику вашей программы намного более сложной. Вы должны всегда проверять, что запись "завершена".

Если бы вы хранили неполные данные в другой таблице, как упоминал Дурот, то избежали бы второй проблемы, но в вашей базе данных были бы дублированные таблицы.

1 голос
/ 23 октября 2009

Посмотрите, как они реализовали это в Symfony , он довольно хорошо построен в этом фреймворке.

Вам просто нужно скачать его и посмотреть в своем проекте: / lib / symfony / form

По сути, вы должны создавать классы для каждого из ваших входов в форму;

  • тогда вы всегда можете создать разные и сложные;
  • вы создаете классы валидаторов для каждого из них (возможно настраиваемые),
  • вы храните ваши данные в PHP-объектах, которые вы сохраняете в сеансе или cookie,

Я бы не советовал сохранять с использованием параметров, их слишком много, вы должны учитывать максимальный размер URL и ограничения браузера.

1 голос
/ 23 октября 2009

Пара относительно простых решений:

  • Сохранить данные во второй таблице БД и скопировать их только в первичную таблицу в конце
  • Сохраните ваши данные в <input type="hidden"> элементах, так что ваш $_POST глобальный будет содержать каждый ответ, данный на данный момент
  • Сохранение данных в сеансе / файле cookie

Я бы никогда не использовал параметры GET для такой задачи; слишком легко пропустить один или два, и большинство браузеров имеют относительно короткую максимальную длину URL . В этом случае лучшим выбором будет использование файлов cookie или скрытых <input> s.

1 голос
/ 23 октября 2009

Я бы не стал использовать данные ни в чем другом, кроме файлов cookie / сеансов, по крайней мере, если вы хотите, чтобы пользователи могли переходить между вашими шагами назад и вперед.

В вашем контроллере:

$_SESSION['yourform']['optionalSubformOrPage']['field'] = $_POST['field'];
header('Location: nextpage');
die;

На ваш взгляд:

<input name="field" value="<?php echo isset($_SESSION['yourform']['optionalSubformOrPage']['field']) ? $_SESSION['yourform']['optionalSubformOrPage']['field'] : null; ?>" />
0 голосов
/ 25 октября 2017

Существует один отличный подход, который сделает вашу задачу очень простой, не сохраняя значения в сеансе.

Вы просто делите свой многоступенчатый элемент на другой div и делаете все div изначально скрытными, кроме первого. Таким образом, вы можете возвращаться и использовать jquery без потери данных.

Например, вашей форме понравится

<form action="your_url" action="post"> 
    <div class="div1">
       your first page
    </div>
    <div class="div2" style="display:none;">
       your second page
    </div>
 </form>
0 голосов
/ 23 октября 2009

Вы также можете передавать переменные со скрытыми полями, но с помощью таких инструментов, как firebug, эти поля могут быть изменены, и это не очень хорошая идея. Я думаю, что сеанс - лучший способ хранить данные этого типа.

В любом случае, в коде php я всегда храню переменную, которая указывает, какая форма должна быть показана:

switch($_SESSION['step'])
{
    case 1: echo "<form name='first'...";
    break;
    case 2: echo "<form name='second'...";
    break;
    ....
}
0 голосов
/ 23 октября 2009

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

...