it-swarm-es.com

¿Cómo puedo controlar el orden de los comportamientos de Drupal?

Quiero que el código JavaScript del módulo X se ejecute solo después de que se haya ejecutado el del módulo Y. ¿Cuál es la mejor manera de hacer esto?

9
cam8001

El código JavaScript utilizado por Drupal 7 es el siguiente:

Drupal.attachBehaviors = function (context, settings) {
  context = context || document;
  settings = settings || Drupal.settings;
  // Execute all of them.
  $.each(Drupal.behaviors, function () {
    if ($.isFunction(this.attach)) {
      this.attach(context, settings);
    }
  });
};

Drupal 6 usa un código similar:

Drupal.attachBehaviors = function(context) {
  context = context || document;
  if (Drupal.jsEnabled) {
    // Execute all of them.
    jQuery.each(Drupal.behaviors, function() {
      this(context);
    });
  }
};

Si JavaScript garantiza que las propiedades del objeto/matriz siempre se atraviesen en el mismo orden en que se agregan, entonces los valores se pasarían de jQuery.each() a la función utilizada como su segundo parámetro en el mismo orden en que se insertan la matriz pasó como primer parámetro.
Esto significaría que el primer comportamiento insertado en Drupal.behaviors Se ejecuta primero.
En este caso, para permitir que los comportamientos definidos por su módulo se ejecuten primero, podría usar un peso más ligero para él. Si desea que se ejecuten antes que los demás, el peso del módulo debe establecerse en -50; otros valores también pueden funcionar. Si está utilizando Drupal 7, drupal_add_js () permite asociar un peso al código JavaScript; el código JavaScript con un peso más ligero aparece primero en la salida HTML. no es posible con Drupal 6, pensó.

JavaScript no garantiza que las propiedades se atraviesen en el mismo orden en que se agregan. Esto significa que diferentes implementaciones de JavaScript presentarían las mismas propiedades usando un orden diferente; También significa que el mismo orden podría cambiar en diferentes versiones del mismo navegador.

5
kiamlaluno

Utilice el módulo Pesos de comportamiento .
(Por favor, pruébelo antes de usarlo en un sitio de producción)

El módulo permite adjuntar pesos a los comportamientos, y luego secuestra/reemplaza drupal.attachBehaviors con una implementación personalizada, que respeta los pesos.


¿Por qué no el peso del módulo, como se sugiere en la otra respuesta?

  • el peso del módulo es una herramienta bastante pesada. Se aplica a todas las implementaciones de enlace (php) y comportamientos (js) del módulo, mientras que solo estamos interesados ​​en un solo comportamiento.
  • el orden de las propiedades en un objeto js no está garantizado por la especificación (aunque se implementa como es de esperar en casi todos los navegadores).

Ver
¿El orden de los campos en un objeto javascript es predecible al recorrerlos? y
Orden de elementos - para (... en ...) bucle en javascript .

5
donquixote

Para Drupal 6 -

Una solución simple, si esto no necesita ser portátil, es colocar el JS que desea ejecutar en último lugar en el archivo de plantilla template.php. Las llamadas temáticas drupal_add_js siempre se llaman después de los módulos.

Si necesita ser portátil, la solución "más limpia" en drupal 6 es agregar un nuevo módulo que tenga un peso diferente al de su módulo con el php. Incluso podría tener los dos módulos en el misma carpeta, haga que el primer módulo dependa del primero y ajuste los pesos en los ganchos de instalación/actualización. Ninguno de los cuales es necesario, solo hace que la instalación sea más fácil.

0
mirzu