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

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

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

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

Drupal 7有一个例程,可以允许以编程方式插入一个模块或节点的块?

如果您的服务器使用更新版本的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; ?> 

D7:

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

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

'block_delta' =块的机器名称。 您可以通过访问块pipe理页面并编辑块来确定这是什么。 例如,用于编辑WebForm块的URL将如下所示:

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

在这个例子中, 'webform'是模块的名字, 'client-block-11'是模块的delta。

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

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

这似乎是插入块到Drupal 7模板的解决scheme,但它似乎有点笨重,我不知道对性能的影响:

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

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

这为我工作:

98是块的ID

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

刚刚在drupal 7中testing过,它的工作原理是:

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

祝你好运!

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

出于某种原因, render()对我不起作用,但是这样做:

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

在我的search包括模板块,我碰到这个职位。

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

 $block = block_get_custom_block($bid); $content = $block['body']; 

这适用于我的Drupal 7,URL:admin /结构/块/pipe理/ addthis / ** addthis_block ** /configuration注:增量和模块名称存在于url本身

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

有关更多信息, 请访问http://www.ultechspot.com/drupal/insert-block-node-or-template-drupal-7

改善的回答,你可以在一行中做到这一点…

 <?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'))))); ?> 
  $block = module_invoke('menu_block', 'block_view', '6'); echo render ($block['content']); 

这适用于打印菜单块。

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

注:我知道这个问题是关于“编程插入模块或节点块”,但谷歌发送人在这里,即使他们正在寻找像我这样的非程序员解决scheme。

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

最近我面临同样的问题,我遇到了一个很好的解决scheme,在drupal中描述了解决scheme。

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

创build新的模板variables是通过使用预处理函数完成的。 在主题的template.php文件中,创build一个如下所示的函数:

 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']); ?> 

where sidebar_first是要渲染的区域的名称。

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