9 votes

Joomla - Tâche de contrôleur qui renvoie des données JSON

J'ai la tâche run dans mon contrôleur. Je veux qu'il renvoie des données JSON. Dans l'état actuel des choses, je reçois mes données JSON enveloppées dans le modèle HTML. Comment puis-je dire à Joomla de ne renvoyer que des données JSON à partir du contrôleur ? Voici la fonction que j'ai :

public function run  ( ) {

    JFactory::getDocument()->setMimeEncoding( 'application/json' );

    JResponse::setHeader('Content-Disposition','attachment;filename="progress-report-results.json"');

    JRequest::setVar('tmpl','component');

    $data = array(
        'foo' => 'bar'
    );

    echo json_encode( $data );

}

Et ceci revient :

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb" dir="ltr">
...
</head>
<body class="contentpane">

<div id="system-message-container">
</div>
    {"foo":"bar"}
</body>
</html>

J'aimerais obtenir :

{"foo":"bar"}

17voto

nibra Points 2001

Vous n'avez pas besoin de créer une vue JSON spéciale ( view.json.php ; ou contrôleur progressreports.json.php ) pour y parvenir. La seule chose à faire est d'afficher la chaîne JSON et de fermer l'application.

public function run( )
{
    JFactory::getDocument()->setMimeEncoding( 'application/json' );
    JResponse::setHeader('Content-Disposition','attachment;filename="progress-report-results.json"');

    $data = array(
        'foo' => 'bar'
    );
    echo json_encode( $data );
    JFactory::getApplication()->close(); // or jexit();
}

Vous n'avez besoin d'une vue (ou d'un contrôleur) distincte que si vous souhaitez fournir la fonction même avec une sortie HTML ou JSON (au choix de l'appelant).

4voto

Nagarjun Points 2089

Méthode rapide dans le contrôleur existant

Vous devez utiliser jexit() pour renvoyer des données json sans aucune sortie Joomla.

public function run  ( ) {

    $data = array(
        'foo' => 'bar'
    );

    echo json_encode( $data );
    jexit();

}

Méthode Joomla 3.x

La meilleure solution consiste à créer un contrôleur JSON et à utiliser JResponseJson pour produire du JSON. Le nom du fichier doit avoir un suffixe JSON. Par exemple, si votre contrôleur est un élément, le nom de votre fichier peut être item.json.php et vous pouvez ajouter un code de contrôleur comme ci-dessous.

public function run  ( ) {
  $data = array(
    'foo' => 'bar'
  );
  echo new JResponseJson($data);
}

Le résultat sera un fichier json comme ci-dessous.

{"success":true,"message":null,"messages":null,"data":["foo": "bar"]}

Votre URL ajax doit contenir un paramètre json pour déclencher ce contrôleur json.

index.php?option=com_mycomponent&task=item.run&format=json

Utilisez JResponseJson pour informer des erreurs et des messages. Lisez la documentation complète à l'adresse ci-dessous.

https://docs.joomla.org/JSON_Responses_with_JResponseJson

2voto

Jeffrey Ray Points 1182

J'ai obtenu la réponse.

Je devais créer un nouveau contrôleur. Dans mon cas, le contrôleur original s'appelait progressreports.php - j'ai créé un nouveau contrôleur appelé progressreports.raw.php.

Ensuite, lorsque vous appelez l'url, ajoutez format=raw, c'est-à-dire

index.php?option=com_foo&task=progressreports.run&format=raw

1voto

Elin Points 2990

En fonction de ce que vous faites, vous voudrez peut-être créer un document json, whatever.json.php au lieu de whatever.html.php.

1voto

inf3rno Points 2989

J'ai vérifié la réponse acceptée, elle ne fonctionne pas avec joomla 3.4.3. Si quelqu'un a le même problème, voici la solution pour les versions inférieures de joomla :

$data = array(
    'foo' => 'bar'
);
header('content-type: application/json; charset=utf-8');
echo json_encode($data);
JFactory::getApplication()->close();

L'en-tête content-disposition n'est nécessaire que si vous souhaitez proposer le fichier au téléchargement.

de l'eau : Je veux juste mettre fin à ce projet et boire quelque chose pour l'oublier. Même repartir de zéro et écrire un nouveau CMS serait moins douloureux :S

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X