як надіслати змінну з .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) ?>;що вирішить будь-які подібні проблеми для вас, незалежно від типу / вмісту даних PH-var.

Список порад та підказів
tutorials.com/

Відповіді:


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.