在 Drupal 6 中,使用以下代码很容易将块插入到模板中:
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
但是,在 Drupal 7 中使用相同的指令似乎不起作用。我环顾四周,找不到新方法。
Drupal 7 是否有允许以编程方式将块插入模板或节点的例程?
在 Drupal 6 中,使用以下代码很容易将块插入到模板中:
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
但是,在 Drupal 7 中使用相同的指令似乎不起作用。我环顾四周,找不到新方法。
Drupal 7 是否有允许以编程方式将块插入模板或节点的例程?
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”是块的增量。
自定义块将具有模块名称“块”和增量编号,您也可以通过编辑块找到。
这似乎是在 Drupal 7 的模板中插入块的解决方案,但它似乎有点笨拙,我不知道对性能的影响:
$block = block_load('views', 'block_name');
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
如果有人有更好的程序,请添加。
如果您的服务器使用的是较新版本的 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;
?>
这对我有用:
98是块的id
$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
刚刚在 drupal 7 中测试了它,它可以工作:
$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);
祝你好运!
由于某种原因render()
对我不起作用,但这确实:
<?php
$block = module_invoke('block', 'block_view', '1');
echo $block['content'];
?>
该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
改进 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'))))); ?>
在我搜索在模板中包含一个块时,我遇到了这篇文章。
另外,如果您想包含一个自定义块(通过块界面添加),您必须使用(而不是block_load();
在 drupal 7 中)
$block = block_get_custom_block($bid);
$content = $block['body'];
这适用于我的 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上找到
$block = module_invoke('menu_block', 'block_view', '6');
echo render ($block['content']);
这适用于我打印菜单块。
对于那些想要插入块“Drupal 方式”的人来说,有一个名为insert_block的模块(不要编程任何东西,只需启用该模块)。以下是如何设置它。
注意:我知道这个问题是关于“以编程方式将块插入模板或节点”,但即使他们正在寻找像我这样的非程序员解决方案,谷歌也会把人们送到这里。
看看 Drupal 在_block_render_blocks中是如何做到的。该函数的结果被传递给drupal_render。
module_invoke模板文件中的渲染块工作正常,但它不适用于多语言站点。
最近我遇到了同样的问题,我遇到了一个很好的解决方案,它将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