Проверка формы CodeIgniter - Получите результат как «массив» вместо «строки»

Я пишу свой класс проверки формы с помощью 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. Выполните желаемую операцию, если введенные данные действительны; иначе вернуть пользователю ошибку.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
16
0
18 618
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

Валидация на стороне клиента не должна быть вашей единственной заботой, гораздо важнее бэкэнд-валидация.

Luca Matteis 22.01.2009 17:24

Правильно, это было бы глупо. Я не предлагал НЕ ПРОВОДИТЬ проверку на стороне сервера - прочтите мое редактирование И исходный пост еще раз.

roborourke 23.01.2009 14:10

Кроме того, иногда НЕОБХОДИМО выполнить проверку на бэкэнд, например, чтобы проверить что-то в таблице базы данных (единственность в таблице)

MaxiWheat 13.12.2012 00:20
Ответ принят как подходящий

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

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

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

Это совсем не хакерство, в этом вся суть ООП. Я иду по той же дороге, и это мой финал, потому что я не вижу другой альтернативы.

thenetimp 01.03.2012 16:24

Это однозначно хорошее решение. Позор codeigniter за то, что у него нет этой функции изначально!

King Julien 31.10.2012 16:27

Однако это не возвращает значения. Есть идеи, почему? Когда я сбрасываю указатель $ this, я вижу, что _error_array защищен. Массив всегда возвращается пустым.

Deepak Thomas 09.06.2013 18:46

Работает! Что касается последнего комментария, у меня плохо. Я сбрасывал массив до form_validation-> run () и, следовательно, пустой массив.

Deepak Thomas 09.06.2013 19:02

не называйте упс хаком !!

MYNE 31.10.2015 06:01

Зачем расширять? Это уже поддерживается библиотекой. Вы можете просто использовать $this->form_validation->error_array();. Одна линия!!!

masterFly 24.11.2016 07:09

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

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

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

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

$this->form_validation->error_array(); уже есть в библиотеке. Почему бы не использовать это?
masterFly 24.11.2016 07:11

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

    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
            }
        }
    }

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

$this->form_validation->error_array();

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

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

Сделайте это в своем Контроллер

$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>

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

К сожалению, метод $this->form_validation->error_array() CodeIgniter возвращает только ошибки, исходящие от метода set_rules(). Он не учитывает имя поля формы, в котором возникла ошибка. Однако мы можем использовать другой метод CodeIgniter $this->form_validation->error(), который возвращает ошибку (и), связанную с конкретным полем формы, передав имя поля в качестве параметра.

//form validation rules
$this->form_validation->set_rules('f_name', 'First Name', 'trim|required', 
    ['required' => 'First Name is required']
);
$this->form_validation->set_rules('l_name', 'Last Name', 'trim|required', 
    ['required' => 'Last Name is required']
);
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email|is_unique[users.email]', 
    [
        'required'      => 'Email is required',
        'valid_email'   => 'Email format is invalid',
        'is_unique'     => 'Email already exists'
    ]
);
$error_arr = []; //array to hold the errors
//array of form field names
$field_names= ['f_name', 'l_name', 'email'];
//Iterate through the form fields to build a field=error associative pair.
foreach ($field_names as $field) {
    $error = $this->form_validation->error($field);
    //field has error?
    if (strlen($error)) $error_arr[$field] = $error;
}

//print_r($error_arr);

Другие вопросы по теме