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));
}
Ich denke, dass Sie richtige Header vor der Antwort festlegen sollten. Einfachster Weg: 'header ('Content-Type: application/json')' – Bart
@Bart Diese Zeile muss in der Controller-Methode hinzugefügt werden? – Acedrin
Ja, z.B. kurz vor 'echo json_encode ...' Zeile – Bart