如何在Drupal 7中将一个块插入到节点或模板中?

36

在Drupal 6中,使用以下代码轻松将块插入模板:

$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];

然而,在Drupal 7中使用相同的指令似乎不起作用。我找了很多地方,但找不到新方法。

Drupal 7是否有一种例程可以允许以编程方式将块插入模板或节点中?


现在出现了一个与较新版本的PHP相关的错误。请参见下面@canintex的答案。 - Randy Burgess
以上做法不被推荐。请参考在模板中加载块?获取详细信息。 - colan
以上做法在2014年已经不再推荐使用。在2011年,我们没有太多的依据。 - Randy Burgess
15个回答

86

D7:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

'module_name'表示模块的机器名称(即模块文件夹的名称)。这对于核心模块也是适用的,因此例如“search”,“user”和“comment”在这里都可以使用。

'block_delta'表示块的机器名称。您可以通过访问块管理页面并编辑块来确定这一点。例如,Webform块的编辑URL可能是:

Drupal 7:admin/structure/block/manage/webform/client-block-11/configure

在此示例中,'webform'是模块的名称,'client-block-11'是块的delta。

自定义块的模块名称为“block”,delta为数字,您也可以通过编辑该块来查找。

更多信息:http://drupal.org/node/26502


2
这对我没有用。在Drupal 7中,我不得不使用print $block['content']; - bcosynot
5
在节点中,这对我没有起作用。我不得不在Drupal 7中使用print render($block);来渲染Views块,并使用print render($block['content']);来渲染自定义块。 - Kevin Siji

27

这似乎是将块插入Drupal 7模板的解决方案,但它看起来有些笨重,我不知道对性能的影响:

$block = block_load('views', 'block_name');      
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));        
print $output;

如果有更好的步骤,请添加。


1
这是我采用的解决方案 - 因为这是我发现包括块标题和上下文链接的唯一方法。谢谢。 - jackocnr
这个方法将使用正确的模板文件对块内容进行主题化。Kloewer的答案将使您获得未经主题化的块正文。 - Segfault
1
自 PHP 5.4 开始,您只能在变量上调用 drupal_render()... 这意味着您应该将 $output 传递到 _block_get_renderable_array(),然后打印 drupal_render($output)。 - PatrickS
这就是我需要的,使用render()在.tpl.php文件中包含#attached js。 - Shaun Dychko

21

使用wrburgess的答案,如果您的服务器正在使用较新版本的PHP,则可能会出现错误。

Strict warning: Only variables should be passed by reference in include()...

这就是我为了避免/消除错误所做的事情。

  <?php
    $blockObject = block_load('views', 'block_name');
    $block = _block_get_renderable_array(_block_render_blocks(array($blockObject)));
    $output = drupal_render($block);
    print $output;
  ?>

谢谢您添加这个。两天前我遇到了这个问题,不确定原因。 - Randy Burgess
有谁能告诉我 drupal_render() 和 render() 之间的区别,以及在哪些情况下应使用每个函数?谢谢! - Stphane
@Stphane: http://drupal.stackexchange.com/questions/66302/what-is-the-difference-between-render-and-drupal-render#answer-66304 - canintex
非常好,感谢@canintex!我建议在打印或设置任何变量之前添加条件以确保$blockObject存在。 - ahimsauzi

11

这对我有效:

98 是该区块的编号

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;

在管理/结构/块/管理/块/98/配置页面中创建的块需要使用此代码进行渲染。 - Augusto

7

我在Drupal 7中进行了测试,它可以正常工作:

$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);

祝你好运!


5

因为某些原因,render()对我不起作用,但是下面的方法行得通:

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>

5
module_invoke()函数有效。但是,我发现用这种方式呈现块不会使用自定义的块模板。根据您的需求,这可能是可以接受的。
如其他答案中注释的那样,这种方法同样有效,并且还使用自定义的模板:
$raw_block = block_load('your-module', 'delta');
$rendered_block = drupal_render(_block_get_renderable_array(_block_render_blocks(array($raw_block))));
print $rendered_block;

因此,如果您有一个自定义的block--your-module--delta.tpl.php模板文件,它将用于格式化这个区块。

来源:http://api.drupal.org/api/drupal/includes!module.inc/function/module_invoke/7


3
改进wrburgess的答案,你可以在一行中完成...
<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('module_name', 'block_delta'))))); ?>

例如,我使用块编号6...
<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('block', '6'))))); ?>

3
在我搜索如何在模板中包含一个块时,我发现了这篇文章。此外,如果您想包含一个自定义块(通过块界面添加的),您必须使用以下代码(而不是Drupal 7中的block_load();)。
$block = block_get_custom_block($bid);
$content = $block['body'];

3
这适用于我的 Drupal 7 网站,URL 为: admin/structure/block/manage/addthis/addthis_block/configure 注意: URL 中包含 delta 和模块名称 $addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']); 更多信息可访问 http://technarco.com/drupal/insert-block-node-or-template-drupal-7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接