Información sobre Drupal.settings y #attached

8

Estoy tratando de usar Drupal.settings por primera vez para pasar variables de PHP a JavaScript. La documentación sobre el tema es escasa y tengo algunos problemas.

¿Es posible usar #attached para pasar por la configuración en lugar de hacerlo drupal_add_js(array('myModule' => $settings), 'setting');? La razón por la que pregunto es porque me han dicho que esa #attachedes la forma "correcta" de agregar configuraciones. (Sé que también es la forma correcta de agregar archivos, pero no estoy seguro si funciona con variables de configuración).

Estoy usando el siguiente código, pero no puedo cargarlo debajo de los objetos DOM y estoy atascado.

(function ($) {
   Drupal.behaviors.myModule = {
     attach: function(context, settings) {}
   };
});(jQuery);

Cualquier consejo sería muy apreciado. Tenga en cuenta que esta es la primera vez que me propongo usar Drupal.settings, por lo que cada detalle es bienvenido y apreciado.

Plutón
fuente

Respuestas:

6

# adjunto se puede usar de la siguiente manera.

$form['#attached']['js'][] = array(
  'data' => array(
    'xx_system' => array(
        'xx_code' => variable_get('xx_code', 'xx'),
        'xx_key' => variable_get('xx_key', 'xx'),
      ),
    ),
  'type' => 'setting',
);

Con drupal_add_js(), puede usar el siguiente código.

 drupal_add_js(array('orgs' => $orgs), array('type' => 'setting'));
 drupal_add_js(drupal_get_path('module', 'module_name') . '/module_name.js');

En un archivo JavaScript, puede obtener el valor de las variables de la siguiente manera.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };
harshal
fuente
Gracias, ¿no se limita al alcance de un formulario $, para JS en cada página no debería usar hook_page_alter con; $ page ['encabezado'] ['# adjunto'] ['js'] etc.?
Plutón
Además de lo que mencioné anteriormente sobre los archivos, mi pregunta se relaciona con Drupal.settings, es decir, pasar variables PHP y matrices.
Plutón
puedes consultar la respuesta actualizada
harshal
Gracias de nuevo, pero lo que no puedo entender es por qué estos ejemplos siempre usan $ form, ¿qué pasa con las matrices de renderizado y agregar js a cada página?
Plutón
Para expandir, cuando agregué archivos js usando $ form / # adjunto, solo se cargaron dentro de la matriz $ form.
Plutón
2

Muchas gracias por las respuestas publicadas.

Como se mencionó en la pregunta original, el problema no era cómo cargar archivos CSS y JS usando #attached, sino cómo pasar variables a Drupal.settings usando #attached y no drupal_add_js (). Hay problemas de mejores prácticas que rodean a drupal_add_js con respecto al almacenamiento en caché y la disponibilidad bajo el DOM.

Después de un poco de investigación tengo la solución. El siguiente ejemplo usa #attached para cargar un archivo JS Y para pasar variables PHP a través de adjuntarlas al $ page array (render array).

hook_page_alter() {

  $my_PHP_variable  // or array of variables

  $page['header']['#attached']['js'] = array(
    drupal_get_path('module', 'mymodule') . '/js/mymodule.js' => array(),
    array(
      // Pass PHP variables to Drupal.settings.
      'data' => array('myModuleVarSet' => $my_PHP_variable),
      'type' => 'setting',
   ),
);
}

Entonces, la razón por la que quiero hacer esto es porque quiero pasar estados variables de PHP / Drupal a un archivo jQuery, como booleanos, etc. Con el ejemplo anterior, ahora puedo acceder a ese 'estado' usando:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Todo esto se hace sin tocar drupal_add_js ();

Plutón
fuente