Jak mogę zwrócić rzeczywisty JSON za pomocą Drupala?

13

Chciałbym zaimplementować lokalnie prostą funkcję AJAX, która pozwala mi na autouzupełnianie tytułów węzłów już istniejących węzłów jako typów użytkowników. W tym celu potrzebuję możliwości posiadania interfejsu API, który można wyszukiwać w tytułach węzłów. Problem polega na tym, że kiedy wypisuję surowy JSON, jest on otoczony tagami. Więc bez względu na to, co robię, ciągle otrzymuję ...

<html>
    <head>
    </head>
    <body>
        <pre style="word-wrap: break-word; white-space: pre-wrap;"> {json here}</pre>
    </body>
</html>

Próbowałem zaimplementować niestandardowy szablon strony, który wyświetla tylko treść, która dawała takie same wyniki. Oto jak obecnie to robię w moim pliku modułu ...

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

Jak mogę zwrócić JUST JSON raw?

rybosome
źródło
Chcesz tę drupal_json_outputfunkcję. Zobacz tutaj lub tam, aby zobaczyć przykłady działania.
keithm
Czy ktoś może podać przykład dla Drupala 7
Patrick W. McMahon

Odpowiedzi:

17

W przypadku Drupal 6 możesz użyć 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;
}

W przypadku Drupal 7 zmień go na 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();
}

Prawdopodobnie bezpieczniej byłoby również przeanalizować zapytanie w celu dezynfekcji, kontroli błędów itp. Zamiast po prostu zwracać wynik.

mpdonadio
źródło
2
Krótka uwaga: po wydrukowaniu JSON zwykle lepiej jest używać drupal_exit () zamiast exit ().
geerlingguy
2
@geerlingguy Dobry połów; nie zauważyłem tego. Dla tych, którzy nie znają różnicy, wywołanie drupal_exit () wywoła hook_exit (), porzuci sesję itp.
mpdonadio
3

Widziałem, że nie ma odpowiedzi na Drupal 8.

Aby przetworzyć JSON w Drupal 8, użyj następującego kodu:

  <?php
     use Symfony\Component\HttpFoundation\JsonResponse;
     // ...
     $options = _menu_get_options(menu_get_menus(), $available_menus, array('mlid' => 0));
     return new JsonResponse($options);
  ?>

Możesz przeczytać więcej na ten temat tutaj

thegrandhi
źródło