Многошаговая / страничная форма в PHP и CodeIgniter - PullRequest
1 голос
/ 22 февраля 2011

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

Как мне иметь многошаговую форму в CI, которая скорее обновляетчем вставляет снова при возврате к предыдущему шагу с помощью кнопки назад?Как я могу получить форму, в которой нет кнопки «Назад». Форма отправки сообщений POST?

Редактировать: если возможно, без JS

Спасибо!

Ответы [ 5 ]

5 голосов
/ 22 февраля 2011

Вот мой ответ на другой вопрос.Он дает вам возможность пересылки назад / назад без возможности потерять данные, мгновенно переключается между страницами, прост в коде, не требует сессий и не зависит от фреймворка (может использоваться в любой ситуации):

Я разрабатываюпродукт для рынка психологии, который проводит 250 вопросов психологического тестирования.Чтобы сделать тест не слишком сложным, я разбил форму на 25 сегментов вопросов, одновременно выводя ее в цикле через теги div с добавленным последовательным идентификатором (т. Е. Div1, div2, div3). Каждый div установлен для отображения:нет, кроме первого.

Затем я предоставляю пользователю кнопку, которая переключает текущий div + 1 (т. е. если на div 1, он будет делать $(#div2).show() и т. д. Кнопки Назад делают наоборот.

Важная часть заключается в том, что форма покрывает ВСЕ деления, тогда нужно просто поменять местами кнопку «вперед / назад» с помощью кнопки «Отправить».

Вуаля! Да, низкотехнологично.Но БЫСТРО .... и нет шансов НИКОГДА терять значения, идущие вперед или назад.

Итак, грубый усеченный пример:

<form>
  <div id="div1">
     First 25 Questions
     <input type="button">shows next div</input>
  </div>
  <div id="div2" style="display:none">
    Second 25 Questions
    <input type="submit">Submit Form</input>
  </div>
</form>
3 голосов
/ 22 февраля 2011

Создайте уникальный идентификатор, который вы используете на всех этапах вашего мастера.Сохраните этот идентификатор в базе данных при первоначальном сохранении вашей формы.Перенаправьте этот идентификатор на следующие шаги, используя input type="hidden".
. При сохранении шага сначала попытайтесь сопоставить идентификатор и, если вы найдете его в базе данных, выполните обновление вместо вставки.

Чтобы избежать «хотите ли вы повторно отправить данные публикации», выполните каждый шаг мастера в двух действиях контроллера CodeIgniter:

  • SaveStep5 (POST: идентификатор экземпляра формы + другие входные данные «мастера шага 5»):ищет идентификатор экземпляра формы в базе данных и выполняет команды вставки / обновления;перенаправляет на LoadStep6 и передает идентификатор экземпляра формы в параметре GET;
  • LoadStep6 (GET: идентификатор экземпляра формы);ищет экземпляр формы в базе данных, если экземпляр не найден: обработка ошибок, если экземпляр найден, отображает форму ввода для «шага 6»
0 голосов
/ 07 мая 2015

У меня есть модель для хранения данных моего мастера с переменной для каждого поля в форме:

class Class_signup_data extends CI_Model {
const table_name="signups_in_progress";
public $market_segment; // there is a field named 'market_segment' in the wizard view

... ...

У меня есть один контроллер для обработкивесь процесс, с параметрами для session_id и стадии процесса, на котором мы находимся:

    class Signup extends CI_Controller {
    public function in_progress($session_id=NULL,$stage=1) {
        $this->index($session_id,$stage);
    }
    public function index($session_id=NULL,$stage=1) {
    if ($session_id===NULL) $session_id=$this->session->userdata('session_id');
...
...

В этом контроллере у меня есть переключатель, для которого мы находимся - он сначала ищет кнопку «Prev»:

switch ($stage) {
        case 2:
            if ($this->input->post('prev')) { // if they click Previuous, the validations DON'T need to be met:
                $signup_data->save_to_db(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '1',
                    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id);
                $this->load->helper('url');
                redirect("/signup/in_progress/".$session_id."/1");

А позже в коммутаторе я использую валидации CI для отображения формы и обработки «Далее», если она была нажата или вызывается только с / signup / in_progress / session / 2:

    $this->form_validation->set_rules("your rules");
if ($this->form_validation->run() == FALSE) {
    $this->load->view('signupStage2',array('signup_data'=>$signup_data));
} else {
    $signup_data->save(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '3',
    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id);
    $this->load->helper('url');
    redirect("/signup/in_progress/".$session_id."/3");
};

В нижней части каждого представления (например, «signupStage2.php») у меня есть кнопки «Предыдущая» и «Следующая»:

    <span class="align-left"><p><input type="submit" name="prev" class="big-button"
value="<- Prev" /><input type="submit" name="next" class="big-button"
value="Next ->" /></p></span>
0 голосов
/ 22 февраля 2011

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

0 голосов
/ 22 февраля 2011

Если вы хотите избежать тех сообщений, которые предупреждают пользователя о повторной отправке сообщений, и вы также хотите иметь несколько правильных страниц, а не просто разные шаги в javascript, вы можете поместить ответы в URL как параметры GET. так что после первой отправки формы вы получите form2.php? в URL .. вы можете добавить эти ответы как скрытые переменные в form2 и т. д.
Это не очень элегантное решение, хотя. Я бы порекомендовал вам использовать javascript: добавить пользовательский обработчик для отправки формы и отправить содержимое формы через ajax, а затем загрузить следующую форму на ajax complete.
Также, как ответил другой человек, на стороне сервера вам понадобится уникальный идентификатор, который выбирает / обновляет данные отправки в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...