1

我想始终渲染所有区域。即使它们不包含任何块。

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

3 回答 3

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 属性。

于 2013-10-09T11:57:51.940 回答
1

这不仅仅是因为您没有为该区域分配任何块,而且几乎可以肯定是因为渲染数组是空的。请记住渲染函数的作用——它在渲染数组中的任何/所有元素和子元素上调用 drupal_render,将它们转换为 html 字符串以进行输出。如果没有可渲染元素,则​​不会返回任何 html。

渲染这些区域的正确(编程)方式是为每个区域定义一个渲染数组,将#markup 元素设置为您希望 Drupal 在那里输出的任何 html。这必须在您的自定义模块中完成。

如果您只需要从 gui 执行此操作,除了定义幻像块外,我看不到任何其他方法。在这种情况下,您可能应该重新考虑您要完成的工作。

于 2013-01-02T18:57:36.507 回答
0

我认为答案在于region.tpl.php文件和相关template_preprocess_region()函数。

模板文件检查是否有一个名为$contentavailable 的有效变量,该变量是从预处理函数加载的。如果该$content数组为空,则条件将失败并且不会呈现任何标记(如果该区域不包含块,则会发生这种情况)。

尝试将 region.tpl.php 的副本添加到您的主题中,删除if ($content):条件,然后刷新 Drupal 的缓存。

于 2013-01-02T17:43:13.417 回答