0

現在、カスタム モジュールで ajax リクエストを使用してビューを読み込んでいます。

$.getJSON('/reports/summarized-progress/get_output_activities/'+nid, null,activities);

上記のリクエストの drupal ページは、次を返します。

$output_arg=arg(3);
$html="";
$activities=views_embed_view('activities','block_activities',$output_arg); //this returns a view accordion view
if(!empty($activities)) {
$html.='';
$html.=$activities;
$html.='';
}
drupal_json_output(array('data'=>$html));

アコーディオン/折りたたみ機能が、ロードされたコンテンツで機能していません。カスタムモジュールにファイルをmodule_load_includeを介して含める必要があるかどうかについてのアイデアはありますか? これが機能するために何をする必要がありますか?

4

1 に答える 1

1

ajax リクエストを介してコンテンツをロードするときはいつでも、必要な js 設定/ファイルがコンテンツとともにロードされることを確認する必要があります。

ほとんどの場合、コンテンツのロード中に drupal_add_js() によって埋められる $javascript 静的変数はブラウザーに送信されませんが、これは手動で行うことができます。

  • Drupal 6 の実際の例を次に示します。
  // ビューのコンテンツを取得します。
  $view = views_embed_view($name, $display_id);

  // JavaScript データを取得します。
  $js = drupal_add_js(NULL, NULL, 'ヘッダー');

  // クライアント側で処理するデータを準備します。
  $settings = drupal_to_js(call_user_func_array('array_merge_recursive', $js['setting']));

  // 収集した $settings で Drupal.settings を拡張するようにクライアントに指示します。
  $script = '<script type="text/javascript">
               jQuery.extend(true, Drupal.settings, ' . $settings . ');
             </script>';

  drupal_set_header('Content-Type:text/html; charset=utf-8');
  $script を印刷します。$view;
  出口;
  • Drupal 7 でも同じ:
  $view = views_embed_view($name, $display_id);

  $js = drupal_add_js(NULL, array('type' => 'setting'));
  $settings = drupal_json_encode(call_user_func_array('array_merge_recursive', $js['settings']['data']));

  $script = '<script type="text/javascript">
               jQuery.extend(true, Drupal.settings, ' . $settings . ');
             </script>';

  drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
  $script を印刷します。$view;
  出口;

注 : アコーディオン ビューが特定の .js ファイルに依存している場合は、このファイルが ajax リクエストが発生するすべてのページ内で提供されていることを確認してください。通常、そのようなページがビューなしで読み込まれる (全ページ読み込み) 場合は、このファイルを明示的にソースする必要があります。

これは hook_page_preprocess() 実装で実現できます:

function moduleName_preprocess_page(&$variables) {
  // Include .js to the page so views can rely on in future ajax request
  drupal_add_library('system', 'ui.accordion');
  drupal_add_js(drupal_get_path('module', 'views_accordion') . '/views-accordion.js');

  // Add the css for fixing/preventing accordion issues.
  drupal_add_css(drupal_get_path('module', 'views_accordion') . '/views-accordion.css');

  // ...
}

... または、コンテンツが要求されたときにファイルを含めることにより (Drupal.settings の場合と同様)、ajax コールバックの $script 変数にスクリプト タグを追加するだけです。

$script .= '<script type="text/javascript" src="sourcefile.js"></script>'

お役に立てれば!

于 2014-04-27T17:37:14.277 に答える