bagaimana cara mengirim variabel dari file .php ke file .js?

37

Saya harap seseorang dapat membantu saya. Masalahnya adalah yang berikut: 1) Saya memiliki modul di mana menetapkan variabel untuk mengirim ke file template php.tpl

<?php
...
$testvar="Hello from alex!";
$variables['testvar'] = $testvar; 
...
?>

Variabel ini dapat ditampilkan dalam file php.tpl seperti

<?php print $testvar?>

2) Saya telah memisahkan file .js. Bagaimana saya bisa mendapatkan akses ke file dalam .js yang dapat diperbarui ini?

Saya tahu bagaimana jadinya jika file .js ada di dalam .php.tpl:

<?php
$testvar="Hello from alex!";
?>
<script type="text/javascript">
var myVar = '<?php print $testvar?>';
</script>

Masalahnya adalah bagaimana melakukan hal yang sama jika kedua file .js dan .php.tpl ini dipisahkan?

Alexey
sumber
2
jangan membabi buta gema variabel ke dalam Javascript. Jika ada metakarakter Javascript (tanda kutip tunggal, khususnya), Anda akan memperkenalkan kesalahan sintaksis. Lakukan var myVar = <?php echo json_encode($testvar) ?>;yang akan menangani masalah apa pun untuk Anda, terlepas dari tipe data / konten PHP var.
Daftar Drupal 7 js tips dan trik browse-tutorials.com/tutorial/javascript-drupal-7
ram4nd

Jawaban:

65

Anda harus menggunakan drupal_add_js()modul Anda, tidak perlu menampilkan variabel di .tpl.php:

drupal_add_js(array('YOURMODULE' => array('testvar' => $testvar)), array('type' => 'setting'));

Dan di JavaScript Anda, Anda dapat mengakses nilai di Drupal.settings.YOURMODULE.testvar:

alert(Drupal.settings.YOURMODULE.testvar);

Penggunaan langsung variabel global (seperti yang disarankan dalam sampel kode Anda) adalah praktik yang tidak disarankan dalam JavaScript karena mengacaukan namespace global . Juga, jika kode Anda dipicu pada pemuatan halaman, periksa bagian "Perilaku" di Mengelola JavaScript dalam dokumentasi Drupal 7 (seluruh halaman layak dibaca).

Pierre Buyle
sumber
17

Dalam file MODULENAME.module Anda gunakan kode berikut.

$testVariable = 'himanshu';
drupal_add_js(array('MODULENAME' => array('testvar' => $testVariable)), array('type' => 'setting'));
drupal_add_js(drupal_get_path('module', 'MODULENAME') . '/MODULENAME.js');

Dan di MODULENAME.js gunakan yang berikut ini.

(function($) {
  Drupal.behaviors.MODULENAME = {
    attach: function (context, settings) {
      alert(settings.MODULENAME.testvar);
    }
  };

})(jQuery);

Dengan cara ini, Anda dapat meneruskan variabel PHP Anda ke JavaScript, dan menggunakannya.

Himanshu Pathak
sumber
Apa fungsi yang dilakukan dan kapan dipicu? Mengapa tidak menggunakan langsung Drupal.settings.YOURMODULE.testvar?
Luar biasa
5

Untuk Drupal 8 , drupal_add_js()sudah dihapus (sudah tidak digunakan lagi di Drupal 7) => lihat ini untuk informasi lebih lanjut .

Cara mengirim informasi PHP ke Javascript dijelaskan dengan sempurna oleh jawaban @ 4k4 untuk pertanyaan serupa.

return [
  '#theme' => 'item_list',
  '#list_type' => 'ul',
  '#items' => $my_items,
  '#attributes' => ['class' => 'some_class'],
  '#attached' => [
    'library' => ['my_module/my_library'],
    'drupalSettings' => [
      'my_library' => [
        'some_variable1' => $value,        // <== Variables passed
        'another_variable' => $take_this,  // <== 
      ],
    ],
  ],
];

Dalam JavaScript, mereka dapat digunakan sebagai berikut:

(function ($, Drupal, drupalSettings) {
  Drupal.behaviors.my_library = {
    attach: function (context, settings) {

      alert(drupalSettings.my_library.some_variable); //alerts the value of PHP's $value

    }
  };
})(jQuery, Drupal, drupalSettings);
Florian Müller
sumber
Layak untuk disebutkan bahwa di *.libraries.ymlsana juga harus ada ketergantungan - core/drupalSettings.
leymannx