Проверка формы CodeIgniter - получить результат в виде «массива» вместо «строки» - PullRequest
16 голосов
/ 22 января 2009

Я пишу свой класс проверки формы с использованием CodeIgniter. Есть ли способ, чтобы я мог получить сообщения об ошибках в паре имя-значение? Например, в образце формы есть четыре поля: user_name, password, password_conf и timezone. Среди них user_name и password проверка завершилась неудачно после выполнения следующих действий:

$result = $this->form_validation->run();

Если вышеприведенная функция возвращает false, я хочу получить ошибки в парах имя-значение, как показано ниже:

Array
{
  'user_name' => 'user name is required',
  'password' => 'passord is required'
}

Я действительно хочу сформировать JSON, который я могу передать обратно вызову AJAX. У меня есть (грязное) решение: я могу вызывать методы проверки один за другим, как показано ниже:

$this->form_validation->required($user_name);
$this->form_validation->required($password);

Есть ли другой способ получить сразу все сообщения об ошибках в паре имя-значение?

РЕДАКТИРОВАТЬ : мне предложили сделать проверку с помощью jQuery из одного из ответов:

jQuery поможет в проверке на стороне клиента, но как на стороне сервера, там я использую проверку CodeIgniter.

Я спроектировал это так:

  1. Я публикую все значения, используя AJAX.
  2. Проверка на стороне сервера (PHP).
  3. Выполните требуемую операцию, если входы действительны; иначе верните ошибку пользователю.

Ответы [ 6 ]

16 голосов
/ 22 января 2009

Я сам нашел один способ, заглянув в код CodeIgniter: Я расширил библиотеку CI_Form_validation как: -

class MY_Form_validation extends CI_Form_validation
{
    public function getErrorsArray()
    {
        return $this->_error_array;
    }
}

Я знаю, это взлом, но будет служить моей потребности на время. Я надеюсь, что команда CodeIginter скоро разработает интерфейс для доступа к этому массиву.

4 голосов
/ 13 ноября 2016

Вы можете просто использовать,

$this->form_validation->error_array();

Это из справочной документации класса CodeIgniter.

1 голос
/ 08 февраля 2015

Вы можете создать приватную функцию в вашем контроллере

    private function return_form_validation_error($input)
{
    $output = array();
    foreach ($input as $key => $value)
    {
        $output[$key] = form_error($key);
    }
    return $output;
}

и затем в вашем методе проверки, просто вызовите это, вот мое

public function add_cat_form()
    {
        $this->output->unset_template();
        $this->load->library('form_validation');
        $this->form_validation->set_rules('name', 'Name', 'required');
        if ($this->form_validation->run())
        {
            if (IS_AJAX)
            {
                $dataForInsert = $this->input->post();
                if ($dataForInsert['parentid'] == -1)
                {
                    unset($dataForInsert['parentid']);
                }
                $this->post_model->add_cat($dataForInsert);
                echo json_encode('success');
            } else
            {
                #in case of not using AJAX, the AJAX const defined
            }
        } else
        {
            if (IS_AJAX)
            {
                #This will be return form_validation error in an array
                $output = $this->return_form_validation_error($this->input->post());
                echo $output = json_encode($output);
            } else
            {
                #in case of not using AJAX, the AJAX const defined
            }
        }
    }
1 голос
/ 21 марта 2013

Решение, которое мне нравится больше всего, не включает в себя добавление функции в любом месте или расширение библиотеки проверки:

$validator =& _get_validation_object();
$error_messages = $validator->_error_array;

Ссылка: http://thesimplesynthesis.com/post/how-to-get-form-validation-errors-as-an-array-in-codeigniter/

Вы должны быть в состоянии вызвать это в любой точке вашего кода. Также стоит отметить, что более новый поток также обсуждает это.

1 голос
/ 22 января 2009

Видя, что проверка воспламенителя кода дает вам сообщения об ошибках при обычном обновлении страницы, не лучше ли использовать что-то вроде плагина проверки jquery , который будет проверять полностью на стороне клиента перед отправкой формы? Для этого AJAX не нужен.

EDIT: Я не предлагаю НЕ ДЕЛАТЬ проверку на стороне сервера, просто публикация с AJAX для проверки не требуется и уменьшит количество обращений к серверу, если вы сделаете это на стороне клиента. Он будет постепенно переходить на обычное обновление страницы с ошибками или сообщением об успешном завершении.

0 голосов
/ 24 ноября 2018

уже есть правильный ответ, но я думаю, что этот вопрос более понятен, как выполнить процесс.

Сделайте это в вашем контроллере

$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run() === FALSE){
    $data['error'] = validation_errors();
}else{
  //success
}
echo json_encode($data);

Сделай это в своем JS

success:function(response){
 if(response.error){
  $('#notif').html(response.error); 
 }else{
   //do stuff here...
 }
}

и, наконец, отобразите ошибку, соответствующую указанному идентификатору в вашем JS.

Сделайте это в вашем HTML

<span id="notif"></span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...