Wie kann ich mit Drupal JSON zurückgeben?

13

Ich möchte eine einfache AJAX-Funktion lokal implementieren, mit der ich Knotentitel bereits vorhandener Knoten automatisch vervollständigen kann, wenn der Benutzer sie eingibt. Zu diesem Zweck benötige ich die Fähigkeit, eine API zu haben, mit der ich nach Knotentiteln suchen kann. Das Problem ist, dass bei der Ausgabe von RAW-JSON diese von Tags umgeben ist. Also, egal was ich tue, ich bekomme immer ...

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

Ich habe versucht, eine benutzerdefinierte Seitenvorlage zu implementieren, die nur den Inhalt ausgibt und die gleichen Ergebnisse liefert. Hier ist, wie ich das gerade mache, in meiner Moduldatei ...

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

Wie kann ich JUST raw JSON zurückgeben?

Rybosom
quelle
Sie wollen die drupal_json_outputFunktion. Beispiele finden Sie hier oder dort .
Keithm
Kann jemand ein Beispiel für Drupal 7 zeigen
Patrick W. McMahon

Antworten:

17

Für Drupal 6 können Sie drupal_json verwenden

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

Ändern Sie es für Drupal 7, um drupal_json_output zu verwenden

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

Es wäre wahrscheinlich auch sicherer, die Abfrage zu bereinigen, Fehler zu überprüfen usw., anstatt nur zu versuchen, das Ergebnis zurückzugeben.

mpdonadio
quelle
2
Nur eine kurze Anmerkung: Es ist im Allgemeinen vorzuziehen, drupal_exit () anstelle von exit () nach dem Drucken von JSON zu verwenden.
Geerlingguy
2
@geerlingguy Guter Fang; habe das nicht bemerkt. Für diejenigen, die den Unterschied nicht kennen, ruft der Aufruf von drupal_exit () hook_exit () auf, reißt die Sitzung ab usw.
mpdonadio
3

Ich habe gesehen, dass für Drupal 8 keine Antwort bereitgestellt wurde.

Verwenden Sie den folgenden Code, um JSON in Drupal 8 zu verarbeiten:

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

Sie können mehr darüber lesen Sie hier

thegrandhi
quelle