web-dev-qa-db-fra.com

Comment charger une vue avec ajax pour que les fichiers js / css supplémentaires nécessaires à la vue soient également chargés?

Actuellement, j'utilise jQuery pour charger une vue, comme ceci:

$.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!');
    }
  });

Mon problème est que, par exemple, si la vue utilise le module "Field Slideshow", les fichiers js/css nécessaires à son bon fonctionnement ne sont pas chargés. Quelle pourrait être une solution agréable (= chatons indemnes) à cela?

8
Temaruk

Hmm, j'ai l'impression que cette question mérite une plus grande prime :-p mais néanmoins voici ma tentative de répondre à cela.

Drupal charge déjà tous les css/js supplémentaires maintenant je ne peux pas vraiment trouver beaucoup de documentation dessus et malheureusement les fichiers JS ne sont pas facilement documentés sans avoir réellement lu le code mais sont là.

Vous devriez vraiment essayer d'éviter de faire vous-même une demande $ .ajax et de tout emballer avec Drupal.ajax également si vous utilisez le système Ajax, vous n'avez même pas besoin d'écrire la demande ajax vous-même.

En implémentant une demande Drupal ajax appropriée en utilisant les commandes ajax, la plupart des manipulations css/js seront effectuées automatiquement pour vous.

En regardant votre code ci-dessus, il semble que vous fassiez la même demande que les vues le feraient normalement. Donc, vous devriez probablement laisser les vues gérer la requête ajax et écraser les commandes ajax qui seront déclenchées pour être votre commande. Vous pouvez le faire en implémentant un hook_ajax_comamnd_alter mais il aspire un peu avec les vues car vous perdez toutes les informations contextuelles, donc je recommanderais plutôt d'utiliser hook_views_ajax_data_alter.

Je sais qu'il n'y a pas beaucoup de code dans ma réponse, mais il est difficile de répondre avec du code, étant donné que le code actuellement n'est pas correct d'être avec.

Pour plus d'informations, voir Drupal.ajax dans le fichier misc/ajax.js. Pour un exemple d'implémentation d'une requête ajax avec Drupal.ajax voir le fichier vues ajax. Et si vous voulez voir et un exemple de comportement normal de vues écrasé en changeant les commandes ajax voir le module views_load_more où je fais ce comportement.

N'hésitez pas non plus à commenter cette réponse, si quelque chose n'est pas clair.

Sur et pour plus d'informations sur le framework Ajax voir Ajax Framework par exemple voir le module exemple , même si la plupart de ce que vous voulez faire n'est pas couvert par le module d'exemples.

7
ericduran