Reputation: 4546
I will explain more, because it might not be clear enough
I want to set the ajax url to: www.domain/controller/method I already have everything in place for this with normal php.
But if I have to do this with ajax, I am not getting the intended result. The result should be some json variable being echo'd back to me. It is not entirely clear to me why.
In firebug I can see that the requestheader is not the same as the responseheader. I see the layout view in the response. I do not know yet how to bypass that. The basecontroller creates the view for the layout, but I have not extended the ajaxcontroller with the basecontroller?? For now I am running it threw another script that I call, but I would like it more if I could do it by the first method.
Has anyone some suggestions, please ?
EDIT
It seems after the comments below I need to provide some logic to disable the layout?
first attempt:
class testController extends baseController implements IController
{
public function testit()
{
$this->disableLayout = TRUE;
$check='testit';
$data =array();
header('Content-type: application/json');
$output = array(
"check" => $check,
"user" => $data
);
$this->content = json_encode($output);
exit(0); // Stop script.
}
}
thanks, Richard
Upvotes: 0
Views: 2133
Reputation: 7469
I'm making a guess here, but I think you are trying to serve different content from same action depending how it was requested.
To detect weather the page was requested by Ajax you could use specific header sent by browser.
Usually most recent JavaScript libraries send
X-Requested-With:XMLHttpRequest
header together with their ajax request. If yours doesn't you could easily make it to send it using something like this:
//Just example using raw XMLHttpRequest
var request = new XMLHttpRequest();
request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
//If you use Javascript library, see the documentation how to set custom request headers.
//But as I said most modern libraries already send X-Requested-With
Then in PHP you could check if request was made using Ajax by using this code block:
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) &&
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
//Send JSON.
} else {
//Send HTML.
}
EDIT: As Elzo Valugi mentioned, don't forget to use correct content type when outputing JSON in your action by using:
header('Content-type: application/json');
before sending any JSON or else you might have some problems with some JavaScript libraries.
This is more or less how the request + response headers should look like. Note that I'm actually sending some unneeded ones here like Prototype version, etc.
Upvotes: 4
Reputation: 1
You need to override the destructor of the basecontroller class. Copy the destructor in your controllerclass and modify the template file. Maybe you use an empty file. There is no hack required
Upvotes: 0
Reputation: 13097
I usually create a separate controller to handle Ajax requests. For example, /ajax/getusers/?page=2
may return the HTML for page two of a paginated users grid. I like this approach because it reminds me to keep my application logic and UI building logic separate.
Alternatively, you could just pass in a querystring with each ajax request such as: www.domain.com/controller/method/?ajax=1
and then hide your layout components when this is present.
Upvotes: 1
Reputation: 27876
Depending on your framework in the view you should return the view with json headers and without other information from the layout model.
header('Content-type: application/json');
also depending on how do you parse the result of your AJAX request you may have to set the response type to 'json'.
What I do in Zend Framework when working with Ajax requests and JSON is
$this->_helper->layout->disableLayout();
<?php echo $this->json($this->data) ?>
The json helper will add the headers.
Upvotes: 1