Это шаблон, который я использую в CakePHP 1.3.x. Процесс обычно:
- Создание альтернативной json-ориентированной компоновки и просмотра файлов
- Обнаружение, является ли входящий запрос AJAX
- Явное отображение альтернативного макета / представления json вместо text / html
Не забудьте включить компонент RequestHandler и JsHelper в контроллер вашего приложения.
В данном контроллере:
function test() {
if($this->RequestHandler->isAjax()) {
$this->set('data', $this->data);
// Explicit call to render an ajax response, using a layout and view made specifically for ajax
$this->layout = 'json';
$this->render('ajax_test');
}
// else render views/controllername/test.ctp like normal
}
Ваше приложение / views / layouts / json.ctp file:
<?php
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
header('Content-Type: text/x-json');
header("X-JSON: ".$content_for_layout);
echo $content_for_layout;
?>
Ваш файл app / views / controllername / ajax_test.ctp должен содержать только:
<?php echo $js->object($data); ?>
Теперь на вашей странице, которая на самом деле собирается сделать ajax-вызов, это может выглядеть примерно так с кодом jQuery:
<div id='status'></div>
<?php echo $form->create('Test', array('id'=>'testForm')),
$form->input('message'),
$form->end();
?>
<script type='text/javascript'>
$('#testForm').submit(function(event) {
event.preventDefault(); // interrupt form submission
$.ajax({
type: "POST",
url: "/controllername/test",
data: $('#testForm').serialize(),
success: function(data, textStatus, xmlHttpRequest) {
$("#status").html(data.Test.message);
},
error: function(jqXHR, textStatus, errorThrown) {
alert("There was a problem processing the request: " + jqXHR);
}
});
});
</script>