web-dev-qa-db-ja.com

ビューに必要な追加のjs / cssファイルも読み込まれるように、ajaxでビューを読み込む方法は?

現在、jQueryを使用して、次のようにビューをロードしています。

$.ajax({
    type: 'POST',
    url: Drupal.settings.basePath + 'views/ajax',
    dataType: 'json',
    data: 'view_name=' + viewName + '&view_display_id=default&view_args=' + viewArgument, // Pass a key/value pair.
    success: function(data) {
      var viewHtml = data[1].data;
      target.children().fadeOut(300, function() {
        target.html(viewHtml);

        var newHeightOfTarget = target.children().height();

        target.children().hide();

        target.animate({
          height: newHeightOfTarget
        }, 150);

        target.children().delay(150).fadeIn(300);

        Drupal.attachBehaviors(target);
      });
    },
    error: function(data) {
      target.html('An error occured!');
    }
  });

私の問題は、たとえば、ビューが「フィールドスライドショー」モジュールを使用している場合、適切に機能するために必要なjs/cssファイルがロードされないことです。これに対するニース(=子猫無害)ソリューションは何でしょうか?

8
Temaruk

うーん、この質問はもっと報われるに値するように感じます:-pしかし、それでもこれに答える私の試みはここにあります。

Drupalはすでに余分なcss/jsをロードしていますが、ドキュメントがあまり見つからず、残念なことに、JSファイルは実際にコードを読み取らずに簡単にドキュメント化することはできません。

$ .ajaxリクエストを自分で作成することは避け、代わりにすべてをDrupal.ajaxでラップする必要があります。Ajaxシステムを使用している場合は、自分でajaxリクエストを作成する必要さえありません。

適切なDrupal ajaxコマンドをajaxコマンドを使用して実装することにより、ほとんどのcss/js処理が自動的に行われます。

上記のコードを見ると、ビューが通常は自分で行うのと同じリクエストを作成しているように見えます。したがって、おそらくビューにajaxリクエストを処理させ、起動されてコマンドになるajaxコマンドを上書きする必要があります。これは、hook_ajax_comamnd_alterを実装することによって行うことができますが、すべてのコンテキスト情報が失われるため、ビューにやや困るので、代わりにhook_views_ajax_data_alterを使用することをお勧めします。

私の答えには多くのコードが含まれていないことはわかっていますが、現在コードが存在することは正しくないため、コードで答えることは困難です。

詳細については、misc/ajax.jsファイルのDrupal.ajaxを参照してください。 Drupal.ajaxでajaxリクエストを実装する例については、views ajaxファイルを参照してください。そして、あなたがajaxコマンドを変更することによって上書きされるビューの通常の動作を見たい場合は、views_load_moreモジュールを参照して、この動作を実行してください。

また、ここで不明な点がある場合は、この回答にコメントしてください。

Ajaxフレームワークの詳細については、 Ajax Framework を参照してください。たとえば、 example モジュールを参照してください。実行したいことのほとんどは、サンプルモジュールではカバーされていません。

7
ericduran