2016-05-14 7 views
0

イム..CakePHPの3 Ajaxリクエストの応答CakePHPの3は、私はそれを呼び出すが、私はそれを行うための正しい方法を知らない私のjavascript関数にJSON応答を送信取得しようとして

JS機能:

function add(){ 
     //serialize form data 
     var formData = $('#newquestion').serialize(); 
     //get form action 
     var formUrl = $(this).attr('action'); 
     $.ajax({ 
      type: 'POST', 
      url: formUrl, 
      data: formData, 
      success: function(status){     
        console.log('content='+status); 
      }, 
      error: function(xhr,textStatus,error){ 
       alert(error); 

     } }); 

} 

CakePHPの3アクション:

public function addajax(){  

     if ($this->request->is('ajax')) {  

      $status['msg']="this is a message from cake controller";     
      $this->response->body(json_encode($status)); 

      return $this->response; 

     } 
} 

質問: 上記のcakephpアクションが機能し、正しい出力を送信しますが、正しいです。 私はajaxビューまたはajaxレイアウトを使用しないと思いますか?

私は以下のようにserializeを使うと、javascript関数の関数で "undefined"と表示されます。何が間違っているのですか?それを行う正しい方法は何ですか?

以下の例も正しくありませんか?

public function addajax(){  

     if ($this->request->is('ajax')) {  
      //$this->viewBuilder()->layout('ajax');   
      //$this->autoRender = false; // Set Render False  


      $status['msg']="this is a message from cake controller";    

      $this->set(compact('status')); 
      $this->set('_serialize', ['status']); 


      //$this->response->body(json_encode($status)); 
      //return $this->response; 

     } 
    } 

PS:JSONとXMLのルーティングとビューを有効にしました。

あなたのアールは、あなたの CakePHPの3アクションでこれを試してみてください、あなたがPHPの配列をコードしている、JSON経由でPHPの配列を送信し、jsの機能に

を応答を解析します

+0

あなたの操作方法は正しいです。あなたのmの冒頭に追加することを忘れないでくださいエソード:$ this-> autoRender = false; 。しかし、cakephp 3でajaxを使う正しい方法であるとは言えません。この記事は役に立ちました:http://www.dereuromark.de/2014/01/09/ajax-and-cakephp/ – user3078643

+0

記事@ user3078643はcakephp 2.0ではなく3.0を提案しています。 – user221931

+0

@ user221931 cakephp 3.xに関するセクションがあります – user3078643

答えて

-1

public function addajax(){ 

    $this -> autoRender = false;  

    if ($this -> request -> is('ajax')) {  

     $status['msg']= "this is a message from cake controller";    

     return json_encode($status); 

    } 
} 

JS関数:

function add(){ 
    //serialize form data 
    var formData = $('#newquestion').serialize(); 
    //get form action 
    var formUrl = $(this).attr('action'); 
    $.ajax({ 
     type: 'POST', 
     url: formUrl, 
     data: formData, 
     success: function(status){ 
      var json = JSON.parse(status);    
      console.log('content='+json.msg); // .msg is name of your index $status['msg'] 
     }, 
     error: function(xhr,textStatus,error){ 
      alert(error); 
     } 
    }); 
} 
+1

CakePHPは自動リクエスト処理とJSONシリアライゼーションだけでなく、レスポンス(本文、ヘッダーなど)を定義するための適切なメソッドも含んでいます。 OPは最初の例で試しています。あなたの例は、コントローラアクションが 'null'または' \ Cake \ Network \ Response'のインスタンスだけを返すことが許可されているため、すべてのことをサイドステッピングし、例外を引き起こすことで状況を悪化させます。また、 'autoRender'オプションは応答オブジェクトを返すときには効果がないことにも注意してください。 – ndm

+1

ok then正しい解決策は何ですか@ndmこれを追加します '$ this-> set(compact( 'status')); $ this-> set( '_ serialize'、['status']); '私のPHP関数ですか? –

関連する問題