Comment puis-je retourner du JSON réel en utilisant Drupal?

13

J'aimerais implémenter une simple fonction AJAX localement qui me permet de compléter automatiquement les titres de nœuds de nœuds déjà existants en tant que types d'utilisateurs. À cette fin, j'ai besoin de pouvoir disposer d'une API que je peux rechercher sur les titres des nœuds. Le problème est que lorsque je génère du JSON brut, il est entouré de balises. Donc, peu importe ce que je fais, je continue de recevoir ...

<html>
    <head>
    </head>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;"> {json here}</pre>
    </body>
</html>

J'ai essayé d'implémenter un modèle de page personnalisé qui ne produit déjà que du contenu, qui a produit les mêmes résultats. Voici comment je fais actuellement cela, dans mon fichier de module ...

<?php

/**
 * Implementation of hook_menu()
 */
function content_relation_menu() {
    $items = array();
    $items['api'] = array(
        'title' => 'Search',
        'page callback' => 'content_relation_get',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );

    return $items;
}

function content_relation_get($term = '') {
    drupal_add_http_header('Content-Type', 'application/javascript; utf-8');
    $var = json_encode(
        db_query("SELECT nid,title FROM {node} WHERE title LIKE :title LIMIT 5", array(":title" => $term.'%'))->fetchAll()
    );
    echo $var;
    exit(0);
}

Comment puis-je retourner JUST raw JSON?

rybosome
la source
Vous voulez la drupal_json_outputfonction. Voir ici ou pour des exemples de travail.
Keithm
Quelqu'un peut-il montrer un exemple pour Drupal 7
Patrick W. McMahon

Réponses:

17

Pour Drupal 6, vous pouvez utiliser drupal_json

function content_relation_get($term = '') {
    $result = db_query("SELECT nid,title FROM {node} WHERE title LIKE :title LIMIT 5", array(":title" => $term.'%'))->fetchAll()
    );
    drupal_json($result);
    exit;
}

Pour Drupal 7, modifiez-le pour utiliser drupal_json_output

function content_relation_get($term = '') {
    $result = db_query("SELECT nid,title FROM {node} WHERE title LIKE :title LIMIT 5", array(":title" => $term.'%'))->fetchAll()
    );
    drupal_json_output($result);
    drupal_exit();
}

Il serait également plus sûr d'analyser la requête à nettoyer, la vérification des erreurs, etc., au lieu d'essayer simplement de renvoyer le résultat.

mpdonadio
la source
2
Juste une petite remarque: il est généralement préférable d'utiliser drupal_exit () au lieu de exit () après avoir imprimé JSON.
geerlingguy
2
@geerlingguy Bonne prise; n'a pas remarqué cela. Pour ceux qui ne connaissent pas la différence, appeler drupal_exit () invoquera hook_exit (), démontera la session, etc.
mpdonadio
3

J'ai vu qu'il n'y avait pas de réponse fournie pour Drupal 8.

Afin de traiter JSON dans Drupal 8, utilisez le code suivant:

  <?php
     use Symfony\Component\HttpFoundation\JsonResponse;
     // ...
     $options = _menu_get_options(menu_get_menus(), $available_menus, array('mlid' => 0));
     return new JsonResponse($options);
  ?>

Vous pouvez en savoir plus ici

thegrandhi
la source