Я понимаю, что этот запрос идет вразрез с примером, обеспеченным в документации CI (который советует отдельному просмотру страницы 'успеха'), но я хотел бы повторно использовать высказанное мнение формы после того, как форма была успешно отправлена - отображение сообщения успеха затем отображение незаполненного бланка. Я попробовал несколько путей неудачно для очистки установленных значений проверки (сбрасывание $_POST
, устанавливание правил / поля к пустому массиву и повторному выполнению проверки).
Я мог перенаправить к той же странице, но затем я должен буду установить переменную сеанса для отображения сообщения успеха - который является грязным подходом.
Какие-либо идеи, как лучше всего достигнуть вышеупомянутого?
Перенаправление на себя. Таким образом, ни одно представление не было запущено... Это также дает вам возможность показать flash_data.
$this->load->library('form_validation');
$this->form_validation->set_rules('firstname', 'First Name', 'required');
$this->form_validation->set_rules('surname', 'Sur Name', 'required');
if ($this->form_validation->run() === TRUE)
{
// save data
$this->session->set_flashdata('message', 'New Contact has been added');
redirect(current_url());
}
$this->load->view('contacts/add', $this->data);
Передайте переменную TRUE/FALSE в ваши представления, которая условно устанавливает значения формы.
Контроллер
if($this->form_validation->run())
{
$data['reset'] = TRUE;
}
else
{
$data['reset'] = FALSE:
}
$this->load->view("form", $data);
Представление:
<input type="text" name="email" value="<?php echo ($reset) ? "" : set_value('email'); ?>" />
<input type="text" name="first_name" value="<?php echo ($reset) ? "" : set_value('first_name'); ?>" />
Функция set_value получает свое значение из объекта Form_validation, а не из массива $_POST. Объект Form_validation хранит свою собственную копию размещенных значений в переменной $_field_data.
Это хак, но вы могли бы очистить эту переменную после обработки успешной отправки :
class Item extends Controller
{
function Item()
{
parent::Controller();
$this->load->model('item_model');
}
function add()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'name', 'required');
$success = false;
if ($this->form_validation->run())
{
$this->item_model->add_item($this->input->post('name'));
$success = true;
// Look away now. Hack coming up!
// Clear the form validation field data
$this->form_validation->_field_data = array();
}
$this->load->view('item/add', array('success' => $success));
}
}