Drupal을 사용하여 실제 JSON을 어떻게 반환합니까?


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

JUST 원시 JSON을 어떻게 반환 할 수 있습니까?


당신은 drupal_json_output기능을 원한다 . 실제 예제는 여기 또는 거기 를 참조 하십시오 .
keithm

어떤 사람은 드루팔 7에 대한 예를 보여줄 수
패트릭 W. 맥마흔

답변:


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
간단한 참고 사항 : 일반적으로 JSON을 인쇄 한 후 exit () 대신 drupal_exit ()를 사용하는 것이 좋습니다.
geerlingguy

2
@geerlingguy 좋은 캐치; 눈치 채지 못했습니다. 차이점을 모르는 사람들을 위해 drupal_exit ()를 호출하면 hook_exit ()를 호출하고 세션을 해제합니다.
mpdonadio

3

Drupal 8에 대한 답변이 없다는 것을 알았습니다.

Drupal 8에서 JSON을 처리하려면 다음 코드를 사용하십시오.

  <?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.