2

Drupal 7 で非同期データをロードする最良の方法は何ですか?

現在、自分のノードを使用して jQuery でデータをロードしています。aviable な独自の menu_hook を作成しました。/eventsたとえば/events/2012-04-17、このページは通常のブラウジングでも aviable です。が設定されているかどうかを確認$_SERVER['HTTP_X_REQUESTED_WITH']し、JSON 文字列でデータを返し、データを解析します。

キャッシング技術を有効にすると、問題が発生する可能性はありますか? または、データをロードするためのより良い方法はありますか? die()他に何ができるかでスクリプトを強制終了しているため、これはブーストでは機能しないようです。

function my_module_menu() {
    $items['events'] = array(
        'page callback' => 'event_page',
        'access callback' => TRUE,
        'type' => MENU_LOCAL_TASK,
    );
    $items['events/%date'] = array(
        'page callback' => 'event_page',
        'page arguments' => array(2),
        'access callback' => TRUE,
        'type' => MENU_VISIBLE_IN_BREADCRUMB,
    );
    return $items;
}

function event_page($date=null) {
    $build=array();
    // add some other "controls"
    $build['submit'] = array(
        '#type' => 'submit',
        '#value' => t('Save'),
    );

    if((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 'XMLHttpRequest' == $_SERVER['HTTP_X_REQUESTED_WITH']) || strpos($_SERVER['REQUEST_URI'], '?json')!==FALSE) {
        header('Cache-Control: no-cache, must-revalidate');
        header('Content-type: application/json', true);
        $json=loadData();
        die(json_encode($json));
    }

    return $build;
}
4

1 に答える 1

0

代わりにdrupal_json_outputを使用できます。これによりヘッダーが自動的に変更されるため、exit() は必要ありません。

別のオプションは、 hook_page_delivery_callbackを使用して $_SERVER からのデータと組み合わせた特定のパスの配信コールバックを変更し、ajax_commandを使用してページの有効な配列を返すことです。

最初のオプションははるかに簡単です.2番目のオプションを自分で試したことはありませんが、あなたの状況には多すぎるかもしれません. 残念ながら、これらの手法のいずれかがブーストと一緒にどのように動作するかはわかりませんが、いずれかが機能することを願っています.

于 2012-04-23T17:24:10.117 に答える