Infos zu Drupal.settings und #attached

8

Ich versuche, Drupal.settings zum ersten Mal zu verwenden, um Variablen von PHP an JavaScript zu übergeben. Die Dokumentation zum Thema ist spärlich und ich habe ein paar Probleme.

Ist es möglich, #attached zu verwenden, um die Einstellungen zu durchlaufen, anstatt drupal_add_js(array('myModule' => $settings), 'setting');? Der Grund, den ich frage, ist, dass mir gesagt wurde, dass dies #attachedder "richtige" Weg ist, um Einstellungen hinzuzufügen. (Ich weiß, dass es auch der richtige Weg ist, Dateien hinzuzufügen, bin mir aber nicht sicher, ob es mit Einstellungsvariablen funktioniert.)

Ich verwende den folgenden Code, kann ihn jedoch nicht unter die DOM-Objekte laden und stecke fest.

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

Jeder Rat wäre sehr dankbar. Bitte denken Sie daran, dass dies das erste Mal ist, dass ich Drupal.settings verwende. Daher ist jedes Detail willkommen und wird geschätzt.

Pluto
quelle

Antworten:

6

#attached kann wie folgt verwendet werden.

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

Mit drupal_add_js()können Sie den folgenden Code verwenden.

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

In einer JavaScript-Datei können Sie den Wert der Variablen wie folgt abrufen.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };
Harshal
quelle
Danke, ist das nicht auf den Umfang eines $ -Formulars beschränkt, für JS auf jeder Seite sollte ich hook_page_alter nicht verwenden; $ page ['header'] ['# attach'] ['js'] etc.?
Pluto
Abgesehen davon, dass ich oben über Dateien gesprochen habe, bezieht sich meine Frage auf Drupal.settings, dh das Weiterleiten von PHP-Variablen und Arrays.
Pluto
Sie können die aktualisierte Antwort überprüfen
Harshal
Nochmals vielen Dank, aber ich kann nicht verstehen, warum diese Beispiele immer $ form verwenden. Was ist mit dem Rendern von Arrays und dem Hinzufügen von js zu jeder Seite?
Pluto
Wenn ich js-Dateien mit $ form / # als Anhang hinzugefügt habe, wurden sie nur in das $ form-Array geladen.
Pluto
2

Vielen Dank für die Antworten.

Wie in der ursprünglichen Frage erwähnt, ging es nicht darum, wie CSS- und JS-Dateien mit #attached geladen werden, sondern wie Variablen mit #attached und nicht mit drupal_add_js () an Drupal.settings übergeben werden. Es gibt Best-Practice-Probleme im Zusammenhang mit drupal_add_js in Bezug auf das Caching und die Verfügbarkeit im DOM.

Nach einigen Recherchen habe ich die Lösung. Im folgenden Beispiel wird #attached verwendet, um eine JS-Datei zu laden UND PHP-Variablen durch Anhängen an das $ page-Array (Render-Array) weiterzuleiten.

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

Der Grund, warum ich dies tun möchte, ist, dass ich variable Zustände von PHP / Drupal an eine jQuery-Datei wie Boolesche Werte usw. übergeben möchte. Mit dem obigen Beispiel kann ich jetzt auf diesen 'Zustand' zugreifen, indem ich:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Dies geschieht alles, ohne drupal_add_js () zu berühren.

Pluto
quelle