在Drupal 6中,使用以下代码将块插入模板很容易:
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
但是,使用Drupal 7中的相同说明似乎不起作用。我环顾四周,找不到新的方法。
Drupal 7是否有一个例程,允许以编程方式将块插入模板或节点?
答案 0 :(得分:85)
<强> D7:强>
<?php
$block = module_invoke('module_name', 'block_view', 'block_delta');
print render($block['content']);
?>
'module_name' =模块的机器名称(即模块的文件夹名称)。核心模块也是如此,例如“搜索”,“用户”和“评论”都可以在这里工作。
'block_delta' =块的机器名称。您可以通过访问块管理页面并编辑块来确定这是什么。例如,用于编辑webform块的URL将类似于:
Drupal 7:admin / structure / block / manage / webform / client-block-11 / configure
在此示例中,'webform'是模块的名称,'client-block-11'是块的增量。
自定义块的模块名称为“block”,数字为delta,您也可以通过编辑块找到它。
答案 1 :(得分:27)
这似乎是将块插入到Drupal 7的模板中的解决方案,但它看起来有点笨重,我不知道对性能的影响:
$block = block_load('views', 'block_name');
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
如果有人有更好的程序,请添加。
答案 2 :(得分:19)
使用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;
?>
答案 3 :(得分:11)
这项工作对我来说:
98是块的id
$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
答案 4 :(得分:7)
刚刚在drupal 7中对此进行了测试,它确实有效:
$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);
祝你好运!
答案 5 :(得分:5)
出于某些原因,render()
对我不起作用,但确实如此:
<?php
$block = module_invoke('block', 'block_view', '1');
echo $block['content'];
?>
答案 6 :(得分: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
答案 7 :(得分:3)
在我的搜索中,在模板中包含一个块,我发现了这篇文章。
另外,如果你想要包含一个自定义块(通过块接口添加),你必须使用(而不是drupal 7中的block_load();
)
$block = block_get_custom_block($bid);
$content = $block['body'];
答案 8 :(得分:3)
这适用于我的Drupal 7, 网址:admin / structure / block / manage / addthis / addthis_block / configure 注意:URL和模块名称存在于URL本身
中 $addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']);
可以找到更多信息 http://technarco.com/drupal/insert-block-node-or-template-drupal-7
答案 9 :(得分: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'))))); ?>
答案 10 :(得分:1)
$block = module_invoke('menu_block', 'block_view', '6');
echo render ($block['content']);
这适用于打印菜单块。
答案 11 :(得分:1)
对于想要插入块“Drupal方式”的人来说,有一个名为insert_block的模块(不是编程任何东西,只是启用模块)。 Here是如何设置它的。
注意:我知道这个问题是关于“以编程方式将一个块插入到模板或节点中”,但Google会向这里发送人员,即使他们正在寻找像我这样的非程序员解决方案。
答案 12 :(得分:0)
看看Drupal在_block_render_blocks中是如何做到的。该函数的结果将传递给drupal_render。
答案 13 :(得分: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
答案 14 :(得分:0)
module_invoke 模板文件中的渲染块工作正常,但它不能使用多语言网站。