Codeigniter Form Validation - как сбросить значения формы после успеха?
Я понимаю, что этот запрос идет против примера, представленного в документации CI (который рекомендует отдельный просмотр страницы успеха), но я хотел бы повторно использовать данное представление формы после того, как форма была успешно отправлена - отображение успешного сообщения затем отображается пустая форма. Я пробовал несколько способов безуспешно очистить установленные значения проверки (отмена $_POST
, установление правил/полей в пустой массив и повторная проверка).
Я мог бы перенаправить на ту же страницу, но тогда мне нужно было бы установить переменную сеанса, чтобы отобразить сообщение об успешном завершении, что является беспорядочным.
Любые идеи о том, как наилучшим образом достичь вышеуказанного?
Ответы
Ответ 1
Перенаправление на себя. Таким образом, никаких представлений не было выполнено... Это также дает вам способ показать 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);
Ответ 2
Другое решение, расширьте библиотеку 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));
}
}
Ответ 3
Передайте переменную 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'); ?>" />
Ответ 4
Функция 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));
}
}
Ответ 5
Надеюсь, это было бы полезно. Наконец, я понимаю всю концепцию расширения библиотеки. Все, что вам нужно сделать, это
Шаг 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);
}
}
Шаг 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();
}
Ответ 6
Я обнаружил, что где:
- существует более чем один CI-частичный просмотр, который составляет страницу, и их методы контроллера выполняют проверку.
- сбой одной из проверок и возникла ошибка с момента последнего обновления страницы, скажем, с неверно отформатированным или введенным значением входного поля
недостаточно очистить только массив правил проверки, вам также необходимо очистить массив проверки достоверности.
С этой целью я добавил метод к system/libraries/Form_Validation.php следующим образом:
public function clear_rules()
{
$this->_error_array = array();
$this->_field_data = array();
return $this;
}
Возврат $это важно, если вы хотите связать свои методы проверки формы.
Ответ 7
В новой версии 3.X очистить значение set_value, $_POST=array()
и $this->_field_data = array();
в библиотеке MY_Form_validation.php
. попробуйте
Очистить данные формы после успеха codeigniter, используя php, а не jquery
Ответ 8
Ответ от d5avard неверен, валидация формы CI должна иметь массив правил, обработанный им: если вы этого не сделаете, вы можете использовать проверку формы с опубликованными данными, но не с данными over-ride.
сохранить этот файл как Библиотеки /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 = '';
}
}