web-dev-qa-db-fra.com

Renvoyer JSON à l'aide du framework Joomla

J'ai commencé à construire une application Web en utilisant le Joomla Framework . Il consiste en une simple page Web qui sera affichée dans un iFrame avec une API qui sera utilisée pour mettre à jour le contenu avec AJAX.

J'ai suivi l'article Mise en route avec Composer et Joomla! et j'ai mis le Framework App en marche. J'ai personnalisé la sortie HTML par défaut travailler pour mon iFrame et avoir démarré l’API. J’ai utilisé News comme modèle et créé un contrôleur, un modèle, un tableau et une vue pour mon API qui fonctionne parfaitement. J'ai ensuite créé un très simple Twig qui retourne une représentation JSON de mes données comme ceci:

{{ items|json_encode|raw }}

Jusqu'ici tout va bien, mais je reçois cet en-tête, ce qui posera des problèmes lors de l'utilisation de AJAX avec jQuery:

Content-Type:text/html; charset=utf-8

J'ai pensé que ce serait un cas simple d'ajouter ceci, mais peu importe où je le mets, cela ne change pas l'en-tête renvoyé:

$this->app->setHeader('Content-Type', 'application/json', true);

Je sais que setHeader fonctionne comme si je changeais le nom. Je vois le nouvel en-tête renvoyé, donc je suppose qu'il est écrasé plus tard dans l'exécution.

Ma question est donc la suivante: est-ce que je vais dans ce sens? Mon point de vue s'étend à DefaultHtmlView qui se sent mal, dois-je créer un DefaultJsonView? Comment définir le type de contenu approprié ou existe-t-il une meilleure approche pour renvoyer JSON?

Toute aide ou conseil pouvant être donné sur la meilleure manière d'utiliser Joomla Framework pour créer une API sera grandement apprécié.

11
Joe P

J'ai finalement trouvé ce qui semble être la "bonne" façon de procéder. Même si j’utilisais sendHeaders, le type de contenu supplémentaire était en cours d’ajout et renvoyé au fur et à mesure de son ajout.

J'ai suivi le code et AbstractWebApplication.php définit les en-têtes avec cette ligne:

// Send the content-type header.
$this->setHeader('Content-Type', $this->mimeType . '; charset=' . $this->charSet);

J'ai donc pu définir mon propre mimeType en utilisant ceci dans mon code:

$this->app->mimeType = 'application/json';

Maintenant, l'en-tête correct est renvoyé et jQuery comprend la sortie en tant que JSON!

6
Joe P

Il a fallu creuser un peu mais je vois le problème

https://github.com/joomla-framework/application/blob/master/src/AbstractWebApplication.php

Si vous examinez la fonction setHeader, celle-ci ne définit pas encore l'en-tête, elle le récupère seulement "prêt"

Donc, ce que vous devez faire est simple

$this->app->setHeader('Content-Type', 'application/json', true)->sendHeaders();

La fonction supplémentaire sendHeaders() peut être chaînée pour vous permettre de définir les en-têtes, et pas seulement de les "préparer".

Avec le plus probable utilisant exit; pour empêcher toute exécution ultérieure et sortir le JSON, la fonction sendHeaders ne fonctionnera probablement pas.

3
Jordan Ramstad