Via een AJAX request binnen jQuery na het valideren van een form wordt er ingelogd doormdiddel van Zend_Auth, dit gaat allemaal goed totdat ik een JSON array wil retournen die er alsvolgt uitziet:

{"formValid":true}


<?php
$this->_helper->json((array(
'formValid' => $this->_form->valid
)));
?>

Maar jQuery kan hem maar niet uitlezen:


submitHandler: function() {
    $.ajax({
        type: 'POST',
        url: '',
        data: $(formId).serialize(),
        dataType: 'JSON',
        complete: function(data) {
            alert(data.formValid);
        }
    });
};


En krijg bij die alert continu: 'undefinded'. Heb dingen zoals de action en alle overige code even weggehaald. Ik weet niet waar het probleem zit en hoop daarom dat iemand mij kan helpen of eventueel mee kan denken.

Alvast bedankt en een fijne avond!
firefox + firebug? Probeer dan eens console.log(data) in plaats van die alert... zie je veel meer.

Anders

<?php
var e='';
for (var i in data) e += i;
alert(e);
?>
krijg je een indruk van wat er zoal in data terugkomt.
Wat zou ik daar voor info moeten uithalen? Veel meer kan ik er niet uithalen.

readyState	4
responseText		"{"formValid":true}"
status			302
statusText		"Found"


readyStatesetRequestHeadergetAllResponseHeadersgetResponseHeaderoverrideMimeTypeabortdonefailprogressstateisResolvedisRejectedthenalwayspipepromisesuccesserrorcompletestatusCoderesponseTextstatusstatusText
Is het niet "true" in JSON?

Bas, of chrome met de webkit web inspector of opera die ook al een inspector heeft, precies zoals IE. En ook FireFox heeft vanaf het begin al een console zonder firebug en ook FireFox heeft sinds FF10 een inspector (zeer slecht, maar dat laten we buiten beschouwing).
ah. Je hebt dus de responseText nodig; kennelijk moet je die ook nog uitpakken. Hoe? Misschien met JSON.decode? (eval probeer ik te vermijden, dat is ook een optie)

@Wouter, true over de browsers. Ik weet niet uit mijn hoofd of je in JSON een bool moet quoten. Ik denk van niet.
Ik zie de fout al, je gebruik complete maar je moet success gebruiken dan werkt het wel. Complete geeft je een object met verschillende gegevens, zoals status en responseText.

@Bas, even getest en het hoeft niet.
Wouter J op 08/04/2012 22:32:31

Ik zie de fout al, je gebruik complete maar je moet success gebruiken dan werkt het wel. Complete geeft je een object met verschillende gegevens, zoals status en responseText.

@Bas, even getest en het hoeft niet.


Dat heb ik bewust gedaan omdat hij in 'succes' helemaal niets doet omdat de JSON niet goed geretourneert wordt.
Dan moet je dit gebruiken:
$.ajax({
    type: 'POST',
    url: '',
    data: $(formId).serialize(),
    dataType: 'JSON',
    complete: function(data) {
        var result = JSON.parse(data.responseText);
        alert(result.formValid);
    }
});


Maar dan is eigenlijk het hele nut van de JSON type weg, je moet nu namelijk alsnog zelf de JSON parsen.
@Wouter Het werkt inderdaad wel zo. Wat kan dan het probleem zijn? De 'Content-Type' die ZEND retourneert is ook 'application/json' en heb het ook al geprobeerd met 'text/html', maar werkt ook niet. Cache staat ook uit.
Kun je geen online voorbeeldje maken ofzo? Ben ook wel benieuwd.

Eventueel kun je zelf een AJAX request als test maken die wel werkt (dus gewoon naar een normale test.json bestand ofzo). Vervolgens ga je de jqXHR objects vergelijken in bijv. de complete, beforeSend en 302 status callback. Zie je verschillen tussen de Zend en de test versie?
Online voorbeeld gaat nu (vanavond) niet meer lukken. Maar ik vindt dit gewoon erg raar.

Graag zie ik jullie reacties tegemoet.

[size=xsmall]Toevoeging op 09/04/2012 12:45:19:[/size]

Totdat ik een oplossing heb gevonden blijf ik even de 'oplossing' van Wouter gebruiken.


var result = JSON.parse(data.responseText);


Ik hoop dat er in de tussentijd iemand een oplossing heeft.

Reageren