Як я можу повернути фактичний JSON за допомогою Drupal?


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
Патрік У. Макмахон

Відповіді:


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 () замість виходу ().
geerlingguy

2
@geerlingguy Хороший улов; цього не помічав. Для тих, хто не знає різниці, виклик drupal_exit () буде викликати прив'язку_exit (), відмовити сеанс тощо
mpdonadio

3

Я побачив, що відповіді на 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);
  ?>

Більше про це можна прочитати тут


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.