2011-07-04 10 views
0

私はcakephpとjsonには新しいです。私は最近cakephpで休憩サービスを構築しました。すべてが機能しているようです。私はその下にこのコードを使用してリンクを照会すると、別のファイルに格納されます。Getリクエストを実行すると、私は自分のcakephpでJsonを返すことができますか?

<?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)); 

    } 


} 

>

答えて

0

あなたの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; 
?> 

要求されたURLは、上記のビューを取得します.jsonで終わる場合(通常はHTML)それ以外の場合は、デフォルトのビューとレイアウトが使用され、このように

<?php 
if (isset($errorMessage)) { 
    $errorMessageData['error'] = $errorMessage; 
    echo $this->Js->object($errorMessageData); 
} else { 
    echo $content_for_layout; 
} 
?> 

:我々は、エラーを返す標準的な方法を持つことができます。

4)コントローラにJsヘルパを追加する必要があるかもしれません。また、すべてのビューでJsヘルパーを有効にするためには、app_controller.phpを使用することをお勧めします。 CakePHPはレイアウトに基づいて自動的にインクルードするかもしれないが、app_controllerにJsヘルパーがあるので、追加する必要はないだろう。PHPのjson出力を追加する前から、私はあなたに確かに伝えることはできません。

+0

すごい大助かりの男!あなたの101のおかげで、私はどのように私は自分の問題を解決することができたかについての全体像を得た。残念なことに、あなたが私に与えたビューコードは私にとってはうまくいかず、私はエラーを受けました。しかし、代わりに次のコードを使用しました: '<?php echo json_encode($ post); ?> ' あなたの知識を共有してくれてありがとう、もう一度感謝します。 – jan

0

あなたはあなたのビューでJs helperのオブジェクトのメソッドを使用することができます。

は(の$ this - > Js->オブジェクトをエコー$ posts);

ます。またdefault.ctpにレイアウトからすべてのHTMLを含む避けるために、AJAXレイアウトを使用する場合があります

お使いのコントローラで:

$this->layout = 'ajax'; 

・ホープ、このことができます!

+0

こんにちはアレックス、ありがとうございました。私は 'echo json_encode($ posts);'を使いました。 jsonのデータベースから情報を返しました。 '{"投稿":{"id": "2"、 "タイトル": "タイトルがもう一度"、 "ボディ": "と投稿体が続く"、 "作成": "2011年7月3日16 :14:33 "、" modified ":" 0000-00-00 00:00:00 "}} 'となります。しかし、私はあなたのコードが何を理解していません。これは私のために役立つかもしれません、あなたはさらに説明できますか?前もって感謝します! Jan. – jan

+0

さて、$ this-> Js-> object()はJSヘルパーのメソッドで、JSON形式のデータを返します。 json_encode()はphp version> 5.2で利用できる新しい関数だと思います。 cakephpのJSヘルパーの代わりにこの関数を使うことにします。なぜなら、これは廃止されるように見えるからです。 – AlexBrand

+0

ああ、ありがとうございました。 – jan

関連する問題