Я пишу свой класс проверки формы с помощью 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.
Я разработал его так, чтобы:






Видя, как проверка воспламенителя кода дает вам сообщения об ошибках при обычном обновлении страницы, не лучше ли использовать что-то вроде плагин проверки jquery, которое будет полностью проверять клиентскую сторону перед отправкой формы? Таким образом, AJAX не нужен.
Обновлено: Я не предлагаю НЕ ПРОВОДИТЬ проверку на стороне сервера, просто публикация с помощью AJAX для проверки не требуется и уменьшит количество обращений к серверу, если вы сделаете это на стороне клиента. Он будет постепенно переходить к обычному обновлению страницы с ошибками или сообщением об успешном завершении.
Правильно, это было бы глупо. Я не предлагал НЕ ПРОВОДИТЬ проверку на стороне сервера - прочтите мое редактирование И исходный пост еще раз.
Кроме того, иногда НЕОБХОДИМО выполнить проверку на бэкэнд, например, чтобы проверить что-то в таблице базы данных (единственность в таблице)
Я сам нашел способ, заглянув в код CodeIgniter: Я расширил библиотеку CI_Form_validation, например: -
class MY_Form_validation extends CI_Form_validation
{
public function getErrorsArray()
{
return $this->_error_array;
}
}
Я знаю, что это взлом, но пока что мне пригодится. Я надеюсь, что команда CodeIginter скоро придумает интерфейс для доступа к этому массиву.
Это совсем не хакерство, в этом вся суть ООП. Я иду по той же дороге, и это мой финал, потому что я не вижу другой альтернативы.
Это однозначно хорошее решение. Позор codeigniter за то, что у него нет этой функции изначально!
Однако это не возвращает значения. Есть идеи, почему? Когда я сбрасываю указатель $ this, я вижу, что _error_array защищен. Массив всегда возвращается пустым.
Работает! Что касается последнего комментария, у меня плохо. Я сбрасывал массив до form_validation-> run () и, следовательно, пустой массив.
не называйте упс хаком !!
Зачем расширять? Это уже поддерживается библиотекой. Вы можете просто использовать $this->form_validation->error_array();. Одна линия!!!
Решение, которое мне больше всего нравится, не требует добавления функции в любом месте или расширения библиотеки проверки:
$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(); уже есть в библиотеке. Почему бы не использовать это?
Вы можете создать частную функцию в своем контроллере
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);
Валидация на стороне клиента не должна быть вашей единственной заботой, гораздо важнее бэкэнд-валидация.