Como posso retornar o JSON real usando o Drupal?

13

Gostaria de implementar localmente uma função AJAX simples que me permita preencher automaticamente títulos de nós já existentes conforme o usuário digita. Para isso, preciso ter uma API que possa pesquisar nos títulos dos nós. O problema é que quando eu produzo JSON bruto, ele é cercado por tags. Então, não importa o que eu faça, eu continuo recebendo ...

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

Eu tentei implementar um modelo de página personalizado que só gera conteúdo já, que produziu os mesmos resultados. Aqui está como atualmente estou fazendo isso, no meu arquivo de módulo ...

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

Como posso retornar apenas o JSON bruto?

rybosome
fonte
Você quer a drupal_json_outputfunção. Veja aqui ou ali para exemplos de trabalho.
Keithm
Alguém pode mostrar um exemplo para o Drupal 7
Patrick W. McMahon

Respostas:

17

Para o Drupal 6, você pode usar 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;
}

No Drupal 7, altere-o para usar 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();
}

Provavelmente também seria mais seguro analisar a consulta para higienizar, verificar erros, etc., em vez de apenas tentar retornar o resultado.

mpdonadio
fonte
2
Apenas uma observação rápida: geralmente é preferível usar drupal_exit () em vez de exit () após a impressão do JSON.
Georlingguy
2
@geerlingguy Boa captura; não percebeu isso. Para aqueles que não sabem a diferença, chamando drupal_exit () irá chamar hook_exit (), desmontagem da sessão, etc.
mpdonadio
3

Vi que não havia resposta para o Drupal 8.

Para processar JSON no Drupal 8, use o seguinte código:

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

Você pode ler mais sobre isso aqui

thegrandhi
fonte