Informations sur Drupal.settings et #attached

8

J'essaie d'utiliser Drupal.settings pour la première fois pour passer des variables de PHP à JavaScript. La documentation sur le sujet est rare et j'ai quelques problèmes.

Est-il possible d'utiliser #attached pour passer à travers les paramètres plutôt que drupal_add_js(array('myModule' => $settings), 'setting');? La raison pour laquelle je demande, c'est qu'on m'a dit que c'était #attachedla "bonne" façon d'ajouter des paramètres. (Je sais que c'est également la bonne façon d'ajouter des fichiers, mais je ne sais pas si cela fonctionne avec les variables de paramètres.)

J'utilise le code suivant, mais je n'arrive pas à le charger sous les objets DOM et je suis bloqué.

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

Tout avis serait grandement apprécié. Veuillez garder à l'esprit que c'est la première fois que je me propose d'utiliser Drupal.settings, donc chaque détail est le bienvenu et apprécié.

Pluton
la source

Réponses:

6

#attached peut être utilisé comme suit.

$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',
);

Avec drupal_add_js(), vous pouvez utiliser le code suivant.

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

Dans un fichier JavaScript, vous pouvez obtenir la valeur des variables comme suit.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };
harshal
la source
Merci, n'est-ce pas limité à la portée d'un formulaire $, pour JS dans chaque page, ne devrais-je pas utiliser hook_page_alter avec; $ page ['en-tête'] ['# attaché'] ['js'] etc.?
Pluton
outre que j'avais mentionné ci-dessus à propos des fichiers, ma question concerne Drupal.settings, c'est-à-dire le passage de variables et de tableaux PHP.
Pluton
vous pouvez vérifier la réponse mise à jour
harshal
Merci encore, mais ce que je ne comprends pas, c'est pourquoi ces exemples utilisent toujours $ form, qu'en est-il des tableaux de rendu et de l'ajout de js à chaque page?
Pluton
Pour développer, lorsque j'ai ajouté des fichiers js en utilisant $ form / # attaché, ils n'ont été chargés que dans le tableau $ form.
Pluton
2

Merci beaucoup pour les réponses publiées.

Comme mentionné dans la question d'origine, le problème n'était pas de savoir comment charger les fichiers CSS et JS en utilisant #attached, mais comment passer des variables à Drupal.settings en utilisant #attached et non drupal_add_js (). Il existe des problèmes de meilleures pratiques concernant drupal_add_js en ce qui concerne la mise en cache et la disponibilité sous le DOM.

Après quelques recherches, j'ai la solution. L'exemple suivant utilise #attached pour charger un fichier JS ET pour transmettre des variables PHP en les attachant au tableau $ page (tableau de rendu).

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',
   ),
);
}

Donc, la raison pour laquelle je veux le faire est que je veux passer des états variables de PHP / Drupal à un fichier jQuery, comme des booléens, etc. Avec l'exemple ci-dessus, je peux maintenant accéder à cet «état» en utilisant:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Tout cela sans toucher à drupal_add_js ();

Pluton
la source