2011-11-03 13 views
7

Tôi muốn thực hiện một hàm AJAX đơn giản cục bộ cho phép tôi tự động hoàn thành các tiêu đề nút của các nút đã tồn tại như kiểu người dùng. Để kết thúc, tôi cần khả năng có một API mà tôi có thể tìm kiếm trên các tiêu đề của nút. Vấn đề là khi tôi xuất JSON thô, nó được bao quanh bởi các thẻ. Vì vậy, không có vấn đề gì tôi làm, tôi tiếp tục nhận được ...Làm cách nào để trả lại JSON thực tế bằng Drupal?

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

tôi đã cố gắng thực hiện một mẫu trang tùy chỉnh mà chỉ kết quả đầu ra nội dung đã có, mà tạo ra kết quả tương tự. Đây là cách tôi hiện đang thực hiện việc này, trong tệp mô-đun của mình ...

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

Làm cách nào để trả về JSON thô?

Trả lời

9

Cách 'Drupal' đang sử dụng 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(); 

CẬP NHẬT

Tôi vừa mới đưa mã của bạn, như là, vào một module và tất cả tôi nhận được khi yêu cầu http://site.com/api là dự kiến ​​JSON, không có thẻ. Vấn đề sẽ không liên quan gì đến Drupal, nhiều khả năng sẽ làm với cấu hình máy chủ/trình duyệt.

Liên kết này có thể giúp:

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

+0

Bằng cách này là "chính xác hơn", nhưng nó chỉ ra điều này thực sự đã sản xuất JS thô. Cảm ơn bạn mặc dù. – rybosome

+0

Bạn đã đánh bại tôi, tôi chỉ cập nhật câu trả lời của mình cho hiệu ứng đó :) – Clive

0

Đưa ra lối ra (0); và nó sẽ hoạt động. Nếu gọi lại trang của bạn không trả lại bất cứ điều gì sau đó xử lý chủ đề bình thường không nhận được gọi là để bạn có được sản lượng thô. Điều đó nói rằng, do hiệu suất khá kém của Drupal, cho thời gian phản ứng khá tốt, bạn nên thực hiện một kịch bản độc lập nhỏ để nói chuyện với DB drupal, vì vậy bạn không phải trả chi phí khởi động khá nặng nề của một yêu cầu drupal khi bạn không cần chức năng đó.

+1

Lợi ích cho câu trả lời đúng về mặt kỹ thuật? Có thật không? –

+1

Gõ một CMS trong khi giải quyết vấn đề có thể giúp bạn có được rằng ngay cả khi nó là sự thật. ;) Cách đường trung bình có thể là để khởi động drupal đến cấp cơ sở dữ liệu chỉ với một cuộc gọi đến drupal_bootstrap (DRUPAL_BOOTSTRAP_DATABASE) và tránh tất cả các chi phí mô-đun nặng. –

2

Điều này thực sự DID JSON liệu đầu ra - Chrome được bổ sung thêm các gói html. Xem đầu ra trong dòng lệnh cURL cho thấy rằng điều này đã xuất ra JSON thô.

+0

Chrome có vẻ rất nghiêm ngặt về những gì có thể được hiển thị dưới dạng trang web; do đó, nó thêm các thẻ HTML và PRE vào đầu ra JSON của bạn, điều này gây nhầm lẫn. Xem nguồn và bạn sẽ thấy không có thẻ ở đó. Nhận xét tốt. – razzed

Các vấn đề liên quan