如何将变量从.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的数据类型/内容如何,执行此操作都会为您解决所有此类问题。

Answers:


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中不鼓励的做法,因为它会使全局名称空间混乱。另外,如果您的代码是在页面加载时触发的,请检查Drupal 7文档中“ 管理JavaScript ”中的“行为”部分(整个页面值得阅读)。


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 8drupal_add_js()已被删除(Drupal 7中已弃用)=> 有关更多信息,请参见此

@ 4k4对类似问题的回答完美地描述将PHP信息发送到Javascript的方式。

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 '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.