Как отправить переменную из файла .php в файл .js?

37

Я надеюсь, что кто-то сможет мне помочь. Проблема заключается в следующем: 1) У меня есть модуль, в котором назначить переменную для отправки в файл шаблона php.tpl

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

Эта переменная может быть показана в файле php.tpl как

<?php print $testvar?>

2) Я разделил файл .js. Как мне получить доступ к этой переменной внутри файла .js?

Я знаю, как это будет, если файл .js находится внутри .php.tpl:

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

Проблема в том, как сделать то же самое, если эти два файла .js и .php.tpl разделены?

Алексей
источник
2
не слепо выводить переменную в Javascript. Если есть метасимволы Javascript (особенно одиночные кавычки), вы внесете синтаксические ошибки. Сделайте, var myVar = <?php echo json_encode($testvar) ?>;что позаботится о любых таких проблемах для вас, независимо от типа данных / содержимого PHP var.
Список советов и подсказок по Drupal 7 js browse-tutorials.com/tutorial/javascript-drupal-7
ram4nd

Ответы:

65

Вы должны использовать drupal_add_js()в своем модуле, нет необходимости выводить переменную в вашем .tpl.php:

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

И в вашем JavaScript вы можете получить доступ к значению в Drupal.settings.YOURMODULE.testvar:

alert(Drupal.settings.YOURMODULE.testvar);

Прямое использование глобальных переменных (как предложено в вашем примере кода) - нежелательная практика в JavaScript, поскольку она загромождает глобальное пространство имен . Кроме того, если ваш код запускается при загрузке страницы, проверьте раздел «Поведения» в документе « Управление JavaScript в Drupal 7» (стоит прочитать всю страницу).

Пьер Буйль
источник
17

В вашем файле MODULENAME.module используйте следующий код.

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

А в MODULENAME.js используйте следующий.

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

})(jQuery);

Таким образом, вы можете передать свою переменную PHP в JavaScript и использовать ее.

Химаншу Патхак
источник
Что делает функция и когда она срабатывает? Почему бы не использовать напрямую Drupal.settings.YOURMODULE.testvar?
Невероятно,
5

Для Drupal 8 , drupal_add_js()был удален (он был устаревшим в Drupal 7 уже) => увидеть это для получения дополнительной информации .

Способ отправки информации PHP в Javascript прекрасно описывается ответом @ 4k4 на аналогичный вопрос.

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

В JavaScript их можно использовать следующим образом:

(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);
Флориан Мюллер
источник
Стоит отметить, что *.libraries.ymlздесь также должна быть определена зависимость - core/drupalSettings.
leymannx