¿Cómo cargar una vista con ajax para que también se carguen los archivos js / css adicionales que necesita la vista?

8

Actualmente estoy usando jQuery para cargar una vista, como esta:

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

Mi problema es que, por ejemplo, si la vista usa el módulo 'Presentación de campo', los archivos js / css necesarios para que funcione correctamente no se cargan. ¿Cuál podría ser una buena solución (= gatitos ilesos) para esto?

Temaruk
fuente
Parece que esto se resolverá en D8 drupal.org/node/561858 . Pasar la ruta al archivo js / css en Drupal.settings.mymodule y obtenerlos con jQuery.getScript () y jQuery.getCSS () (de github.com/furf/jquery-getCSS ) podría ser una solución ...
Temaruk
Aparentemente, el Framework Ajax ya es lento carga archivos css / js / library en D7. Todavía tengo que profundizar más, pero creo que la solución podría ser una devolución de llamada de menú ajax personalizada por vista con entrega de página ajax ...
Temaruk
Tuve un problema similar , aún sin resolver, aunque puse un enlace aquí.
silkAdmin
No sé lo suficiente como para escribir una respuesta completa, pero creo que la API AJAX de Chaos Tools ya habría resuelto este problema. Es posible que desee usarlo o echarle un vistazo. Los campos editables también abordan este problema de alguna manera, por lo que puede haber algún código de referencia más para verificar.
wizonesolutions
1
@silkAdmin, también publiqué una respuesta a tu pregunta. También debe tenerse en cuenta que en D7 realmente no necesita usar ctools. El marco Ajax está en D7 Core ( api.drupal.org/api/drupal/includes--ajax.inc/group/ajax )
ericduran

Respuestas:

7

Hmm, siento que esta pregunta merece una recompensa mayor :-p pero no obstante aquí está mi intento de responder esto.

Drupal ya carga cualquier css / js adicional ahora, realmente no puedo encontrar mucha documentación y lamentablemente los archivos JS no se documentan fácilmente sin leer el código, pero está ahí.

Realmente debe intentar evitar hacer la solicitud $ .ajax usted mismo y, en su lugar, envolver todo con Drupal.ajax también si usa el Sistema Ajax, ni siquiera necesita escribir la solicitud ajax usted mismo.

Al implementar una solicitud ajax de Drupal adecuada utilizando comandos ajax, la mayor parte del manejo de css / js se realizará automáticamente.

Al mirar su código anterior, parece que está haciendo la misma solicitud que las vistas normalmente lo harían por su cuenta. Por lo tanto, probablemente debería permitir que las vistas manejen la solicitud de ajax y sobrescriban los comandos de ajax que se activarán como su comando. Puede hacer esto implementando un hook_ajax_comamnd_alter pero apesta con las vistas porque pierde toda la información contextual, por lo que recomendaría usar hook_views_ajax_data_alter en su lugar.

Sé que no hay mucho código en mi respuesta, pero es difícil responder con código, ya que el código actualmente no es correcto.

Para obtener más información, consulte Drupal.ajax en el archivo misc / ajax.js. Para ver un ejemplo de implementación de una solicitud ajax con Drupal.ajax, consulte el archivo ajax de vistas. Y si desea ver un ejemplo del comportamiento normal de vistas que se sobrescribe al cambiar los comandos ajax, vea el módulo views_load_more donde realizo este comportamiento.

Además, siéntase libre de comentar esta respuesta, si algo aquí no está claro.

Para obtener más información sobre Ajax Framework, consulte Ajax Framework, por ejemplo, consulte el módulo de ejemplo , aunque la mayor parte de lo que desea hacer no está cubierto en el módulo de ejemplos.

ericduran
fuente
Esa debe ser la dirección correcta, pero primero me gustaría verificar. Desde que hice la pregunta, obtuve algo de experiencia con el Marco Ajax de Drupal 7, como crear y usar comandos ajax personalizados. ¡Revisaré mi problema y veré qué se puede hacer, y actualizaré con información sobre mis hallazgos! ¡Gracias!
Temaruk
la url a la que se refiere
shekoufeh