codeigniter многоступенчатые формы, использующие POST и заставляющие работать backbutton

У меня есть формы codeigniter, которые используют POST для перехода с одной страницы на другую. На каждом этапе используются данные, отправленные пользователем. Я прочитал:

https://stackoverflow.com/a/13559805/1021360

Что мне нужно использовать метод get-post-get (GPG), чтобы кнопка возврата работала.

У меня много данных в отслеживаемой переменной сеанса, срок действия сеанса истекает только после того, как вы вернетесь на домашнюю страницу или через 1 час, поэтому кнопка «Назад» должна работать. Здесь также хранятся все основные данные. (POST не так уж и актуален, поскольку задняя страница могла просто прочитать все это обратно из сеанса, если я знал, как сделать так, чтобы кеш кнопки возврата делал это).

В настоящее время при нажатии кнопки возврата появляется сообщение: «Этот документ больше не доступен». страница ошибки.

У моих представлений есть форма с вызовом функции "/ nextquestion".

эта функция выполняет проверку формы, сохраняет значения формы в CI_session и затем отображает следующую страницу, если форма проходит проверку проверки.

Я не уверен, как передать это в третий «файл» (поскольку codeigniter использует вызовы функций, а не файлы php), а затем прочитать его из него ...?

Все, чего я хотел бы добиться, - это чтобы кнопка «Назад» работала так, как и предполагалось: она должна показывать вам предыдущую страницу в том виде, в каком она была отрисована.

Любые советы или помощь о том, как заставить кеш браузеров хорошо работать с отправкой форм codeigniter, будут очень приветствоваться!

Спасибо.


person Sebastian Chedal    schedule 25.03.2013    source источник
comment
Самый простой - разместить все части на одной странице, а остальные неактивные вопросы скрыть. Однако в вашем случае вы могли бы просто иметь ссылку на предыдущую / следующую страницу внутри вашего представления, и тот факт, что они являются ссылками, означает, что при переходе на страницу не будет предупреждения об обновлении. Вы также можете в качестве альтернативы установить заголовок cache-control, чтобы избежать предупреждения об обновлении с помощью кнопки возврата. пример $ this- ›output-› set_header (Cache-Control: private);   -  person Youn Elan    schedule 25.03.2013
comment
покажите нам ваши текущие коды.   -  person Raptor    schedule 28.03.2013


Ответы (1)


Обычно я отправляю форму на ту же страницу, после чего проверяю, существует ли массив $ _POST. Если он не существует, я предполагаю, что страница не была отправлена, и проверяю наличие каких-либо данных, которые могут существовать в сеансе.

Код для этого будет выглядеть примерно так:

// Check if we have any post data (form was submitted or not)
if(count($_POST) > 0) {

    // Save post array to the session
    $this->session->set_userdata('post_data', $_POST );

    // Redirect to the same page (REMOVES POST FROM HTTP HEADERS)
    redirect('/form/page1','location');

} else {

    // There is no $_POST array, but we have the POST data in session 
    // I.E. RETURNING TO FORM VIA BACK BUTTON
    if($this->session->userdata('post_data')) {

        // Set POST array from session data
        $_POST = $this->session->userdata('post_data');

        // Clear the session
        $this->session->unset_userdata('post_data');
    }
}


// Your other code, validation rules, etc, etc

// VALIDATION FAILS - Validation fails
if ($this->form_validation->run() == FALSE) {

    // Load view
}

// VALIDATION SUCCEEDS - Proceed to confirmation  
else {
    redirect('/form/page2', 'location', 303);
}

Предполагая, что представленные данные проходят ваши правила проверки, общий порядок вышеизложенного будет следующим:

  • Пользователь переходит на /form/page1, заполняет и отправляет форму.
  • Форма POSTED сама себе, массив $ _POST сохраняется в сеансе.
  • Затем пользователь перенаправляется на ту же страницу /form/page1, на которой массив $ _POST пуст, а заголовок POST был удален из HTTP-запроса.
  • Затем массив $ _POST восстанавливается из данных сеанса, и форма перенаправляется на /form/page2. Пользователь этого шага не заметит.
  • Теперь, если пользователь нажимает кнопку «Назад». Ошибки не будет, потому что технически на предыдущей странице не было данных, отправленных на нее или с нее.
person Jeemusu    schedule 25.03.2013