2016-07-25 11 views
0

Ich weiß, es gibt eine Tonne von anderen 'doppelte' Fragen da draußen, in Bezug auf dieses Thema. Aber ich bin immer noch fest. Ich versuche einfach, ein Array zu loggen, das von PHP über Ajax übergeben wurde.CakePHP Return Array von Ajax Post Call

In CakePHP 2.X:

In Aussicht:

<button class="quarter q1" value="1" value>Quarter 1</button> 
<button class="quarter q2" value="2">Quarter 2</button> 
<button class="quarter q3" value="3">Quarter 3</button> 
<button class="quarter q4" value="4">Quarter 4</button> 

<script type="text/javascript"> 
    jQuery(document).ready(function($){ 
    $('.quarter').click(function(e){ 
     e.preventDefault(); 
     var quarter_val = this.value; 

     $.ajax({ 
      url: "/rep/testQueue", 
      type: "post", 
      data: {quarter_val:quarter_val}, 
      success: function(data) { 
       var months = <?php echo json_encode($months); ?>; 

       console.log(months); 
      }, 
      error: function(){ 

      }, 
      complete: function() { 
      } 
     }); 

    }); 
    }); 
</script> 

In meinem Controller:

public function queue() { 
    if($this->request->isPost()) { 
    $this->autoRender = false; 
    $this->layout = false; 

    $quarter_chosen = $this->request->data['quarter_val']; 
    $month s= $this->_get_quarter($quarter_chosen); 

    $this->set('months', $months); 
    } 
    } 


    public function _get_quarter($quarter_chosen){ 
     switch($quarter_chosen) { 
      case 1: return array('January', 'February', 'March'); 
      case 2: return array('April', 'May', 'June'); 
      case 3: return array('July', 'August', 'September'); 
      case 4: return array('October', 'November', 'December'); 
     } 
    } 

Ich habe versucht, mehrere verschiedene Dinge. array_map, JSON.parse, Setzen von dataType auf json. Wenn ich versuche, Monate in der Ajax-Erfolgsfunktion zu loggen, bekomme ich null.

Wenn ich etwas nicht richtig verstehe, bitte füllen Sie mich aus, oder teilen Quellen, die werden. Dankesehr.

+0

Woher kommt diese PHP-Variable $ monats? Warum verwenden Sie die Datenvariable nicht in der Erfolgsfunktion? –

+0

Sie greifen auf eine PHP-Variable von jQuery zu, die nichts über PHP weiß. Der Code, den Sie vom Controller senden, ist kein JSON, daher können Sie ihn nicht in jQuery analysieren. Sie können nicht auf ein PHP-Mitglied namens "$ monates" auf dieser Seite zugreifen, das ist nicht der Fluss. Sie müssen mit jQuery, nicht mit PHP umgehen. Ich schlage vor, Sie lesen ein wenig mehr über jQuery und PHP, ist nicht so schwierig und wenn Sie es besser verstehen, werden Sie besser und einfacher. –

+0

Es kommt als Array() heraus, aber wenn ich versuche, Protokolldaten zu trösten, druckt es nichts. –

Antwort

0

Mate, Sie können den JS-Helfer des Kuchens verwenden. Beim 'succes' der Js -> request-Methode werden die Daten als "data" empfangen.

//somewhere on view 
$this->Js->get('.quarter')->event('click', 
    'var quarter_val = $(this).val();' . 
    $this->Js->request(
     array('controller' => 'ya controller', 'action' => 'ya action' , 'ya arguments (if needed)'), 
     array(
      'async' => true, 
      'dataExpression' => true, 
      'data' => '{quarter_val: quarter_val}', 
      'method' => 'POST', 
      'success' => 'console.log(data);' // It should print the returned data into your console 
     ) 
    ) 
); 

//Now, to print the buffered script by the JS helper: 
echo $this->Js->writeBuffer(); 

//To print it into your script block 
$this->append('script'); 
echo $this->Js->writeBuffer(); 
$this->end(); 

Ihr Controller-Methode sollte das Array echo stattdessen setzen sie mit $ this-> set(). Sie erhalten die Daten mit JS, so dass Sie die Daten json_encoded wiedergeben müssen, damit Ihr Skript sie verwenden kann.

//On your queue method, instead $this->set('months', $months); 
echo json_encode($months); 
exit(); 
0

Ihre Ajax-Anforderung ist:

url: "/rep/testQueue", 

und in Ihrem Controller Sie haben keine heißt test() -Methode. In cakePHP muss Ihre Ajax-Anfrage-URL lauten:

url: "/yourControllerName/yourMedhodName", 
+0

Entschuldigung, ich habe gerade vergessen, das hier richtig zu übersetzen. Ich habe testQueue in meinem tatsächlichen Code, ich wollte das Wort "test" für diesen SO-Post herausnehmen. –