可以在节点模板中打印区域吗?


25

可以将区域打印在节点模板中,还是将区域严格限制在页面模板中?

Answers:


48

您可以在任何模板中打印区域,但是在模板中没有开箱即用的区​​域node.tpl.php。为了使它们可用,您将创建一个新变量以在node.tpl.php模板中使用,该变量将包含所有区域内容。

通过使用预处理功能来创建新的模板变量。在主题template.php文件中,创建一个如下所示的函数:

function mytheme_preprocess_node(&$variables) {
}

替换mytheme为主题的简称。现在,为了让Drupal识别此新的预处理功能,您需要重建站点的主题注册表。就像转到“ 配置” →“ 开发” →“ 性能”,然后按顶部的“清除所有缓存”按钮一样简单。

现在,预处理功能的工作方式是$variables包含一个与模板的可用变量相对应的数组。例如,在node.tpl.php$submitted包含了作者署名。在上面的预处理函数中,可以在中找到它$variables['submitted']

为了模仿您所拥有的东西page.tpl.php,在其中有一个$page包含所有区域的数组,您需要填充$variables['page']

问题在于$pagein node.tpl.php中已经填充了一个true / false值,该值使您知道是在单独查看节点还是在列表中查看节点。

因此,为了避免名称冲突,请填充$region

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

然后,在主题的node.tpl.php模板中,可以通过执行以下操作来渲染任何区域:

<?php print render($region['sidebar_first']); ?>

sidebar_first您要渲染的区域的名称在哪里。


1
最后是Drupal 7的可行解决方案:)
爱德华·卢卡

4
还有一个对我有用的快速解决方案<?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>。从这里:webomelette.com/add-region-node-template
Darragh Enright

这个解决方案很不错。您能否举例说明它何时最适用于node.tpl.php中的打印区域,而不是将其包含在page.tpl.php中?
Randell 2014年

这取决于您的设计。有时,布局可能会将侧边栏放置在一个易于主题化的位置,如果它位于节点div内而不是节点div之外。
rooby

不要忘记适当的区域包装!请参阅system_page_alter()以获取参考。请记住,这block_get_blocks_by_region()仅返回块数组,并且如果要将其呈现为区域,则需要添加区域包装器。
SiliconMind 2015年
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.