2010-05-31 35 views
1

我在制作一个drupal模块。我在模块中的要求是当模块被激活时,它需要在body标签后面的page.tpl文件中添加一个javascript。任何人都可以帮助我如何做到这一点。我曾尝试使用drupal_add_js,但它不会完全将脚本放在body标签后面,而是放在页眉或页脚的下方。我也试过使用模板变量和预处理方法,但问题是预处理方法用新变量替换该变量的旧值。有没有办法如何实现这一点。在body标签后面添加一个javascript

+0

为什么你需要这个'特殊'的位置? – 2010-05-31 12:01:31

+0

请参阅http://stackoverflow.com/a/29211020/2199525 – leymannx 2015-03-23 13:09:19

回答

0

您可以在模块中实现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链接的页面以了解有关详情。

+0

我已经使用了这种方法,但问题出在我对模块的要求上,我不允许更改page.tpl。激活期间模块应该自动进行。这更像是为drupal用户界面做所有事情。 – prabdrup 2010-06-01 05:47:02

+0

@prabdrup:在不改变page.tpl.php的情况下,你无法控制你所做的任何更改将被打印出来,或者甚至完全打印出来。请注意,根据所使用的主题,page.tpl.php文件可能会有很大的不同,并且该文件的作者完全可以自由跳过即使标准Drupal变量的打印。我无法在Drupal中满足这个特定要求。 – 2010-06-01 19:38:23

0

Drupal没有API允许在任何地方添加JS。

最简单的解决方案是将其添加到您的主题中的page.tpl.php中 - 手动,硬编码。 如果你不喜欢,你可以继续在这条路线:

  • 在page.tpl.php中添加一个变量上打印
  • 随着变量预处理,你想对JS的地方,初始化一个变量“页面” $瓦尔[“inline_js”]
  • 最简单的方式来填补这个变量,是给它分配一个硬编码值(丑)
  • 性能稍微困难,但还是简单,就是分配它是一个变量:variable_get('inline_js','... my_inline_js')。然后你可以在settings.php中设置这个变量,或者编写一个非常简单的模块来设置它。
+0

稍微难一点,但仍然简单,就是给它分配一个变量:variable_get('inline_js','... my_inline_js')。然后你可以在settings.php中设置这个变量,或者编写一个非常简单的模块来设置它。 我们必须修改page.tpl吗?我正在寻找一些能够在激活模块后完成所有工作的东西。用户不应该去page.tpl并更改代码。一切都应该在模块上激活。 – prabdrup 2010-06-01 05:50:39

+0

是的,你需要修改page.tpl.php。 AFAIK你不能在设置Js之后设置Js,因为Drupal没有变量可以在那里打印。所以AFAIK你想要的是不可能的。 也许你可以滥用打印在$页面中的变量,但那只是:滥用。它会中断。 – berkes 2010-06-01 13:30:42

+0

@berkes:函数'drupal_add_js()'存在一个精确的目的(在浏览的页面中包含一个JavaScript文件)。说不可能改变模板文件不可能做什么是不正确的;所有需要包含JavaScript文件的模块根本不会改变页面模板。 – kiamlaluno 2010-06-17 03:46:40

1

我认为最好的办法就是像这样放在页脚中,这取决于它在页面结束时呈现的主题,这也意味着评估很晚,这就是为什么你'd想把JS放在最下面:

$path_to_script = $drupal_get_path('module', 'my_module') . '/my_module.js'); 
drupal_add_js($path_to_script, $type = 'module', $scope = 'footer');