【问题标题】:How to insert a block into a node or template in Drupal 7?如何在 Drupal 7 中将块插入节点或模板?
【发布时间】:2011-06-11 12:17:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 现在出现了一个与较新版本的 PHP 相关的错误。请参阅下面@canintex 的答案。
  • 不推荐上述做法。详情请见Load a block in template?
  • 上述做法在 2014 年不再推荐。我们在 2011 年没有太多可做的事情。

标签: drupal drupal-theming drupal-7


【解决方案1】:

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' 是块的增量。

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

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

【讨论】:

  • 这对我不起作用。我不得不在 Drupal 7 中使用print $block['content'];
  • 这在节点中对我不起作用。在 Drupal 7 中,我必须使用 print render($block); 作为视图块,使用 print render($block['content']); 作为自定义块。
【解决方案2】:

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

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

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

【讨论】:

  • 这是我确定的解决方案 - 因为这是我找到的包含块标题和上下文链接的唯一方法。谢谢。
  • 此方法将使用正确的模板文件主题化块内容。 Kloewer 的回答会让你得到没有主题的块体。
  • 从 php 5.4 开始,你只能在一个变量上调用 drupal_render... 这意味着你应该让你的 $output 达到 _block_get_renderable_array(),然后打印 drupal_render($output)
  • 这是我需要在 .tpl.php 文件中使用 render() 来获取 #attached js。
【解决方案3】:

根据 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;
  ?>

【讨论】:

  • 感谢您添加此内容。两天前我被这个问题咬了,不确定原因。
  • 谁能告诉我drupal_render()和render()有什么区别,我应该在哪里使用每个函数? Thank you !
  • 效果很好,谢谢@canintex!我建议在打印或设置任何变量之前添加一个条件以确保 $blockObject 存在。
【解决方案4】:

这对我有用:

98是区块的id

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

【讨论】:

  • 渲染你在 admin/structure/block/manage/block/98/configure 创建的块时需要这个
【解决方案5】:

刚刚在 drupal 7 中测试过,它可以工作:

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

祝你好运!

【讨论】:

    【解决方案6】:

    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】:

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

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

      【讨论】:

        【解决方案8】:

        在我搜索在模板中包含一个块时,我遇到了这篇文章。

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

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

        【讨论】:

          【解决方案9】:

          提高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】:

            这适用于我的 Drupal 7 , 网址: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

            【讨论】:

              【解决方案11】:
               $block = module_invoke('menu_block', 'block_view', '6');
               echo render ($block['content']);
              

              这适用于我打印菜单块。

              【讨论】:

                【解决方案12】:

                有一个名为insert_block 的模块供那些想要插入块“Drupal 方式”的人使用(不要编程任何东西,只需启用该模块)。 Here的设置方法。

                注意:我知道这个问题是关于“以编程方式将块插入到模板或节点中”,但即使他们正在寻找像我这样的非程序员解决方案,Google 也会派人到这里。

                【讨论】:

                  【解决方案13】:

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

                  【讨论】:

                    【解决方案14】:

                    最近我遇到了同样的问题,我遇到了一个很好的解决方案,它将 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

                    【讨论】:

                      【解决方案15】:

                      module_invoke 模板文件中的渲染块工作正常,但它不适用于多语言网站。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多