36

在 Drupal 6 中,使用以下代码很容易将块插入到模板中:

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

但是,在 Drupal 7 中使用相同的指令似乎不起作用。我环顾四周,找不到新方法。

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

4

15 回答 15

86

D7:

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

'module_name' = 模块的机器名称(即模块的文件夹名称)。对于核心模块也是如此,因此例如“搜索”、“用户”和“评论”都可以在这里工作。

'block_delta' = 块的机器名称。您可以通过访问块管理页面并编辑块来确定这是什么。例如,用于编辑网络表单块的 URL 类似于:

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

在此示例中,“webform”是模块的名称,“client-block-11”是块的增量。

自定义块将具有模块名称“块”和增量编号,您也可以通过编辑块找到。

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

于 2011-10-20T13:18:48.547 回答
27

这似乎是在 Drupal 7 的模板中插入块的解决方案,但它似乎有点笨拙,我不知道对性能的影响:

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

如果有人有更好的程序,请添加。

于 2011-01-19T17:30:04.760 回答
21

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

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;
  ?>
于 2014-03-10T16:12:37.160 回答
11

这对我有用:

98是块的id

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
于 2012-11-27T13:52:18.960 回答
7

刚刚在 drupal 7 中测试了它,它可以工作:

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

祝你好运!

于 2011-07-19T23:21:28.783 回答
5

由于某种原因render()对我不起作用,但这确实:

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
于 2012-05-21T13:46:55.183 回答
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

于 2012-08-05T20:22:17.787 回答
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'))))); ?>
于 2015-01-04T22:43:15.017 回答
3

在我搜索在模板中包含一个块时,我遇到了这篇文章。

另外,如果您想包含一个自定义块(通过块界面添加),您必须使用(而不是block_load();在 drupal 7 中)

$block = block_get_custom_block($bid);
$content = $block['body'];
于 2011-10-29T11:38:51.470 回答
3

这适用于我的 Drupal 7,URL:admin/structure/block/manage/ addthis / addthis_block /configure 注意:url 本身中存在的增量和模块名称

$addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']);

更多信息可以在 http://technarco.com/drupal/insert-block-node-or-template-drupal-7上找到

于 2013-06-04T06:31:56.270 回答
1
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

这适用于我打印菜单块。

于 2014-03-26T09:09:12.737 回答
1

对于那些想要插入块“Drupal 方式”的人来说,有一个名为insert_block的模块(不要编程任何东西,只需启用该模块)。以下是如何设置它。

注意:我知道这个问题是关于“以编程方式将块插入模板或节点”,但即使他们正在寻找像我这样的非程序员解决方案,谷歌也会把人们送到这里。

于 2016-01-25T10:13:04.610 回答
0

看看 Drupal 在_block_render_blocks中是如何做到的。该函数的结果被传递给drupal_render

于 2011-01-19T03:35:04.493 回答
0

module_invoke模板文件中的渲染块工作正常,但它不适用于多语言站点。

于 2018-06-08T10:24:34.723 回答
0

最近我遇到了同样的问题,我遇到了一个很好的解决方案,它将drupal中的解决方案描述为drupal的方式。

您可以在任何模板中打印区域,但它们在 node.tpl.php 模板中不可用。为了使它们可用,您将创建一个新变量以在您的 node.tpl.php 模板中使用,该模板将包含所有区域内容。

通过使用预处理函数来创建新的模板变量。在主题的 template.php 文件中,创建一个如下所示的函数:

function mytheme_preprocess_node(&$variables) {
  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

然后,在您的主题的 node.tpl.php 模板中,您可以通过执行以下操作来渲染任何区域:

<?php print render($region['sidebar_first']); ?>

其中 sidebar_first 是您要渲染的区域的名称。

在此处阅读完整的文章:https ://drupal.stackexchange.com/questions/20054/can-regions-be-printed-within-a-node-template

于 2016-02-10T11:12:07.743 回答