CodeIgniter Form Validation - Получить результат как "массив" Вместо "string"

Я пишу класс проверки формы, используя 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);

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

EDIT: мне предложили выполнить валидацию с помощью jQuery из одного из ответов:

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

Я разработал его так, чтобы:

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

Ответы

Ответ 1

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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