Come posso restituire JSON effettivo utilizzando Drupal?


13

Vorrei implementare localmente una semplice funzione AJAX che mi consente di completare automaticamente i titoli dei nodi già esistenti mentre l'utente digita. A tal fine, ho bisogno della possibilità di avere un'API su cui posso cercare i titoli dei nodi. Il problema è che quando output JSON non elaborato, viene circondato da tag. Quindi, qualunque cosa faccia, continuo a ricevere ...

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

Ho provato a implementare un modello di pagina personalizzato che produce già solo contenuti, che ha prodotto gli stessi risultati. Ecco come lo sto attualmente facendo, nel mio file del modulo ...

<?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);
}

Come posso restituire JUST JSON non elaborato?


Vuoi la drupal_json_outputfunzione. Vedi qui o per esempi funzionanti.
keithm,

Qualcuno può mostrare un esempio per Drupal 7
Patrick W. McMahon il

Risposte:


17

Per Drupal 6, puoi usare 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;
}

Per Drupal 7, modificalo per utilizzare 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();
}

Probabilmente sarebbe anche più sicuro analizzare la query per la sanificazione, il controllo degli errori, ecc., Invece di provare a restituire il risultato.


2
Solo una breve nota: è generalmente preferibile usare drupal_exit () invece di exit () dopo aver stampato JSON.
geerlingguy,

2
@geerlingguy Buona cattura; non l'ho notato. Per coloro che non conoscono la differenza, chiamare drupal_exit () invocherà hook_exit (), smantellerà la sessione, ecc.
mpdonadio

3

Ho visto che non vi era alcuna risposta per Drupal 8.

Per elaborare JSON in Drupal 8, utilizzare il seguente codice:

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

Puoi leggere di più qui


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.