使用主题函数在body标签后面插入代码

时间:2011-04-16 18:22:54

标签: drupal themes hook override

我正在尝试在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标记之后或任何其他起始部分?

谢谢

6 个答案:

答案 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_jsdrupal_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');
}
?>

享受:)