如何在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