2011-11-03 15 views
7

Me gustaría implementar localmente una función AJAX simple que me permite autocompletar títulos de nodo de nodos ya existentes a medida que el usuario escribe. Para ello, necesito la capacidad de tener una API que pueda buscar en los títulos de los nodos. El problema es que cuando envío JSON sin formato, viene rodeado de etiquetas. Por lo tanto, no importa lo que hago, me siguen dando ...¿Cómo puedo devolver JSON real utilizando Drupal?

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

He intentado implementar una plantilla de página personalizada que sólo produce la salida de contenido ya, que produjo los mismos resultados. Así es como yo estoy haciendo actualmente esto, en mi archivo de módulo ...

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

¿Cómo puedo volver JSON SOLO prima?

Respuesta

9

La forma 'Drupal' es usar drupal_json_output() y 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(); 

ACTUALIZACIÓN

acabo de poner su código, tal cual, en un módulo y lo único que consigue al solicitar http://site.com/api es el esperado JSON, no hay etiquetas. El problema no tendrá nada que ver con Drupal, es más probable que lo haga con la configuración del servidor/navegador.

Este enlace puede ayudar:

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

+0

De esta manera es "más correcto", pero resulta que esto realmente dio salida a JS sin formato. Gracias de cualquier forma. – rybosome

+0

Me pegaste, simplemente actualicé mi respuesta a ese efecto :) – Clive

0

Tome la salida (0); y debería funcionar Si la devolución de llamada de su página no devuelve nada, no se llamará a los manejadores de tema normales para obtener la salida sin formato.

Dicho esto, debido al rendimiento bastante pobre de Drupal, para tiempos de respuesta decentes es mejor hacer una pequeña secuencia de comandos independiente que habla con la base de datos de drupal, para que no pague los costos de inicio bastante pesados ​​de una drupal solicita cuando no necesitas esa funcionalidad.

+1

¿Votos descendentes para una respuesta técnicamente correcta? De Verdad? –

+1

Golpear un CMS mientras resuelve el problema puede conseguirte incluso si es cierto. ;) La ruta intermedia podría ser arrancar drupal al nivel de la base de datos solo con una llamada a drupal_bootstrap (DRUPAL_BOOTSTRAP_DATABASE) y evitar toda la sobrecarga del módulo pesado. –

2

Esta realidad no JSON prima de salida - Chrome fue la adición de la envoltura html. Viendo el resultado en la línea de comando cURL mostró que esto sí producía JSON sin formato.

+0

Chrome parece tener un sentido muy estricto de lo que se puede mostrar como página web; por lo que agrega etiquetas HTML y PRE a su salida JSON, lo cual es confuso. Ver fuente y verá que no hay etiquetas allí. Buen comentario. – razzed

Cuestiones relacionadas