単純な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を返すことができますか?
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();
}
また、結果を返そうとするだけでなく、クエリを解析してサニタイズやエラーチェックなどを行う方がおそらく安全です。
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);
?>
あなたはそれについてもっと読むことができます ここ
Drupal 8の実際の例を以下に示します。
https://github.com/npinos/drupal8-greenhouse
コントローラとルーティングが含まれています
このコードは、エンドポイントとして公開されたノード数をjson形式で返します