php - 如何使用 CodeIgniter 表单验证库通过 AJAX 验证空复选框并显示消息?
问题描述
使用 CodeIgniter 表单验证库未选中复选框时显示表单错误消息。
目前,仅在选中复选框时才显示表单错误消息。
这是 AJAX 调用:
$('#add_user').on('submit', function(e) {
e.preventDefault();
$.ajax({
url : $(this).attr('action'),
method : "post",
data: $(this).serialize(),
dataType: "json",
success: function(result) {
if(result.success == true) {
alert('Success');
} else {
$.each(result.errors, function(key, value) {
var error = $('#' + key);
error.closest('div.form-group')
.find('.error').remove();
error.after(value);
});
}
}
});
});
这是 PHP 控制器:
$this->form_validation->set_rules('agreement', 'Agreement', 'callback_agreement_checkbox');
if($this->form_validation->run()) {
$data['success'] = true;
$this->load->view('Success');
} else {
foreach($this->input->post() as $key => $value) {
$data['errors'][$key] = form_error($key);
}
echo json_encode($data);
}
public function agreement_checkbox() {
if (empty($this->input->post('agreement'))) {
return FALSE;
} else {
$error = 'Please accept TOS';
$this->form_validation->set_message('agreement_checkbox', $error);
return TRUE;
}
}
当表单在未选中复选框的情况下提交时,不会显示错误消息(但应该)。它仅在选中复选框并且错误时显示。
编辑:
我做了一些修改以支持混合不同的输入数据:
$this->form_validation->set_rules('first_name', 'First name', 'trim|required');
$this->form_validation->set_rules('last_name', 'Last name', 'trim|required');
$this->form_validation->set_rules('email', 'E-mail', 'trim|required');
$this->form_validation->set_rules('agreement', 'Agreement', 'required');
if($this->form_validation->run()) {
$data['success'] = true;
$this->load->view('Success');
} else {
foreach($this->input->post() as $key => $value) {
$data['errors'][$key] = form_error($key);
}
if (empty($this->input->post('agreement'))) {
$data['errors']['agreement'] = form_error('agreement', '<div id="agreement_error">', '</div>');
}
echo json_encode($data);
}
解决方案
Codeigniter 的回调函数没有定义$this->input->post()
。我建议你使用required
. 所以它会是这样的。
$this->form_validation->set_rules('agreement', 'Agreement', 'required');
它将定义复选框在提交之前是否被选中。然后也更改此代码。
if($this->form_validation->run()) {
if(! empty($this->input->post('agreement))){
$data['success'] = "It was checked";
}else{
$data['error'] = validation_errors();
}
echo json_encode($data);
}
你的阿贾克斯:
success: function(result) {
if(result.success) {
console.log(result.success);
} else {
console.log(result.error);
}
}
让我知道结果。
推荐阅读
- xamarin - 获取列表视图滚动的开始位置以在 xamarin 表单 wpf 中结束
- asp.net - 电子邮件附件 ASP.Net MVC 5 未附加
- java - 当其中有空值时,如何分隔要动态添加到jtable的行数据?
- c# - 如何根据 SQL 数据库中的 Id 填充下拉列表
- c# - 如何在基于多个字段的弹性 search.net 中创建动态嵌套聚合查询
- php - Laravel elequent 分组通过加入(内部加入)字段与急切加载
- c - 如何让用户以任何顺序输入命令行参数?
- python - Python和Matlab中的Zscore有不同的结果
- git - 如何将本地 svn 存储库克隆到本地 git 存储库?
- ios - 如何将单元格索引路径添加为 Collectionview 单元格旁边的索引?