如何使用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);
}

我如何返回原始JSON?


您需要该drupal_json_output功能。请参阅此处那里的工作示例。
keithm

有人可以举一个Drupal 7的例子吗
Patrick W. McMahon

Answers:


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之后,通常最好使用drupal_exit()而不是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);
  ?>

您可以在此处了解更多信息


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.