我想总是渲染所有地区。即使它们不包含任何块。
我像这样渲染我的区域(在page.tpl.php
中):
<?php print render($page['region_name']); ?>
这是我正在使用的代码,但这没有效果。
function theme_name_page_alter(&$page) {
$regions = system_region_list($GLOBALS['theme'], REGIONS_ALL);
foreach ($regions as $region => $name) {
if(empty($page[$region])) {
$page[$region] = array();
}
}
}
答案 0 :(得分:2)
您可以确保Drupal使用以下代码(在自定义模块中)渲染每个区域:
function hook_page_alter(&$page) {
foreach($page as $region => $blocks) {
if(is_array($blocks) && in_array($region, array('region_1', 'region_2', 'region_3'))) {
if(count($blocks)==1) {
$page[$region]['phantom_content']['#markup'] = ' ';
}
}
}
}
您需要将region_1,region_2,region_3替换为您要确保始终呈现的区域名称。
为了解释一下代码,如果blocks数组的计数为1,则意味着它是空的,因为它总是包含#sorted属性。
答案 1 :(得分:1)
不仅仅是你没有为该区域分配任何块,但几乎可以肯定,因为渲染数组是空的。请记住渲染功能的作用 - 它在任何/所有元素上调用drupal_render&amp;渲染数组中的子节点,它们将它们转换为输出的html字符串。如果没有可渲染元素,则它不会返回任何html。
渲染这些区域的正确(编程)方法是为每个区域定义渲染数组,将#markup元素设置为您希望Drupal在那里输出的任何html。这必须在您的自定义模块中完成。
如果你只需要从gui那里做这件事,除了定义一个幻像块之外我什么都看不到。在这种情况下,您应该重新考虑一下您正在尝试完成的任务。
答案 2 :(得分:0)
我认为答案在于region.tpl.php文件和相关的template_preprocess_region()
函数。
模板文件检查是否有可用的有效变量$content
,该变量从预处理函数加载。如果$content
数组为空,则条件将失败并且不会呈现标记(如果区域不包含块,则会发生标记)。
尝试将region.tpl.php的副本添加到主题中,删除if ($content):
条件,然后刷新Drupal的缓存。