2009-08-06 20 views
3

ist es möglich auf eine cockephp controller funktion verzichten zu können? Ich versuche, mein Server zurückgeben einen Datentyp zu haben, der kein String - aber ein Array cakephp, jquery, .ajax(), dataType: json

mein Controller-Funktion:


    function test() { 
     $this->layout = 'plain'; 
     $task['Numbers']['uno'] = 'mooo'; 
     $task['Numbers']['dos'] = 'says the cow'; 
     $result = json_encode($task); 
     $this->set('result', $result); 
    } 

meiner Ansicht Datei test.ctp

 


    echo $result; 

 

meine jquery:

 


    $('#test').live('click', test); 

    function test() { 

     var data = $('#form').serialize(); 

     $.ajax({ 
     type: "post", 
     url: "/controller/test", 
     data: data, 
     dataType: 'json', 
     success: function(response){    
     alert(response.Numbers.uno); 
     } 
     }); 

    } 

Klick auf das HTML-Element markiert Test mir nichts nicht geben. aber wenn ich

dataType: 'json',

herausnehmen und
alert(response.Numbers.uno);
zu
alert(response);

in meinem Jquery ändern - ich erhalte eine Warnung: die json codierten Daten, sondern als Zeichenkette (
alert(typeof response);
)

hat jemand eine Idee Was könnte passieren?

+0

Ich bin mit $ .post und halten die "json" am Ende so - '$ .post (url, Funktion (Daten) { \t if (Daten) \t { \t \t alert ("ja" + data.success); \t \t alert (Daten); \t} \t \t \t }, "json"); 'ich in der ersten Alarm nicht definiert erhalten (Alerting data.success) und ein String-Ausgabe, die alle Echos im 2. Fall enthält (alarming da ta) –

Antwort

3

Zuerst, um Ihre Frage zu beantworten, können Sie auf eine Ansicht verzichten (und dies ist ein guter Fall dafür). Setzen Sie in Ihrer Controller-Aktion (test, in diesem Fall) einfach $this->autoRender = false;. Das mache ich normalerweise und gebe einfach die codierte JSON-Zeichenfolge im Controller selbst aus. Weniger Unordnung auf diese Weise.

Das nächste, was ich mir ansehen würde, sind Ihre Debug-Einstellungen in config.php. Wenn nicht auf 0 gesetzt, besteht eine sehr gute Chance, dass dies dein Problem ist. Ihre Echo-Anweisung kann die JSON-formatierte Zeichenfolge wiedergeben, aber die Debug-Ausgabe an sie anhängen. Geben Sie in der Methode einfach Configure::write ('debug', 0) ein. Dies deaktiviert Debug nur für die aktuelle Anforderung. Ich tue dies in der Regel in meinem AppController tatsächlich:

if ($this->RequestHandler->isAjax()) { 
    Configure::write ('debug', 0); 
} 

ich ein Tool wie Firebug eingreifen würde und sehen, was Ihre Ajax-Request passiert. Es überwacht diese Anforderungen und stellt die Anforderungs- und Antwortheader für Sie zur Verfügung. Das kann helfen. Wenn Letzteres das Problem ist, dann hätte Firebug Ihnen das in den Antwortheadern gezeigt.

+0

Ich habe ein ähnliches Problem wie OP, ich benutze $ .Ajax wie ich in meinem Kommentar zu OPs Frage geschrieben habe. Wenn ich nur diese Bedingung hinzufügen: if ($ this-> RequestHandler-> isAjax()) { Configure :: write ('debug', 0); } ', keine Echos in meiner Controller-Logik zeigen nichts mehr. Wenn also ein Echo in die if-Bedingung gesetzt wird, gibt es auch kein Echo. Irgendwelche weiteren Ideen, um mein Problem zu lösen? Wie OPs - nicht in der Lage, JSON-Daten im Erfolgsmanager von $ .post mit alert (data.success) zu lesen, aber alle Echos mit Alert (Daten) zu lesen –

+0

Bitte überprüfen Sie meine Frage http://StackOverflow.com/q/ 6464248/351903 –

1

Ich stimme Rob zu, außer mit der Einstellung Ihrer Debug in der App-Controller. Das nervt mich ein wenig, weil man jedes Mal die Debug-Stufe im App-Controller setzen muss, wenn man etwas für eine bestimmte Funktion debuggen möchte. Ich schreibe meinen Handler so in den Controller, in dem ich arbeite.

Configure::write('debug', 0); 
$this->autoRender = false; 

Auch ich stimme der Verwendung von Firebug. Mit Firebug musst du nur den Firebug öffnen, auf Konsole klicken und dann deinen Test ausführen. Dies wird Ihnen sagen, was Sie mit Ihrer jQuery machen und Ihnen die Ergebnisse geben.

0

benutze ich nur

die(json_encode(array('success' => true, 'result' => $result))); 

am Ende der gerufenen Controller-Methode verwenden, und es funktioniert für mich .