Я пишу свой класс проверки формы с помощью CodeIgniter. Есть ли способ, чтобы я мог получать сообщения об ошибках в паре значений имени? Например, в форме образца есть четыре поля: user_name
, password
, password_conf
и timezone
. Среди них имя пользователя и 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.
Я разработал его так, чтобы:
Я нашел один способ самостоятельно, посмотрев код CodeIgniter: я расширил библиотеку CI_Form_validation как: –
class MY_Form_validation extends CI_Form_validation { public function getErrorsArray() { return $this->_error_array; } }
Я знаю, это взломать, но я буду служить во времени. Надеюсь, что команда CodeIginter скоро придумает интерфейс для доступа к этому массиву.
Вы можете просто использовать,
$this->form_validation->error_array();
Это из справочной документации класса CodeIgniter.
Видя, как проверка воспламенения кода дает вам сообщения об ошибках при обычном обновлении страницы, не лучше ли использовать что-то вроде плагина проверки jquery, который будет проверять полностью клиентскую сторону перед отправкой формы? Нет необходимости в AJAX.
EDIT: Я не предполагаю, что НЕ ДОЛЖЕН проверять серверную сторону, просто чтобы публикация с AJAX для проверки не нужна и уменьшит удары сервера, если вы сделаете это на стороне клиента. Он будет грамотно деградировать до регулярного обновления страницы с ошибками или успешным сообщением.
Решение, которое мне больше всего нравится, не связано с добавлением функции в любом месте или расширением библиотеки проверки:
$validator =& _get_validation_object(); $error_messages = $validator->_error_array;
Ссылка: http://thesimplesynthesis.com/post/how-to-get-form-validation-errors-as-an-array-in-codeigniter/
Вы должны иметь возможность называть это в любой точке вашего кода. Кроме того, стоит отметить, что есть более новая тема, которая также обсуждает это.
Вы можете создать частную функцию в своем контроллере
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 } } }
с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 } } }