Informazioni su Drupal.settings e #attached


8

Sto cercando di utilizzare Drupal.settings per la prima volta per passare variabili da PHP a JavaScript. La documentazione sull'argomento è scarsa e ho alcuni problemi.

È possibile utilizzare #attaccato per passare attraverso le impostazioni anziché drupal_add_js(array('myModule' => $settings), 'setting');? Il motivo per cui sto chiedendo è che mi è stato detto che #attachedè il modo "corretto" di aggiungere impostazioni. (So ​​che è anche il modo corretto di aggiungere anche file, ma non sono sicuro che funzioni con le variabili delle impostazioni.)

Sto usando il seguente codice, ma non riesco a caricarlo sotto gli oggetti DOM e sono bloccato.

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

Qualsiasi consiglio sarebbe molto apprezzato. Tieni presente che questa è la prima volta che decido di utilizzare Drupal.settings, quindi ogni dettaglio è benvenuto e apprezzato.

Risposte:


6

#attaccato può essere usato come segue.

$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(), è possibile utilizzare il seguente codice.

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

In un file JavaScript, è possibile ottenere il valore delle variabili come segue.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };

Grazie, non è limitato all'ambito di un $ form, perché JS in ogni pagina non dovrei usare hook_page_alter con; $ page ['header'] ['# allegati'] ['js'] ecc.?
Plutone,

oltre a ciò che ho menzionato sopra sui file, la mia domanda riguarda Drupal.settings, ovvero il passaggio di variabili e array PHP.
Plutone,

puoi controllare la risposta aggiornata
harshal

Grazie ancora, ma quello che non riesco a capire è perché questi esempi usano sempre $ form, che ne dici di render array e aggiungere js ad ogni pagina?
Plutone,

Per espandere, quando ho aggiunto i file js usando $ form / # in allegato, sono stati caricati solo nell'array $ form.
Plutone,

2

Mille grazie per le risposte pubblicate.

Come menzionato nella domanda originale, il problema non era come caricare i file CSS e JS usando #attached, ma come passare le variabili a Drupal.settings usando #attached e non drupal_add_js (). Esistono problemi relativi alle migliori pratiche che circondano drupal_add_js per quanto riguarda la memorizzazione nella cache e la disponibilità nell'ambito del DOM.

Dopo alcune ricerche ho la soluzione. L'esempio seguente usa #attached per caricare un file JS AND per passare le variabili PHP collegandole all'array $ page (array di rendering).

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

Quindi il motivo per cui voglio fare questo è che voglio passare stati variabili da PHP / Drupal a un file jQuery, come booleani ecc. Con l'esempio sopra, ora posso accedere a quello 'stato' usando:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Tutto questo senza toccare drupal_add_js ();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.