ฉันจะคืนค่า JSON จริงโดยใช้ Drupal ได้อย่างไร


13

ฉันต้องการใช้ฟังก์ชั่น AJAX แบบง่าย ๆ ในตัวเครื่องซึ่งอนุญาตให้ฉันเติมชื่อโหนดโดยอัตโนมัติของโหนดที่มีอยู่แล้วเป็นประเภทผู้ใช้ ด้วยเหตุนี้ฉันต้องการความสามารถในการมี API ที่ฉันสามารถค้นหาในชื่อโหนด ปัญหาคือเมื่อฉันออก 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);
}

ฉันจะส่งคืน JSON ดิบได้อย่างไร


คุณต้องการdrupal_json_outputฟังก์ชั่น ดูตัวอย่างการทำงานที่นี่หรือที่นั่น
keithm

บางคนสามารถแสดงตัวอย่างสำหรับ Drupal 7
Patrick W. McMahon

คำตอบ:


17

สำหรับ Drupal 6 คุณสามารถใช้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;
}

สำหรับ Drupal 7 ให้เปลี่ยนเป็นใช้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();
}

นอกจากนี้ยังอาจปลอดภัยกว่าในการแยกวิเคราะห์แบบสอบถามเพื่อฆ่าเชื้อตรวจสอบข้อผิดพลาด ฯลฯ แทนที่จะพยายามส่งคืนผลลัพธ์


2
เพียงบันทึกย่อ: โดยทั่วไปจะใช้ drupal_exit () แทน exit () หลังจากพิมพ์ JSON
geerlingguy

2
@geerlingguy จับได้ดี; ไม่ได้สังเกตว่า สำหรับผู้ที่ไม่ทราบความแตกต่างการเรียกใช้ drupal_exit () จะเรียกใช้ hook_exit () ฉีกเซสชั่น ฯลฯ
mpdonadio

3

ฉันเห็นว่าไม่มีคำตอบสำหรับ Drupal 8

ในการประมวลผล JSON ใน Drupal 8 ให้ใช้รหัสต่อไปนี้:

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

คุณสามารถอ่านเพิ่มเติมได้ที่นี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.