我正在尝试在Drupal站点的每个页面的开头添加一段代码。
由于我有多个page
模板,我想以编程方式执行此操作...但是没有成功。
我还是新手,虽然我得到了钩子,主题函数等等的要点,但我无法想出实现这一点的正确方法。
到目前为止,我已覆盖theme_preprocess_page(&$vars)
以添加必要的css和js:
function mytheme_preprocess_page(&$vars) {
if(condition) {
drupal_add_js(drupal_get_path('module', 'mymodule').'/js/modal.js');
}
}
我现在如何通过body
文件中的函数在每个drupal页面中添加html代码,最好是在打开template.php
标记之后或任何其他起始部分?
谢谢
答案 0 :(得分:3)
在预处理函数中,任何变量集都可以在page.tpl.php文件中找到。
function mytheme_preprocess_page(&$vars) {
if (condition) {
$vars['foo'] = '<div id="bar">TEST</div>';
}
}
然后,在您的页面模板中:
<body>
<?php print !empty($foo) ? $foo : ''; ?>
...
答案 1 :(得分:1)
这样可以避免修改模板中的任何代码:
function MY_MODULE_page_build(&$page)
{
$page['page_bottom']['my-markup'] = array('#markup' => '<div>My Markup Here</div>');
}
答案 2 :(得分:1)
看一下https://www.drupal.org/project/google_tag。他们就是这样做的:
/**
* Implements hook_page_alter().
*
* Adds a post_render callback
*/
function MYMODULE_page_alter(&$page) {
$page['#post_render'][] = 'MYMODULE_CALLBACK';
}
/**
* Implements callback_post_render().
*
* Inserts JavaScript snippet immediately following the opening body tag.
*/
function MYMODULE_CALLBACK(&$children, $elements) {
$script = '<script type="text/javascript">console.log(\'hello world\');</script>';
// Insert snippet after the opening body tag.
$children = preg_replace('@<body[^>]*>@', '$0' . $script, $children, 1);
return $children;
}
答案 3 :(得分:0)
我的方法最终覆盖了页面中的第一个渲染块,在我的例子中是语言切换器。 因为我已经超越了它来定制它,所以它并没有太大的意义,但无论如何它都是一种难以实现的方式。
<?php
function mytheme_languageswitcher($links) {
// inserting this here like a virus in a dna strip
if(condition) {
drupal_add_js(drupal_get_path('module', 'mymodule').'/js/modal.js');
}
// the *real* code for the language switcher override
}
?>
由于语言切换器在每个页面中呈现,因此它可以工作。语言切换器因任何原因停止显示的那一天,此解决方案将失败。
答案 4 :(得分:0)
您可以使用传递到drupal_add_js功能的选项将其添加到页脚。
function THEMENAME_preprocess_page(&$variables) {
if (condition) {
drupal_add_js(drupal_get_path('theme', 'THEMENAME') . '/PATH/TO/FILE.js', array('scope' => 'footer'));
}
}
这将通过模板$page_bottom
中的html.tpl.php
变量在关闭正文标记之前打印。
答案 5 :(得分:0)
另一种方法是使用原生drupal方法drupal_add_js
和drupal_get_js
。
//首先,添加自定义&#34;范围&#34; (在流程阶段之前)
<?php
drupal_add_js($tag_js, array(
'type' => 'inline',
'group' => JS_GROUP_TAGS,
'every_page' => TRUE,
'scope' => 'body_start',
'weight' => 1,
));
?>
//丑陋的方式:将drupal_get_js
直接添加到html.tpl.php
(但是为了测试,它很有用):
<body>
<?php print drupal_get_js('body_start'); ?>
...
</body>
//更简洁的方法:在流程方法中使用中间变量
//与template_process_html
theme.inc
完全相同
<?php
function MYMODULEORTHEME_process_html(&$variables){
$variables['js_body_start'] .= drupal_get_js('body_start');
}
?>
享受:)