Проверка формы Codeigniter - как сбросить значения формы после успеха? - PullRequest
32 голосов
/ 10 мая 2010

Я понимаю, что этот запрос идет вразрез с примером, приведенным в документации по CI (который рекомендует отдельное представление страницы «успех»), но я хотел бы повторно использовать данный вид формы после успешной отправки формы - отображение сообщения об успехе затем отображение пустой формы. Я безуспешно пытался очистить значения набора проверки несколькими способами (сброс $_POST, установка правил / полей в пустой массив и повторный запуск проверки).

Я мог бы перенаправить на ту же страницу, но тогда мне пришлось бы установить переменную сеанса для отображения сообщения об успехе - что является грязным подходом.

Есть идеи, как лучше всего достичь вышеупомянутого?

Ответы [ 8 ]

34 голосов
/ 11 мая 2010

Перенаправить на себя. Таким образом, никакие представления не были выполнены ... Это также дает вам способ показать 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);
12 голосов
/ 03 февраля 2013

Другое решение, расширить библиотеку 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));
        }
    }
7 голосов
/ 10 мая 2010

Передайте переменную 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 голосов
/ 10 мая 2010

Функция 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));
    }
}
0 голосов
/ 16 августа 2017

Ответ от 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         = '';
        }
    }
0 голосов
/ 23 июня 2017

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

Очистить данные формы после успешного кодирования, используя php, а не jquery

0 голосов
/ 22 февраля 2017

Я нашел это где:

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

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

Для этого я добавил метод в system / library / Form_Validation.php следующим образом:

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

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

0 голосов
/ 27 января 2014

Надеюсь, это будет полезно. Наконец, я понимаю всю концепцию расширения библиотеки. Все, что вам нужно сделать, это
Шаг 1 : В этом каталоге «application / library /» создайте файл с именем «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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...