如何在 Drupal 7 中将主题区域正确添加到视图视图--page.tpl.php

How do I properly add a theme region to a views-view--page.tpl.php in Drupal 7

好的,这就是我所发现的(有效 - 但它会产生日志通知)“只有变量应该在 eval()" 这简直让我抓狂!

最初像任何主题区域一样,我将我想要用于视图的区域添加到 theme.info 文件。

; View Regions
regions[view_header]    = View Header
regions[view_content]   = View Content
regions[view_footer]    = View Footer

在 views-view--page.tpl.php 我放置了这些(我想要渲染区域的地方)

<?php print render(block_get_blocks_by_region('view_header')); ?>
<?php print render(block_get_blocks_by_region('view_content')); ?>
<?php print render(block_get_blocks_by_region('view_footer')); ?>

这会为 tpl 中的每个条目生成一个通知,但它按预期工作 100%

然后我尝试在主题 template.php 中添加一个钩子(试图从中创建变量)所以我可以像这样使用 <?php print $view_header; ?>

function theme_preprocess_views_view(&$variables){
  $variables['view_header'] = render(block_get_blocks_by_region('view_header'));
  $variables['view_content'] = render(block_get_blocks_by_region('view_content'));
  $variables['view_footer'] = render(block_get_blocks_by_region('view_footer'));

这再次起作用 - 这再次产生日志通知.. 这次所有页面加载的每个区域 3 个,所以 9 个而不是 3 个(不仅仅是当 views-view--page.tpl.php 加载时)这可以追溯到主题 template.php(这次与上面列出的通知相同,但在该页面加载时没有来自视图模板中使用的 $variables 的通知)。

显然我在这里遗漏了一些东西!也许这完全是错误的方法...

如何使主题区域在 tpl 中可用变量?

如有任何帮助,将不胜感激,谢谢!

这是因为函数 render() 需要一个引用,并且 只有变量应该通过引用传递 :

function render(&$element) {
  # code need to be able to modify $element
}

render('value');                                   # throws notice
render(block_get_blocks_by_region('view_header')); # throws notice

$value = 'value';
$build = block_get_blocks_by_region('view_header');
render($value); # Ok
render($build); # Ok

此外,我认为要走的路应该是在预处理挂钩中将可渲染数组分配给 $variables :

function theme_preprocess_views_view(&$variables){
  $variables['view_header'] = block_get_blocks_by_region('view_header');
  $variables['view_content'] = block_get_blocks_by_region('view_content');
  $variables['view_footer'] = block_get_blocks_by_region('view_footer');
  # ...
}

... 并让模板调用 render() :

<?php print render($view_header); ?>
<?php print render($view_content); ?>
<?php print render($view_footer); ?>