2016-05-14 4 views
0

Im Versuch, CakePHP 3 sendet json Antwort auf meine Javascript-Funktion zu bekommen, wenn ich es nennen, aber ich weiß nicht, den richtigen Weg, es zu tun ..CakePHP 3 Ajax Request Response von Controller-Aktion

JS Funktion:

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 Aktion:

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; 

     } 
} 

Frage: Die obige CakePHP-Aktion funktioniert und sendet die richtige Ausgabe, aber ist es richtig; Soll ich nicht eine Ajax-Ansicht oder ein Ajax-Layout verwenden?

Wenn ich Serialize wie unten verwenden, funktioniert es nicht, kommt als "undefined" in der JavaScript-Funktion. Was mache ich falsch? und was ist der richtige Weg?

Ist das folgende Beispiel auch nicht korrekt?

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: Ich habe JSON und XML-Routing und Ansichten aktiviert.

+0

Ihre Aktion-Methode richtig ist nur nicht vergessen, am Anfang Ihres m hinzufügen ethod: $ this-> autoRender = false; . Allerdings kann ich nicht sagen, dass es die richtige Methode ist, Ajax in CakePHP zu verwenden 3. Dieser Artikel könnte helfen: http://www.dereuromark.de/2014/01/09/ajax-and-cakephp/ – user3078643

+0

Der Artikel @ user3078643 schlägt vor, dass cakephp 2.0 nicht 3.0 ist. – user221931

+0

@ user221931 Es gibt einen Abschnitt über CakePHP 3.x – user3078643

Antwort

-1

Sie befinden wird PHP-Array über json senden, dann sind Sie kodieren ein Array in PHP und analysieren, um die Reaktion in js Funktion

Versuchen Sie dies in Ihrem CakePHP 3 Aktion:

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-Funktion:

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 wird nicht nur mit automatischer Anfrageverarbeitung und JSON-Serialisierung ausgeliefert, sondern das Anfrageobjekt enthält auch geeignete Methoden zur Definition der Antwort (Text, Header, etc.), was die OP versucht im ersten Beispiel. Ihr Beispiel macht die Dinge nur noch schlimmer, indem Sie all das beiseite legen und eine Ausnahme verursachen, weil Controller-Aktionen nur entweder "null" oder eine Instanz von "\ Cake \ Network \ Response" zurückgeben dürfen. Beachten Sie auch, dass die Option "autoRender" keine Wirkung hat, wenn Sie ein Antwortobjekt zurückgeben. – ndm

+1

ok dann was ist die richtige Lösung @ndm diese '$ this-> Set (kompakt ('Status')); $ this-> set ('_ serialize', ['status']); 'in meiner PHP-Funktion? –