Bagaimana saya bisa mengembalikan JSON yang sebenarnya menggunakan Drupal?

13

Saya ingin menerapkan fungsi AJAX sederhana secara lokal yang memungkinkan saya untuk autocomplete judul node yang sudah ada sebagai tipe pengguna. Untuk itu, saya perlu kemampuan untuk memiliki API yang dapat saya cari pada judul node. Masalahnya adalah bahwa ketika saya output JSON mentah, itu datang dikelilingi oleh tag. Jadi, apa pun yang saya lakukan, saya tetap mendapatkan ...

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

Saya sudah mencoba menerapkan templat halaman khusus yang hanya menghasilkan konten, yang menghasilkan hasil yang sama. Inilah cara saya saat ini melakukan ini, dalam file modul saya ...

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

Bagaimana saya bisa mengembalikan JSON mentah saja?

rybosome
sumber
Anda menginginkan drupal_json_outputfungsinya. Lihat di sini atau di sana untuk contoh kerja.
keithm
Dapatkah seseorang menunjukkan contoh untuk Drupal 7
Patrick W. McMahon

Jawaban:

17

Untuk Drupal 6, Anda dapat menggunakan 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;
}

Untuk Drupal 7, ubah untuk menggunakan drupal_json_output

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

Mungkin juga akan lebih aman untuk mem-parsing query untuk membersihkan, memeriksa kesalahan, dll, daripada hanya mencoba mengembalikan hasilnya.

mpdonadio
sumber
2
Hanya catatan singkat: umumnya lebih baik menggunakan drupal_exit () daripada keluar () setelah mencetak JSON.
geerlingguy
2
@geerlingguy Tangkapan bagus; tidak memperhatikan itu. Bagi mereka yang tidak tahu bedanya, memanggil drupal_exit () akan memanggil hook_exit (), meruntuhkan sesi, dll.
mpdonadio
3

Saya melihat bahwa tidak ada jawaban yang diberikan untuk Drupal 8.

Untuk memproses JSON di Drupal 8, gunakan kode berikut:

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

Anda dapat membaca lebih lanjut di sini

thegrandhi
sumber