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 raw JSONを返すにはどうすればよいですか?


drupal_json_output機能が必要です。参照してくださいここまたはそこに働く例について。
keithm

いくつかのいずれかは、Drupalの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.