Я понимаю, что этот запрос идет против примера, представленного в документации 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(); }
Я обнаружил, что где:
недостаточно очистить только массив правил проверки, вам также необходимо очистить массив ошибок проверки.
С этой целью я добавил метод к 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 = ''; } }