我在制作一个drupal模块。我在模块中的要求是当模块被激活时,它需要在body标签后面的page.tpl文件中添加一个javascript。任何人都可以帮助我如何做到这一点。我曾尝试使用drupal_add_js,但它不会完全将脚本放在body标签后面,而是放在页眉或页脚的下方。我也试过使用模板变量和预处理方法,但问题是预处理方法用新变量替换该变量的旧值。有没有办法如何实现这一点。在body标签后面添加一个javascript
回答
您可以在模块中实现yourModule_preprocess_page(&$vars)
函数,该函数将您自定义的JavaScript包含标记添加为$ vars数组的新条目,例如,为$vars['yourModule_js']
:
function yourModule_preprocess_page(&$vars) {
$vars['yourModule_js'] = yourModule_create_js_markup(); // TODO: adjust to your needed output
}
有了这个地方,您修改page.tpl.php中的文件来检查这个变量的存在,如果它的存在,它输出你喜欢的地方:
<?php if ($yourModule_js): ?>
<?php print $yourModule_js; ?>
<?php endif; ?>
注意:这不是一个推荐的路要走,因为它会从Drupal的缓存/汇聚机制,排除您的JavaScript和可能容易引起您的网站与其他JavaScript问题/冲突。您应该考虑调整您的JavaScript,使其符合Drupal标准,请参阅Overview of JavaScript, AJAX, AHAH API以及从JavaScript in Drupal链接的页面以了解有关详情。
我已经使用了这种方法,但问题出在我对模块的要求上,我不允许更改page.tpl。激活期间模块应该自动进行。这更像是为drupal用户界面做所有事情。 – prabdrup 2010-06-01 05:47:02
@prabdrup:在不改变page.tpl.php的情况下,你无法控制你所做的任何更改将被打印出来,或者甚至完全打印出来。请注意,根据所使用的主题,page.tpl.php文件可能会有很大的不同,并且该文件的作者完全可以自由跳过即使标准Drupal变量的打印。我无法在Drupal中满足这个特定要求。 – 2010-06-01 19:38:23
Drupal没有API允许在任何地方添加JS。
最简单的解决方案是将其添加到您的主题中的page.tpl.php中 - 手动,硬编码。 如果你不喜欢,你可以继续在这条路线:
- 在page.tpl.php中添加一个变量上打印
- 随着变量预处理,你想对JS的地方,初始化一个变量“页面” $瓦尔[“inline_js”]
- 最简单的方式来填补这个变量,是给它分配一个硬编码值(丑)
- 性能稍微困难,但还是简单,就是分配它是一个变量:variable_get('inline_js','... my_inline_js')。然后你可以在settings.php中设置这个变量,或者编写一个非常简单的模块来设置它。
稍微难一点,但仍然简单,就是给它分配一个变量:variable_get('inline_js','... my_inline_js')。然后你可以在settings.php中设置这个变量,或者编写一个非常简单的模块来设置它。 我们必须修改page.tpl吗?我正在寻找一些能够在激活模块后完成所有工作的东西。用户不应该去page.tpl并更改代码。一切都应该在模块上激活。 – prabdrup 2010-06-01 05:50:39
是的,你需要修改page.tpl.php。 AFAIK你不能在设置Js之后设置Js,因为Drupal没有变量可以在那里打印。所以AFAIK你想要的是不可能的。 也许你可以滥用打印在$页面中的变量,但那只是:滥用。它会中断。 – berkes 2010-06-01 13:30:42
@berkes:函数'drupal_add_js()'存在一个精确的目的(在浏览的页面中包含一个JavaScript文件)。说不可能改变模板文件不可能做什么是不正确的;所有需要包含JavaScript文件的模块根本不会改变页面模板。 – kiamlaluno 2010-06-17 03:46:40
我认为最好的办法就是像这样放在页脚中,这取决于它在页面结束时呈现的主题,这也意味着评估很晚,这就是为什么你'd想把JS放在最下面:
$path_to_script = $drupal_get_path('module', 'my_module') . '/my_module.js');
drupal_add_js($path_to_script, $type = 'module', $scope = 'footer');
为什么你需要这个'特殊'的位置? – 2010-05-31 12:01:31
请参阅http://stackoverflow.com/a/29211020/2199525 – leymannx 2015-03-23 13:09:19