Zum Inhalt springen

Keine JSON-Ausgabe

Erstellt am 8. Mai 2014 · 1 Antwort · letzte Antwort am 9. Mai 2014

Tags: JavaScript & AJAX, Frage

morlock ·

Hallo zusammen!

Ich baue gerade ein paar Prototypen für AJAX-Aufrufe - ich möchte gern Daten per AJAX im JSON-Format abrufen.
Soweit ich den Definitive Guide und das Flow Cookbook verstehe, sollte die Ausgabe ja vom Request Header abhängig sein (können). Mein Beispiel ist schon ganz einfach - der Controller:

class StandardController extends \TYPO3\Flow\Mvc\Controller\ActionController {

    /**
     * @var \TYPO3\Flow\Security\Authentication\AuthenticationManagerInterface
     * @Flow\Inject
     */
    protected $authenticationManager;

    /**
     * @var array
     */
    protected $supportedMediaTypes = array('text/html', 'application/json');

    /**
     * @var array
     */
    protected $viewFormatToObjectNameMap = array('json' => 'TYPO3\Flow\Mvc\View\JsonView');

    /**
	 * @return void
     * Liefert die Startseite aus
	 */
	public function indexAction() {
	}


    public function isloggedinAction() {
        $this->view->assign('value', array('loggedin' => $this->authenticationManager->isAuthenticated()));
    }
}

Der Abruf erfolgt(e) mit jQuerys $.get - da hier im Request-Header als erlaubte Rückgabe noch text/javascript mit aufgeführt wurde, habe ich die erlaubte Rückgabe selbst angepasst. Der Request-Header sieht nun so aus:

Accept	application/json
Accept-Encoding	gzip, deflate
Accept-Language	de,en-US;q=0.7,en;q=0.3
Content-Type	application/json
Cookie	TYPO3_Flow_Session=x10lY176jm4vKLTtUMD3rDhQ0FMf9paN
Host	172.16.3.123
Referer	http://172.16.3.123/
User-Agent	Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
X-Requested-With	XMLHttpRequest

Wichtig: Mir geht es nicht um einen Workaround - wenn ich im Controller ein json_encode mit den gewünschten Daten mache funktioniert's natürlich.
Ich würde aber gern die Flow-Standards verstehen (und einsetzen) und vor allem auch verstehen, wo mein Fehler liegt.

Viele Grüße,
Christian

morlock ·

Ich habe mich jetzt quer durch den Flow Core gewühlt, um das Verhalten nachzuvollziehen. Meine Erkenntnisse (korrigiert mich, wenn ich falsch liege):

- der ActionController entscheidet in "resolveViewObjectName" letztendlich, welches View Object verwendet wird
- sind keine "eigenen" Views im Package definiert, fällt die Methode über die "viewFormatToObjectNameMap" auf einen dort spezifizierten View zurück
- diese Entscheidung basiert auf der Eigenschaft "format" des ActionRequests
- diese Eigenschaft wird in der Methode setArgument (und eine Ebene weiter oben in setArguments) gesetzt - die Arguments stammen wiederum aus dem HTTP Request in Kombination mit Default-Werten der Route.

Das Problem ist jetzt: in den arguments des HTTP-Requests taucht niemals ein format auf. Es gibt im HTTPRequest zwar eine tolle Methode "getAcceptedMediaTypes" sowie eine "getNegotiatedMediaType" (die letztendlich wohl verwendet wird, um den mediaType im Controller zu setzen - siehe AbstractController), ABER: ich sehe nicht, wo der mediaType wieder verwendet wird. Er scheint keinen Beitrag zur Auswahl des View-Objekts zu leisten.

Definiere ich eine Route für meine Action und setze dort als Format JSON funktioniert natürlich alles. Das entspricht aber nicht dem, was dokumentiert ist:
"In either case, the JSON View is now invoked if a request is sent which prefers the media type application/json." (http://docs.typo3.org/flow/TYPO3FlowDocumentation/TheDefinitiveGuide/PartIII/ModelViewController.html#json-view)

Habe ich ein Brett vorm Kopf oder ist das (leider wieder) eine Funktionalität, die im Definitive Guide dokumentiert ist und einfach nicht (fertig?) umgesetzt wurde?

Grundsätzlich: Ich sehe großes Potential in Flow - im Moment aber auch die Gefahr, dass das Projekt mangels Dokumentation irgendwann stirbt. Was meint ihr hier? Oder liegt der Fehler bei mir?

Viele Grüße,
Christian