9
votes

Joomla - Tâche du contrôleur qui renvoie les données JSON

J'ai la tâche exécuter code> dans mon contrôleur. Je veux qu'il retourne des données JSON. Comme il se trouve, je reçois mes données JSON enveloppées dans le modèle HTML. Comment puis-je dire à Joomla pour simplement retourner les données JSON du contrôleur? C'est la fonction que j'ai: xxx pré>

et ce retour: p> xxx pré>

Je voudrais obtenir: p>

{"foo":"bar"}


0 commentaires

7 Réponses :


2
votes

obtenu la réponse.

Je devais faire un nouveau contrôleur. Dans mon cas, le contrôleur d'origine a été appelé, ProgressReports.php - J'ai fait un nouveau contrôleur appelé progresReports.raw.php. P>

puis lorsque vous appelez l'URL, ajoutez le format = RAW. I.e. P>

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


1 commentaires

Il y a quelques façons de le faire. Ce que vous avez fait est une solution et Nagarjun a souligné quelque chose que vous devez vous assurer que vous faites pour les demandes JSON. Vous pouvez également utiliser un contrôleur ProgresReports.json.php et modifier votre demande au format = JSON. À la fin de la journée, tant que cela fonctionne pour vous, alors vous êtes prêt à partir.



3
votes

Méthode rapide dans le contrôleur existant

Vous devez utiliser jexit () code> pour renvoyer des données JSON sans aucune sortie JOOMLA. P>

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


0 commentaires

1
votes

Selon ce que vous faites, vous voudrez peut-être créer un document JSON, quoi que ce soit.json.php au lieu de tout.html.php.


0 commentaires

17
votes

Vous n'avez pas besoin de créer une vue spéciale JSON ( vue.json.php code>; ou contrôleur progresReports.json.php code>) pour atteindre cela. La seule chose que vous avez à faire est d'echo 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();
}


1 commentaires

Cette réponse est de 2013 et n'a pas travaillé pour moi. Au lieu de cela, j'ai utilisé la solution d'Inf3RNO, qui fonctionne bien



1
votes

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

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


0 commentaires

0
votes

Je n'aime pas beaucoup de Jresponsejson et j'aime aussi en faisez des messages pour la prochaine demande, j'ai donc fait la méthode suivante sur le contrôleur principal de mon composant: xxx pré>

dans n'importe quelle tâche du contrôleur ou du sous-contrôleur, vous pouvez maintenant effectuer les éléments suivants: P>

public function sampleTask()
{
    $app = Factory::getApplication();
    $app->enqueueMessage("Done (for the next user's request)", 'success');
    $this->returnJson("json data");
}


0 commentaires

0
votes

Joomla 4

Vous devez ajouter le paramètre & format = JSON à votre URL. Cela indique au système que vous attendez une réponse JSON. Le système va rendu jsondocument et enverra des en-têtes de navigateur corrects comme réponse. xxx xxx

Il n'est pas nécessaire de fermer l'application avec $ App-> Fermer (); parce que l'architecture de Joomla gère cela pour vous.

Si vous fermez l'application, vous manquerez beaucoup de choses pendant le processus de rendu. Beaucoup d'événements ne seront pas déclenchés. En outre, vous devrez envoyer manuellement des en-têtes pour le type de contenu.

Votre code devrait ressembler à celui-ci. Cette approche est pas recommandée . xxx


0 commentaires