2016-08-10 1 views
0

Eingesetzte Technologien: CakePHP 1.3, JQueryCakePHP 1.3 - JQuery - Get Daten in einem gültigen JSON

Bei einer ersten Anordnung, möchte ich die Werte eines zweiten Feldes setzen des Wertes in diesem ersten Feld ausgewählt abhängig.

Konkret ist das erste Array eine Liste von Unternehmen, das zweite Array muss mit den Jobangeboten des ausgewählten Unternehmens gefüllt werden. Dazu mache ich bei Änderung eine Ajax-Anfrage, um von der Datenbank die Stellenangebote zu bekommen.

Was nicht funktioniert ist, dass es scheint, dass ich mein Javascript mit einem gültigen JSON nicht bereitstellen kann. Der JSON, der zurückgesendet wird, beginnt immer mit einer neuen Zeile. (Einmal habe ich es bei Firefox als "\ n" gesehen, Chrome hat nur eine neue Zeile eingefügt).

Ich habe dieses Javascript in einem anderen Kontext (Spring MVC) verwendet, und es funktionierte. Mein Hauptverdächtiger ist also mein CakePHP-Controller.

Ich habe schon viele Dinge ausprobiert, wie die Daten als String im JS zu manipulieren, aber keiner hat funktioniert, also muss ich mich fragen. Ist schon jemand von Ihnen auf dieses Problem gestoßen?

Hier sind die Codes:

Html:

<div class="form" style="width: auto"> 

     <?php 
     echo $form->create('Slot', array('url' => array('controller' => 'slot', 'action' => 'add'))); 
     echo $form->input('company_id', array('label' => 'Company:', 'options' => $companies)) . "<br/>"; 
     echo $form->input('offer_id', array('label' => 'Offer', 'options' => array('0' => 'Chose a company first!'))) . '<br/>'; 
     echo $form->end('Register') . '<br/>'; 
     ?> 
</div> 

Javascript:

$.ajax({ 
    url: "/admin/slots/getCompanyOffers/" + this.value, 
    type: "POST", 
    dataType: "json", 
    success: function (data) { 
     var select = $('#SlotOfferId'); 
     select.empty(); 
     select.append($('<option/>')); 

     $.each(data, function (key, value) { 
      select.append($('<option/>').text(value).attr('value', key)); 
     }); 
    } 
}); 

Controller:

function admin_getCompanyOffers($companyId) { 
    Configure::write('debug', 0); 
    $this->autoRender = false; 
    if (!$this->RequestHandler->isPost()) { 
     echo "POST mandatory"; 
     return; 
    } 

    $offers = $this->Offer->find('all', array('recursive' => -1, 
     'fields' => array('id', 'title'), 
     'conditions' => array('company_id' => $companyId))); 

    echo json_encode(Set::extract('/Offer/.', $offers)); 
} 
+0

Ich denke, dass Sie richtige Header vor der Antwort festlegen sollten. Einfachster Weg: 'header ('Content-Type: application/json')' – Bart

+0

@Bart Diese Zeile muss in der Controller-Methode hinzugefügt werden? – Acedrin

+0

Ja, z.B. kurz vor 'echo json_encode ...' Zeile – Bart

Antwort

0

Sie sollten diese

versuchen
function admin_getCompanyOffers($companyId) { 
    Configure::write('debug', 0); 
    $this->autoRender = false; 
    if (!$this->RequestHandler->isPost()) { 
     echo "POST mandatory"; 
     return; 
    } 

    $offers = $this->Offer->find('all', array('recursive' => -1, 
     'fields' => array('id', 'title'), 
     'conditions' => array('company_id' => $companyId))); 

    return json_encode(Set::extract('/Offer/.', $offers)); 


} 
+0

Ich habe das 'echo' in' return' geändert, wie du sagtest, aber es hat nicht funktioniert. Erhalte immer noch eine neue Zeile am Anfang des JSON, und '$ .ajax' erkennt sie nicht als gültiges JSON. – Acedrin