Làm cách nào tôi có thể trả về JSON thực tế bằng Drupal?


13

Tôi muốn triển khai 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 dưới dạng các kiểu người dùng. Để đạt được điều đó, 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 đề nút. Vấn đề là khi tôi xuất JSON thô, nó được bao quanh bởi các thẻ. Vì vậy, bất kể tôi làm gì, tôi vẫn tiếp tục ...

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

Tôi đã thử triển khai một mẫu trang tùy chỉnh chỉ xuất nội dung, điều đó tạo ra kết quả tương tự. Đây là cách tôi hiện đang làm điều này, trong tệp mô-đun của tôi ...

<?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 tôi có thể trả về JUST JSON thô?


Bạn muốn drupal_json_outputchức năng. Xem ở đây hoặc ở đó cho các ví dụ làm việc.
keithm

Ai đó có thể đưa ra một ví dụ cho Drupal 7
Patrick W. McMahon

Câu trả lời:


17

Đối với Drupal 6, bạn có thể sử dụng drupal_json

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

Đối với Drupal 7, hãy đổi nó thành sử dụng drupal_jsonDefput

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

Có lẽ sẽ an toàn hơn khi phân tích truy vấn để vệ sinh, kiểm tra lỗi, v.v., thay vì chỉ cố gắng trả về kết quả.


2
Chỉ cần một lưu ý nhanh: thường sử dụng drupal_exit () thay vì exit () sau khi in JSON.
ge Muffguy

2
@ge Muffguy Bắt tốt; đã không nhận thấy điều đó. Đối với những người không biết sự khác biệt, việc gọi drupal_exit () sẽ gọi hook_exit (), phá vỡ phiên, v.v.
mpdonadio

3

Tôi thấy rằng không có câu trả lời nào được cung cấp cho Drupal 8.

Để xử lý JSON trong Drupal 8, hãy sử dụng mã sau:

  <?php
     use Symfony\Component\HttpFoundation\JsonResponse;
     // ...
     $options = _menu_get_options(menu_get_menus(), $available_menus, array('mlid' => 0));
     return new JsonResponse($options);
  ?>

Bạn có thể đọc thêm về nó ở đây


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.