2011-11-03 14 views
7

Mi piacerebbe implementare una semplice funzione AJAX localmente che mi permetta di completare automaticamente i titoli dei nodi dei nodi già esistenti mentre l'utente digita. A tal fine, ho bisogno della possibilità di avere un'API che posso cercare sui titoli dei nodi. Il problema è che quando esco in JSON non elaborato, viene circondato da tag. Quindi, non importa quello che faccio, continuo a ricevere ...Come posso restituire il JSON reale usando Drupal?

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

Ho provato l'attuazione di un modello di pagina personalizzata che emette solo contenuti già, che ha prodotto gli stessi risultati. Ecco come sto facendo questo, nel mio file di 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 JUST grezzo?

risposta

9

Il modo "Drupal" utilizza drupal_json_output() e drupal_exit().

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

drupal_json_output($data); 

drupal_exit(); 

UPDATE

ho appena messo il codice, come è, in un modulo e tutto quello che ottiene al momento della richiesta http://site.com/api è l'atteso JSON, non ci sono tag. Il problema non avrà nulla a che fare con Drupal, più probabilmente con la configurazione server/browser.

Questo collegamento può aiutare:

What do browsers want for the Content-Type header on json ajax responses?

+0

Questo modo è "più corretto", ma si scopre che in realtà questo ha prodotto JS non elaborato. Grazie comunque. – rybosome

+0

Mi hai battuto, ho appena aggiornato la mia risposta in tal senso :) – Clive

0

Estrarre l'uscita (0); e dovrebbe funzionare. Se la tua callback di pagina non restituisce nulla, i normali gestori di temi non vengono chiamati in modo da ottenere un output non elaborato.

Detto questo, a causa delle prestazioni piuttosto scadenti di Drupal, per tempi di risposta decenti è meglio fare un piccolo script standalone che dialoga con il DB drupal, quindi non si pagano i costi di avvio piuttosto pesanti di un richiesta drupal quando non hai bisogno di quella funzionalità.

+1

Downvotes per una risposta tecnicamente corretta? Veramente? –

+1

Bussare a un CMS mentre si risolve il problema potrebbe portarlo anche se è vero. ;) La via di mezzo potrebbe essere il bootstrap drupal al livello del database solo con una chiamata a drupal_bootstrap (DRUPAL_BOOTSTRAP_DATABASE) ed evitare tutto il pesante overhead del modulo. –

2

Questa realtà ha fatto di uscita JSON prime - Chrome è stato aggiunta l'involucro html. La visualizzazione dell'output nella riga di comando cURL ha mostrato che questo ha prodotto un JSON grezzo.

+0

Chrome sembra avere un senso molto stretto di ciò che può essere visualizzato come una pagina web; quindi aggiunge tag HTML e PRE al tuo output JSON che è fonte di confusione. Visualizza la fonte e vedrai che non ci sono tag lì. Buon commento – razzed

Problemi correlati