Info tentang Drupal.settings dan #attached

8

Saya mencoba menggunakan Drupal.settings untuk pertama kalinya untuk meneruskan variabel dari PHP ke JavaScript. Dokumentasi tentang topik ini jarang dan saya memiliki beberapa masalah.

Apakah mungkin menggunakan #attached untuk melewati pengaturan daripada drupal_add_js(array('myModule' => $settings), 'setting');? Alasan saya bertanya adalah karena saya telah diberitahu bahwa itu #attachedadalah cara yang "benar" untuk menambahkan pengaturan. (Saya tahu ini juga cara yang benar untuk menambahkan file, tetapi tidak yakin apakah itu berfungsi dengan variabel pengaturan.)

Saya menggunakan kode berikut, tapi saya tidak bisa memuatnya di bawah objek DOM dan saya mandek.

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

Saran apa pun akan sangat dihargai. Harap diingat bahwa ini adalah pertama kalinya saya berangkat menggunakan Drupal.settings, sehingga setiap detail diterima dan dihargai.

Pluto
sumber

Jawaban:

6

#attached dapat digunakan sebagai berikut.

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

Dengan drupal_add_js(), Anda dapat menggunakan kode berikut.

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

Dalam file JavaScript, Anda bisa mendapatkan nilai variabel sebagai berikut.

  Drupal.behaviors.module_name = {
    attach: function (context, settings) {
      var cities = Drupal.settings.orgs.cities;// you will get the cities value here
    }
  };
harshal
sumber
Terima kasih, Bukankah itu terbatas pada lingkup $ form, untuk JS di setiap halaman saya tidak boleh menggunakan hook_page_alter dengan; $ halaman ['tajuk'] ['# terlampir'] ['js'] dll?
Pluto
selain yang saya sebutkan di atas tentang file, pertanyaan saya berkaitan dengan Drupal.settings, yaitu lewat variabel PHP dan array melalui.
Pluto
Anda dapat memeriksa jawaban yang diperbarui
harshal
Terima kasih lagi, tetapi apa yang saya tidak mengerti adalah mengapa contoh-contoh ini selalu menggunakan $ form, bagaimana dengan membuat array dan menambahkan js ke setiap halaman?
Pluto
Untuk memperluas, ketika saya telah menambahkan file js menggunakan $ form / # terlampir, mereka hanya memuat dalam array $ form.
Pluto
2

Terima kasih banyak atas tanggapan yang diposting.

Seperti yang disebutkan dalam pertanyaan awal, masalahnya bukan bagaimana memuat file CSS & JS menggunakan #attached, tetapi bagaimana meneruskan variabel ke Drupal.settings menggunakan #attached dan bukan drupal_add_js (). Ada masalah praktik terbaik seputar drupal_add_js terkait caching dan ketersediaan di bawah DOM.

Setelah beberapa penelitian saya punya solusinya. Contoh berikut menggunakan #attached untuk memuat file JS AND untuk meneruskan variabel PHP dengan melampirkannya ke $ 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',
   ),
);
}

Jadi alasan saya ingin melakukan ini adalah karena saya ingin meneruskan variabel dari PHP / Drupal ke file jQuery, seperti booleans dll. Dengan contoh di atas, saya sekarang dapat mengakses 'status' itu menggunakan:

var myVar = Drupal.settings.myModuleVarSet.my_PHP_variable; 

Ini semua dilakukan tanpa menyentuh drupal_add_js ();

Pluto
sumber