Answers:
您可以在任何模板中打印区域,但是在模板中没有开箱即用的区域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']
。
问题在于$page
in 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
您要渲染的区域的名称在哪里。
<?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>
。从这里:webomelette.com/add-region-node-template
block_get_blocks_by_region()
仅返回块数组,并且如果要将其呈现为区域,则需要添加区域包装器。