2011-11-03 16 views
7

Chciałbym zaimplementować lokalnie prostą funkcję AJAX, która pozwala mi autouzupełnianie tytułów węzłów już istniejących jako typy użytkownika. W tym celu potrzebuję możliwości posiadania API, które mogę przeszukiwać na tytułach węzłów. Problem polega na tym, że kiedy wyprowadzam surowy JSON, jest on otoczony tagami. Tak więc, bez względu na to, co robię, wciąż otrzymuję ...Jak mogę zwrócić rzeczywisty JSON używając Drupala?

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

Próbowałem wykonawczych niestandardowy szablon strony, że tylko wyprowadza już treści, które produkowały takie same wyniki. Oto, jak obecnie to robię, w moim pliku modułu ...

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

Jak mogę zwrócić JUST surowy JSON?

Odpowiedz

9

Sposób "Drupal" używa drupal_json_output() i 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

Właśnie umieścić swój kod, jak to jest, do modułu i wszystko, co się przy żądaniu http://site.com/api jest oczekiwany JSON, nie ma żadnych tagów. Problem nie będzie miał nic wspólnego z Drupalem, co jest bardziej prawdopodobne w przypadku konfiguracji serwera/przeglądarki.

Ten link może pomóc:

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

+0

Ten sposób jest "bardziej poprawny", ale okazało się, że faktycznie wyprowadzono surowy JS. Ale dziękuję. – rybosome

+0

Uderzyłeś mnie, właśnie zaktualizowałem swoją odpowiedź na to pytanie :) – Clive

0

Wyjmij wyjście (0); i powinno działać. Jeśli twoje wywołanie zwrotne nie zwraca nic, to normalne procedury obsługi nie są wywoływane, więc otrzymujesz nieprzetworzone dane wyjściowe.

To powiedziawszy, ze względu na raczej niską wydajność Drupala, dla przyzwoitego czasu reakcji lepiej jest zrobić mały samodzielny skrypt, który mówi do drupal DB, więc nie płacisz raczej ciężkich kosztów uruchomienia żądanie drupalne, gdy nie potrzebujesz tej funkcji.

+1

Downvotes za technicznie poprawną odpowiedź? Naprawdę? –

+1

Pukanie CMSa podczas rozwiązywania problemu może spowodować, że nawet jeśli jest to prawda. ;) Droga środkowa może polegać na załadowaniu drupala do poziomu bazy danych tylko za pomocą wywołania drupal_bootstrap (DRUPAL_BOOTSTRAP_DATABASE) i uniknięcia nadmiernego obciążenia modułu. –

2

To faktycznie wyjściowego surowego JSON - Chrome została dodanie zawijania HTML. Przeglądanie danych wyjściowych w wierszu poleceń cURL pokazało, że to wyprowadza surowy JSON.

+0

Wygląda na to, że Chrome ma bardzo ścisłe znaczenie tego, co może być wyświetlane jako strona internetowa; więc dodaje znaczniki HTML i PRE do twojego wyjścia JSON, co jest mylące. Wyświetl źródło, a zobaczysz, że tam nie ma tagów. Dobry komentarz. – razzed

Powiązane problemy