Codeigniter Form Validation – как сбросить значения формы после успеха?

Я понимаю, что этот запрос идет против примера, представленного в документации 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); 

Другое решение расширяет библиотеку CI_Form_validation . Свойство $_field_data защищено, поэтому мы можем получить его:

 class MY_Form_validation extends CI_Form_validation { public function __construct() { parent::__construct(); } public function clear_field_data() { $this->_field_data = array(); return $this; } } 

И вызовите новый метод. Таким образом, вы можете передавать данные, не сохраняя данные в сеансе.

  class Item extends Controller { function Item() { parent::Controller(); } function add() { $this->load->library('form_validation'); $this->form_validation->set_rules('name', 'name', 'required'); $success = false; if ($this->form_validation->run()) { $success = true; $this->form_validation->clear_field_data(); } $this->load->view('item/add', array('success' => $success)); } } 

Передайте переменную 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)); } } 

Надеюсь, это было бы полезно. Наконец, я понимаю всю концепцию расширения библиотеки. Все, что вам нужно сделать, это
Шаг 1. В этом каталоге «application / libraries /» создайте файл с именем «MY_Form_validation.php» со следующим кодом php

 <?php if (!defined('BASEPATH')) exit('No direct script access allowed.'); class MY_Form_validation extends CI_Form_validation { public function MY_Form_validation() { parent::__construct(); } public function unset_field_data() { unset($this->_field_data); } } с <?php if (!defined('BASEPATH')) exit('No direct script access allowed.'); class MY_Form_validation extends CI_Form_validation { public function MY_Form_validation() { parent::__construct(); } public function unset_field_data() { unset($this->_field_data); } } 

Шаг 2: Затем используйте функцию « unset_field_data() » в вашем контроллере. например, ниже:

  if ($this->form_validation->run()) { $this->item_model->add_item($this->input->post('name')); $success = true; $this->form_validation->unset_field_data(); } 

Я обнаружил, что где:

  1. существует более чем один CI view-partials, которые составляют страницу, и их методы контроллера выполняют проверку
  2. одна из неудачных проверок и возникла ошибка с момента последнего обновления страницы, скажем, с неверно отформатированным или введенным значением поля ввода

недостаточно очистить только массив правил проверки, вам также необходимо очистить массив ошибок проверки.

С этой целью я добавил метод к system / libraries / Form_Validation.php следующим образом:

 public function clear_rules() { $this->_error_array = array(); $this->_field_data = array(); return $this; } 

Возврат $ это важно, если вы хотите связать методы проверки формы.

В новой версии 3.X очистить значение set_value, $_POST=array() и $this->_field_data = array(); в библиотеке MY_Form_validation.php . пытаться

Очистить данные формы после успеха codeigniter, используя php not jquery

Ответ от d5avard неверен, проверка правильности CI должна иметь обработанный им массив правил: если вы этого не сделаете, вы можете использовать проверку формы с опубликованными данными, но не с данными перегрузки.

сохранить этот файл как Библиотеки / MY_Form_validation.php

  /** * Class MY_Form_validation * @description extension of the CI_Form_validation * @property CI_DB_query_builder db database driver * @property CI_Benchmark benchmark * @property CI_Input input * @property CI_Output output */ class MY_Form_validation extends CI_Form_validation { /** * MY_Form_validation constructor. * @param array $rules */ function __construct($rules = array()) { parent::__construct($rules); $this->_error_prefix = '<div class=""><p>'; $this->_error_suffix = '</p></div>'; } /** * Resets the form validation class for multiple runs. * @param array $rules */ public function initialise($rules = array()) { if (count($rules) == 0 ) { require (APPPATH.'config'.DIRECTORY_SEPARATOR.'form_validation.php'); $this->_config_rules = $config; } else { $this->_config_rules = $rules; } $this->_field_data = array(); $this->_error_array = array(); $this->_error_messages = array(); $this->_error_prefix = '<div class=""><p>'; $this->_error_suffix = '</p></div>'; $this->error_string = ''; } }