Я хочу знать, как я могу вернуть Json в моей CakePHP при выполнении запроса Get? - PullRequest
0 голосов
/ 04 июля 2011

Я новичок в CakePHP и JSON.Я недавно построил сервис отдыха с cakephp.Кажется, все работает.Когда я запрашиваю ссылку, используя следующий код, который хранится в отдельном файле:

<?php

$request =  'http://localhost/tut_blog/posts/'; 
$response = file_get_contents($request);
echo $response;
?>

, я получаю возврат в html, потому что я запрограммировал свой файл вида таким образом.Она - мой файл представления: index.ctp

<h2>View all posts</h2>

  <table>
    <tr>
    <th>Title</th>
    <th>Body</th>
     </tr>

<?php foreach($posts as $post):?> // met de functie foreach wordt er hier geloopt door de variable $posts die we eerder in de controller hadden aangemaakt en die alle waarden bezit van de query die we eerder hadden opgesteld.

<tr>
    <td><?php echo $post['Post']['title'];?></td> // de $posts array bevat 2 sleutels nr 1 = naam van de model, nr 2 = de naam van de veld in je tabel.
    <td><?php echo $post['Post']['body'];?></td>
</tr>

<?php endforeach; ?>
 </table>

Я хочу знать, как я могу получить те же самые данные, но затем в выводе JSON.Вот и мой файл контроллера:

 <?php 

class PostsController extends AppController{

var $name = 'Posts';

var $components = array('RequestHandler');

    function hello_world(){


    }


    function index(){


    $this->set('posts',$this->Post->find('all')); 

    }

    function view($id = NULL){ 


    $this->set('post',$this->Post->read(NULL, $id));

    }


}

?>

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Если вы хотите сохранить 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, поэтому я не могу сказать вам наверняка.

0 голосов
/ 04 июля 2011

Вы можете использовать объектный метод помощника Js На ваш взгляд:

echo $ this-> Js-> object ($ posts);

Возможно, вы захотите использовать макет AJAX, чтобы не включать весь HTML-код из макета default.ctp:

В вашем контроллере:

$this->layout = 'ajax';

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...