Reputation: 3111
I've been handling success/error messages by returning json encoded arrays as a response, but it suddenly occurred to me that this probably isn't the correct way of handling notifications.
For example, my controller will look like this:
public function controller_name() {
//validate form input
$this->form_validation->set_rules('id', 'id', 'required|is_natural_no_zero');
// if validation was successful with no errors
if ($this->form_validation->run() && $this->model_name->method()) {
$this->data['status'] = 'success';
$this->data['message'] = 'This is the success message';
echo json_encode($this->data);
} else {
$this->data['status'] = 'error';
$this->data['message'] = validation_errors();
echo json_encode($this->data);
}
}
Then the jQuery:
$.ajax({
url: url,
type: 'POST',
data: data,
success: function (r) {
json = $.parseJSON(r);
if (json.status == 'success') {
if (json.message == 'added') {
$this.addClass('success');
} else {
$this.removeClass('success');
}
} else {
console.log('There was an error')
}
What's the best practice way to do this? Can I throw exceptions to use the ajax error?
Upvotes: 1
Views: 8621
Reputation: 140210
Sending erroneous http status code should trigger the jQuery ajax error handler:
public function controller_name() {
//validate form input
$this->form_validation->set_rules('id', 'id', 'required|is_natural_no_zero');
// if validation was successful with no errors
if ($this->form_validation->run() && $this->model_name->method()) {
$this->data['message'] = 'This is the success message';
} else {
$this->output->set_status_header('400'); //Triggers the jQuery error callback
$this->data['message'] = validation_errors();
}
echo json_encode($this->data);
}
JS:
$.ajax({
url: url,
type: 'POST',
data: data,
success: function (r) {
var json = $.parseJSON(r);
},
error: function( jqXhr ) {
if( jqXhr.status == 400 ) { //Validation error or other reason for Bad Request 400
var json = $.parseJSON( jqXhr.responseText );
}
}
});
Upvotes: 8