web-dev-qa-db-ja.com

Drupalを使用して実際のJSONを返すにはどうすればよいですか?

単純なAJAX関数をローカルに実装して、ユーザータイプとして既存のノードのノードタイトルをオートコンプリートできるようにしたいと思います。そのためには、ノードのタイトルで検索できます。問題は、未加工の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を返すことができますか?

13
rybosome

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

また、結果を返そうとするだけでなく、クエリを解析してサニタイズやエラーチェックなどを行う方がおそらく安全です。

17
mpdonadio

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

あなたはそれについてもっと読むことができます ここ

3
thegrandhi

Drupal 8の実際の例を以下に示します。

https://github.com/npinos/drupal8-greenhouse

コントローラとルーティングが含まれています

このコードは、エンドポイントとして公開されたノード数をjson形式で返します

1
Nicolas Pinos