2011-11-03 37 views
7

我想在本地實現一個簡單的AJAX函數,它允許我在用戶鍵入時自動完成已有節點的節點標題。爲此,我需要有能夠在節點標題上搜索的API。問題是,當我輸出原始JSON時,它被標籤包圍。所以,無論我做什麼,我不斷收到...如何使用Drupal返回實際的JSON?

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

我試圖實現自定義的頁面模板,只有已經輸出的內容,所產生相同的結果。這是我目前如何做到這一點,在我的模塊文件...

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

如何返回JUST原始JSON?

回答

9

'Drupal'的方式是使用drupal_json_output()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

我剛纔把你的代碼,就是進入一個模塊,所有請求http://site.com/api時,我得到的是預期的JSON,沒有任何標記。這個問題與Drupal無關,更可能與服務器/瀏覽器配置有關。

此鏈接可以幫助:

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

+0

這種方式「更正確」,但事實證明,這確實輸出了原始JS。謝謝你。 – rybosome

+0

你打敗了我,我剛剛更新了我的答案:) – Clive

0

取出出口(0);它應該工作。如果你的頁面回調沒有返回任何東西,那麼正常的主題處理程序不會被調用,所以你會得到原始輸出。也就是說,由於Drupal的性能相當差,對於體面的響應時間,您最好製作一個與drupal數據庫交流的小型獨立腳本,因此您不需要花費相當沉重的啓動成本Drupal的請求,當你不需要的功能。

+1

降低技術上正確的答案?真? –

+1

在解決問題的同時敲擊CMS可能會讓你知道,即使它是真的。 ;) 中間道路的方式可能是僅通過調用drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE)將drupal引導到數據庫級別,並避免所有繁重的模塊開銷。 –

2

這實際上並輸出原始JSON - Chrome的添加HTML包裝。在命令行cURL中查看輸出顯示這確實輸出了原始JSON。

+0

Chrome似乎對可顯示爲網頁的內容有非常嚴格的意義;所以它會將HTML和PRE標籤添加到您的JSON輸出中,令人困惑。查看源代碼,你會看到那裏沒有標籤。好評。 – razzed

相關問題