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

Ran*_*ess 36 drupal drupal-7 drupal-theming

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

$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
Run Code Online (Sandbox Code Playgroud)

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

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

小智 85

D7:

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

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

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

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

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

自定义块的模块名称为"块",并且编号为delta,您也可以通过编辑块找到它.

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

  • 这在节点中对我没有用.我不得不使用`print render($ block);`for views block和`print render($ block ['content']);`用于Drupal 7中的自定义块. (5认同)
  • 这不适合我.我不得不在Drupal 7中使用`print $ block ['content'];`. (2认同)

Ran*_*ess 27

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

$block = block_load('views', 'block_name');      
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));        
print $output;
Run Code Online (Sandbox Code Playgroud)

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


can*_*tex 20

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

Strict warning: Only variables should be passed by reference in include()...
Run Code Online (Sandbox Code Playgroud)

这是我做的不会导致/摆脱错误.

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


小智 11

这项工作对我来说:

98是块的id

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
Run Code Online (Sandbox Code Playgroud)


Dan*_*dro 7

刚刚在drupal 7中进行了测试,它的工作原理如下:

$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);
Run Code Online (Sandbox Code Playgroud)

祝好运!


小智 5

由于某种原因render()不适合我,但这样做:

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
Run Code Online (Sandbox Code Playgroud)


caf*_*nso 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;
Run Code Online (Sandbox Code Playgroud)

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

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