Проблема заключается в том, что автоматический рендеринг отключен только в том случае, если запрос выполняется с помощью запроса AJAX.При вводе адреса в адресной строке браузера, после вызова echo json_encode();
контроллер продолжит работу в конвейере рендеринга, ища шаблон действия и макет для вывода.
Я бы предложилсогласован между вашим рендерингом XML и JSON и выводится как через файлы шаблонов, так и не отключает autoRender для запросов AJAX.
AppController:
if ($this->RequestHandler->isXml()) { // Allow a json request to specify XML formatting
$this->RequestHandler->respondAs('xml'); // for setting headers
$this->RequestHandler->renderAs($this, 'xml'); // for specifying templates for rendering
} elseif ($this->RequestHandler->ext == 'json'|| $this->RequestHandler->isAjax()){ // 'action' ajax requests and all 'action.json' requests receive JSON
$this->RequestHandler->respondAs('json');
$this->RequestHandler->renderAs($this, 'json');
}
// Other requests will fall through to the default HTML rendering
Контроллеру необходимо только установить данные, и каждыйшаблон представления будет форматировать его по мере необходимости:
function action() {
// ...
$voicenote = $voicenote['Voicenote'];
$this->set(compact('voicenote', 'tiny_list'));
}
Шаблоны JSON будут относительно простыми, создавать их в соответствии с требованиями сообщений об ошибках.
Макет:
<?php echo $content_for_layout; ?>
JSON Action (app / views / контроллер / json / action .ctp)
<?php echo json_encode(array('voicenote' => $voicenote)); ?>
Ознакомьтесь с документацией CakePHP RequestHandler , чтобы узнать большепомощь