Если вы хотите сохранить html-версию и также хотите предоставить json-версию, то есть пара вещей, которые вам нужно сделать.
1) Убедитесь, что расширения передаются, чтобы вы могли сделать http://localhost/tut_blog/posts/index.json
. Есть информация на http://book.cakephp.org/view/1239/The-Simple-Setup (для * .xml, та же идея для * .json), но по существу вы добавляете следующее к app/config/routes.php
:
Router::parseExtensions();
2) Создайте представление, которое возвращает json. В вашем случае вы можете посмотреть на app/views/posts/json/index.ctp
, как показано ниже ...
<?php
$object = array();
if (!empty($posts)) {
$object = $posts;
}
$jsonObj = $this->Js->object($object);
echo $jsonObj;
?>
В вышеприведенном представлении я оставил вам много мест для вставки отладочной информации, но вы можете написать ее гораздо компактнее, когда будете довольны (<?php echo $this->Js->object($posts); ?>
).
3) Убедитесь, что у вас есть макет json (app/views/layouts/json/default.ctp
):
<?php
echo $content_for_layout;
?>
Это самый простой макет, который вы можете сделать, хотя для одного из моих клиентов мы вложили в него немного больше интеллекта, чтобы у нас был стандартный метод возврата ошибок:
<?php
if (isset($errorMessage)) {
$errorMessageData['error'] = $errorMessage;
echo $this->Js->object($errorMessageData);
} else {
echo $content_for_layout;
}
?>
Таким образом, если запрошенный URL заканчивается на .json, вы получите вид выше, в противном случае будет использоваться вид по умолчанию и макет (обычно html).
4) Возможно, вам понадобится добавить помощник Js к вашему контроллеру или, что еще лучше, app_controller.php, чтобы включить его для всех представлений. Есть вероятность, что вам не нужно будет добавлять его, поскольку CakePHP может автоматически включать его в зависимости от макета, но у нас был помощник Js в app_controller.php с тех пор, как мы добавили вывод json, поэтому я не могу сказать вам наверняка.