2009-08-06 3 views
3

cakephpコントローラ機能の表示なしでできるのですか?私は自分のサーバーが文字列でないデータ型を返すようにしようとしています - が、配列 cakephp、jquery、.ajax()、dataType:json

は私のコントローラ機能:


    function test() { 
     $this->layout = 'plain'; 
     $task['Numbers']['uno'] = 'mooo'; 
     $task['Numbers']['dos'] = 'says the cow'; 
     $result = json_encode($task); 
     $this->set('result', $result); 
    } 

私の見解ファイルtest.ctp

 


    echo $result; 

 

my jquery:

html要素をクリックする210
 


    $('#test').live('click', test); 

    function test() { 

     var data = $('#form').serialize(); 

     $.ajax({ 
     type: "post", 
     url: "/controller/test", 
     data: data, 
     dataType: 'json', 
     success: function(response){    
     alert(response.Numbers.uno); 
     } 
     }); 

    } 

はテストは私に何かを与えていないとマーク。しかし、私は

dataType: 'json',

を取り出し、私のjqueryので
alert(response.Numbers.uno);

alert(response);

にを変更した場合 - 私は警告を取得:(
alert(typeof response);
)JSONエンコードされたデータをが、文字列として

誰もが任意のアイデアを持っていません何が起こっているのでしょうか?

+0

"はい" + data.success); \t \t警告(データ); \t} \t \t \t }、 "JSON"); '私は()data.successを警告する最初の警告で未定義の取得と取得2番目のケースのすべてのエコーを含む文字列出力(警告ダta) –

答えて

3

最初に、あなたの質問に答えるために、はい、あなたはビューなしで行うことができます(そしてそうするのが良いケースです)。コントローラの動作(この場合はtest)で、$this->autoRender = false;と設定してください。これは私が通常やっていることで、コントローラ自体にエンコードされたJSON文字列をエコーアウトするだけです。そのように混乱を少なくします。

次のことは、デバッグ設定がconfig.phpであることです。 0に設定しないと、これがあなたの問題である可能性が非常に高いです。 echoステートメントがJSON形式の文字列をエコーし​​ている可能性がありますが、デバッグ出力を追加しています。この方法では、Configure::write ('debug', 0)を含めるだけです。これにより、現在の要求のデバッグのみが無効になります。私は通常、実際に私のAppControllerに次の操作を行います。

if ($this->RequestHandler->isAjax()) { 
    Configure::write ('debug', 0); 
} 

私はFirebugのようなツールを従事し、あなたのAjaxリクエストに何が起こっているか参照してくださいね。これらの要求を監視し、検査するための要求ヘッダーと応答ヘッダーを提供します。それは助けるかもしれません。後者が問題であれば、Firebugはそれをレスポンスヘッダに表示しているはずです。

+0

私はOPのような問題を抱えています。OPの質問に私のコメントで書いたように$ .ajaxを使っています。 if($ this-> RequestHandler-> isAjax()){ Configure :: write( 'debug'、0);この条件を追加するだけです。 } '、私のコントローラロジックのエコーは何も表示されなくなりました。したがって、エコーをif条件の中に入れてもエコーされません。私の問題を解決するためのさらなるアイデアはありますか? OPと同じです - 警告(data.success)を使って$。postの成功ハンドラ内でjsonデータを読み取ることはできませんが、警告(data)を使用してすべてのエコーを読み取ることができます –

+0

私の質問を確認してくださいhttp://stackoverflow.com/q/ 6464248/351903 –

1

私はRobに同意しますが、あなたのデバッグをアプリケーションコントローラに設定することを除きます。特定の機能のデバッグを行うたびに、アプリケーションコントローラでデバッグレベルを設定する必要があるため、少し迷惑をかけることがあります。私はこのようなコントローラを私の中で働いています。

Configure::write('debug', 0); 
$this->autoRender = false; 

また、私はファイヤーバグの使用に同意します。火かき棒であなたがしなければならないことは、火薬瓶を開いて、コンソールをクリックしてから、あなたのテストを実行することです。これはあなたのjqueryで何をしているのかを伝え、結果をあなたに伝えます。

0

データを使用する前に変換する必要があります。
この回答を参照してください:

jQuery ajax request with json response, how to?

あなたは、私はちょうどと呼ばれるコントローラのメソッドの最後で

die(json_encode(array('success' => true, 'result' => $result))); 

を使用して、それが私の作品

var json = $.parseJSON(response); 
alert(json.Numbers.uno); 
0

を使用する必要があります。 (データ) \t { \t \t警告( `$の.post(URL、 機能(データ) { \t場合 - 私は$ .postを使用して、このような最終的には、 "JSON" を保管しております