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 скоро придумает интерфейс для доступа к этому массиву.
Ответ 2
Вы можете просто использовать
$this->form_validation->error_array();
Это из справочная документация классов в CodeIgniter.
Ответ 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
}
}
}