Làm thế nào để gửi biến từ tệp .php sang tệp .js?


37

Tôi hy vọng ai đó có thể giúp tôi. Vấn đề là như sau: 1) Tôi có mô-đun trong đó gán một biến để gửi đến tệp mẫu php.tpl

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

Biến này có thể được hiển thị trong tệp php.tpl như

<?php print $testvar?>

2) Tôi đã tách tệp .js Làm cách nào tôi có thể truy cập vào tệp biến đổi này trong tệp .js?

Tôi biết nó sẽ như thế nào nếu tệp .js nằm trong .php.tpl:

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

Vấn đề là làm thế nào để làm như vậy nếu hai tệp .js và .php.tpl được tách ra?


2
đừng mù quáng lặp lại một biến thành Javascript. Nếu có bất kỳ siêu ký tự Javascript nào (đặc biệt là các trích dẫn), bạn sẽ đưa ra các lỗi cú pháp. Làm var myVar = <?php echo json_encode($testvar) ?>;điều đó sẽ giải quyết mọi vấn đề như vậy cho bạn, bất kể kiểu dữ liệu / nội dung của var var.

Danh sách các mẹo và thủ thuật của Drupal 7 js duyệt
tutorials.com/tutorial/javascript

Câu trả lời:


65

Bạn nên sử dụng drupal_add_js()trong mô-đun của mình, không cần phải xuất biến trong .tpl.php:

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

Và trong JavaScript của bạn, bạn có thể truy cập giá trị trong Drupal.settings.YOURMODULE.testvar:

alert(Drupal.settings.YOURMODULE.testvar);

Việc sử dụng trực tiếp các biến toàn cục (như được đề xuất trong mẫu mã của bạn) là một cách thực hành không được khuyến khích trong JavaScript khi nó làm lộn xộn không gian tên toàn cầu . Ngoài ra, nếu mã của bạn được kích hoạt khi tải trang, hãy kiểm tra phần "Hành vi" trong Quản lý JavaScript trong tài liệu Drupal 7 (toàn bộ trang đáng để đọc).


17

Trong tệp MODULENAME.module của bạn sử dụng mã sau đây.

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

Và trong MODULENAME.js sử dụng cái sau.

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

})(jQuery);

Theo cách này, bạn có thể chuyển biến PHP của mình sang JavaScript và sử dụng nó.


Hàm này làm gì và khi nào nó được kích hoạt? Tại sao không sử dụng trực tiếp Drupal.sinstall.YOURMODULE.testvar?
Không thể tin được vào

5

Đối với Drupal 8 , drupal_add_js()đã bị xóa (nó không được dùng trong Drupal 7) => xem phần này để biết thêm thông tin .

Cách gửi thông tin PHP tới Javascript được mô tả hoàn hảo bằng câu trả lời của @ 4k4 cho một câu hỏi tương tự.

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,  // <== 
      ],
    ],
  ],
];

Trong JavaScript, chúng có thể được sử dụng như sau:

(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);

Đáng nói là trong *.libraries.ymlđó cũng cần có một sự phụ thuộc được định nghĩa - core/drupalSettings.
leymannx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.