Как я могу вернуть фактический 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?

rybosome
источник
Вы хотите 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();
}

Также было бы, вероятно, безопаснее разобрать запрос на очистку, проверку ошибок и т. Д., А не просто пытаться вернуть результат.

mpdonadio
источник
2
Просто небольшое замечание: обычно предпочтительнее использовать drupal_exit () вместо exit () после печати JSON.
geerlingguy
2
@geerlingguy Хороший улов; не заметил этого Для тех, кто не знает разницы, вызов drupal_exit () вызовет hook_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);
  ?>

Вы можете прочитать больше об этом здесь

thegrandhi
источник
1

Вот пример из реальной жизни для Drupal 8

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

Включает контроллер и маршрутизацию

Этот код возвращает количество узлов в формате json, отображаемое как конечная точка

Николас Пинос
источник