在html.tpl.php中打印区域


10

我需要在html.tpl.php模板中输出一些区域,因为这些区域在page.tpl.php和page-front.tpl.php之间不会改变(仅举两个例子)。基本上,我想避免代码重复。

但是,似乎没有任何与html.tpl.php中的区域相关联的内容,也无法使用drupal_get_region_content检索任何内容(无论是否包含参数,它都只会返回一个空数组)。

有想法吗?


drupal_set_region_content()用来设置区域内容吗?
kiamlaluno

2
没有这样的功能。也许您的意思是,drupal_add_region_content()但是我没有看到任何意义:我通过块管理界面设置了区域的内容。
Morpheu11年

1
是的,我是说drupal_add_region_content()
kiamlaluno

Answers:


18

我这样解决了:

function mytheme_preprocess_html(&$variables) {
    $variables['region_name'] = block_get_blocks_by_region('region_name');
}

然后我可以做

<?php print render($region_name) ?>

为什么要使用echo?当然可以。
SDMulroy 2015年

当然,如果我要实现模块或公共主题,我将不得不遵守社区标准。这是我的客户专用的自定义主题。
Morpheu15年

我知道这是一篇非常老的文章,但是我认为在答案的作者懒惰地回答问题的情况下,接受答案的判断力很差。例如,您提供了一个要添加的功能,但假定所有读者都将神奇地知道此代码应该存放在哪里。那是懒惰的部分,我不赞成这样做,因为它没有为drupal新手用户/开发人员提供任何东西。
吃喝玩乐

感谢您的宝贵意见,以及新手可能无法获得完整说明的事实。但是,请考虑以下因素:a)临时喂食是懒惰的新手,b)那些甚至迅速阅读了文档的人(任何非懒惰的新手都应该拥有),该功能的位置应该相对明显。如果不是,则有充分的理由提供手册。我的问题(和答案)在一个层次上可以假定Drupal主题的某些基本知识。此外,这是一个Q&A网站,Docs网站就在隔壁。
Morpheu5 '16

1
@Skitties我们不能在这里重复文档,只是因为新用户不知道问题中显示的预处理功能是什么。这甚至不是问题的一部分。如果用户对特定的预处理功能有疑问,他们将提出一个新问题。
kiamlaluno

2

drupal_get_region_content()返回先前调用所设置的内容drupal_add_region_content(),但不包括通过block_page_build()在页面中呈现的块的内容。

如果您在Drupal源代码中搜索“ drupal_add_region_content”,则会注意到该函数的调用方式为:

  • drupal_get_region_content()
  • install_display_output()
  • template_preprocess_maintenance_page()
  • update_task_list()

您在管理页面中为块设置的内容是将在哪个区域渲染块,但不会在其中添加内容drupal_add_region_content();实际上,上面列出的所有功能(drupal_add_region_content()除了用于测试Drupal安装的代码之外,都是唯一调用的功能)都不用于呈现/添加块内容。

如果您需要用自己的代码呈现这些块,则应检查中使用的代码block_page_build()。特别是,以下代码可能对您更有用:

  // Fetch a list of regions for the current theme.
  $all_regions = system_region_list($theme);

  $item = menu_get_item();
  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
    // Load all region content assigned via blocks.
    foreach (array_keys($all_regions) as $region) {
      // Assign blocks to region.
      if ($blocks = block_get_blocks_by_region($region)) {
        $page[$region] = $blocks;
      }
    }
    // …
  }

前两行确认所显示的页面不是用于显示主题区域放置位置的演示页面。

如果您需要以其他方式呈现块,则很有可能您有兴趣覆盖主题中的theme_block(),或者(甚至更有可能)创建自定义的block.tpl.php模板文件。更改块呈现方式的另一种方法是对块使用预处理功能(hook_preprocess_block())。

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.