Drupal:强制区域始终渲染?

时间:2013-01-02 14:16:18

标签: drupal

我想总是渲染所有地区。即使它们不包含任何块。

我像这样渲染我的区域(在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();
        }
    }
}

3 个答案:

答案 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的缓存。