我只是使用ajax方法进行代码点火的新手。嗯,我有一个表单,用户需要填写所有字段,因为这是必需的。如果字段为空,我已经完成了错误消息。无论数据是否有效,我都会通过JSON从控制器获得响应。现在我的问题是,如果数据已发送到数据库,我如何显示通知?正在发送数据,顺便说一句,
表单
<form action="<?=base_url();?>execute/insert" id="formAddContent" autocomplete="off" class="nobottommargin" method="POST">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<label for="">Title <small>*</small></label>
<input type="text" name="content_title" id="content_title" class="sm-form-control">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="">Type <small>*</small></label>
<select name="content_type" id="content_type" class="sm-form-control">
<option value="">Type</option>
<option value="try">Try</option>
</select>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<label for="">Description <small>*</small></label>
<textarea class="required sm-form-control" id="content_body" name="content_body" rows="6" cols="30" required></textarea>
</div>
</div>
<div class="col-md-3 margintop-sm">
<button type="submit" class="btn btn-danger" id="data-content--submit">Submit</button>
</div>
</div>
</form>
控制器
public function validate($name, $label, $check) {
return $this->form_validation->set_rules($name, $label, $check);
}
public function insert() {
$data = array('success' => false, 'messages' => array());
$name = array('content_title','content_type','content_body');
$label = array('Title', 'Type', 'Content');
$verify = 'trim|required';
$this->validate($name[0], $label[0], $verify);
$this->validate($name[1], $label[1], $verify);
$this->validate($name[2], $label[2], $verify);
$this->form_validation->set_error_delimiters('<p class="text-danger">', '</p>');
if($this->form_validation->run()) {
$data['success'] = true;
} else {
foreach($_POST as $key => $value) {
$data['messages'][$key] = form_error($key);
}
}
echo json_encode($data);
$data = array (
$name[0] => $this->pass($name[0]),
$name[1] => $this->pass($name[1]),
$name[2] => $this->pass($name[2])
);
$result = $this->model->CreateContent($data);
if($result) {
redirect('master/content','refresh');
}
}
型号
public function CreateContent($data) {
$check = $this->db->select('content_title')->from('tblposts')->where(array('content_title' => $data['content_title']))->get();
if($check->num_rows() > 0) {
$this->notify([true,'#336699','#fff', 'Title already exists.']);
return $check;
} else {
$result = $this->db->insert('tblposts', $data);
$this->notify([true,'#336699','#fff', 'New content has been added.']);
return $result;
}
}
public function notify($data) {
echo json_encode(['success'=>$data[0],'bgcolor'=>$data[1],'color'=>$data[2],'message'=>$data[3]]);
}
jQuery AJAX
$('#formAddContent').submit(function(e) {
e.preventDefault();
var data = {
content_title: $('#content_title').val(),
content_type: $('#content_type').val(),
content_body: $('#content_body').val()
};
var url = $(this).attr('action');
$.ajax({
type: 'POST', url: url, data: data, cache: false, dataType: 'json',
success:function(data) {
if(data.success == true) {
successful(data.success,data.bgcolor,data.color,data.message);
} else {
$.each(data.messages, function(key,value) {
var element = $('#' + key);
element.closest('div.form-group')
.removeClass('has-error')
.addClass(value.length > 0 ? 'has-error' : 'has-success')
.find('.text-danger').remove();
element.after(value);
});
}
}
});
});
//Custom method if the request was success.
function successful(data,bgcolor,color,message) {
data == true ? notify(bgcolor,color,message) : notify(bgcolor,color,message);
}
//Amaran Notification
function notify(bgcolor,color,message) {
$.amaran({
'theme' : 'colorful', 'content' : {bgcolor: bgcolor,color: color,message: message},
'position' : 'top right', 'outEffect' : 'slideBottom'
});
}
JSON返回数组
{"success":true,"messages":[]}{"success":true,"bgcolor":"#336699","color":"#fff","message":"New content has been added."}
首先删除此部分:
if($result) {
redirect('master/content','refresh');
}
这将不会重定向除ajax请求(而不是页面提交请求(之外的任何内容,ajax请求99%的时间都不是所需的行为,并且它将阻止呈现successjson数组,这意味着您应该会收到控制台错误。如果您需要重定向,请通过成功函数中的js进行重定向。如果您对此感到困惑,请注意js是客户端,php是服务器端。
一旦删除了这个(你的代码的其余部分看起来很好(,页面应该会呈现一个成功消息,但它不会重定向。如果您选择在successful(data.success,data.bgcolor,data.color,data.message);
之后添加js重定向函数,您可能永远不会看到该消息。在这种情况下,当100%需要重定向时,您应该在控制器代码中添加一条flash消息,并在js中重定向,而不是使用successful()
。然后,如果您的下一个页面被配置为查看闪烁消息,它将显示在那里。
更新:
if ($this->form_validation->run()) {
$data['success'] = true;
} else {
foreach ($_POST as $key => $value) {
$data['messages'][$key] = form_error($key);
}
// this should be here!
echo json_encode($data);
exit; // otherwise create content will trigger even on failed fv!
}
$data = array(
$name[0] => $this->pass($name[0]),
$name[1] => $this->pass($name[1]),
$name[2] => $this->pass($name[2])
);