36

Drupal 6では、次のコードを使用してテンプレートにブロックを簡単に挿入できました。

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

ただし、Drupal7で同じ手順を使用しても機能しないようです。周りを見回しましたが、新しい方法が見つかりません。

Drupal 7には、プログラムでブロックをテンプレートまたはノードに挿入できるルーチンがありますか?

4

15 に答える 15

86

D7:

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

'module_name' =モジュールのマシン名(つまり、モジュールのフォルダー名)。これはコアモジュールにも当てはまります。たとえば、「検索」、「ユーザー」、「コメント」はすべてここで機能します。

'block_delta' =ブロックのマシン名。ブロック管理ページにアクセスしてブロックを編集することで、これが何であるかを判断できます。たとえば、Webフォームブロックを編集するためのURLは次のようになります。

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

この例では、「webform」はモジュールの名前、「client-block-11」はブロックのデルタです。

カスタムブロックには、「ブロック」というモジュール名とデルタの番号が付けられます。これは、ブロックを編集することでも確認できます。

詳細:http ://drupal.org/node/26502

于 2011-10-20T13:18:48.547 に答える
27

これは、Drupal 7のテンプレートにブロックを挿入するための解決策のようですが、少し不格好なようで、パフォーマンスへの影響についてはわかりません。

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

誰かがより良い手順を持っているなら、追加してください。

于 2011-01-19T17:30:04.760 に答える
21

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;
  ?>
于 2014-03-10T16:12:37.160 に答える
11

私のためのこの仕事:

98はブロックのIDです

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
于 2012-11-27T13:52:18.960 に答える
7

これをdrupal7でテストしたところ、機能します。

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

幸運を!

于 2011-07-19T23:21:28.783 に答える
5

何らかの理由render()で私にはうまくいきませんが、これはうまくいきます:

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
于 2012-05-21T13:46:55.183 に答える
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

于 2012-08-05T20:22:17.787 に答える
3

テンプレートにブロックを含めるための検索で、この投稿に出くわしました。

さらに、(ブロックインターフェイスを介して追加した)カスタムブロックを含める場合は、(block_load();drupal 7ではなく)を使用する必要があります。

$block = block_get_custom_block($bid);
$content = $block['body'];
于 2011-10-29T11:38:51.470 に答える
3

これは私のDrupal7で機能しました。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を参照してください。

于 2013-06-04T06:31:56.270 に答える
3

wrburgessの答えを改善すると、1行でそれを行うことができます...

<?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'))))); ?>
于 2015-01-04T22:43:15.017 に答える
1
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

これは、メニューブロックを印刷する場合に機能します。

于 2014-03-26T09:09:12.737 に答える
1

ブロック「Drupalway」を挿入したい人のためにinsert_blockと呼ばれるモジュールがあります(何もプログラムせず、モジュールを有効にするだけです)。設定方法は次のとおりです

注:この質問は「プログラムでブロックをテンプレートまたはノードに挿入する」ことに関するものですが、Googleは、私のようなプログラマー以外のソリューションを探している人々をここに送ります。

于 2016-01-25T10:13:04.610 に答える
0

Drupalが_block_render_blocksでどのようにそれを行うかを見てください。その関数の結果はdrupal_renderに渡されます。

于 2011-01-19T03:35:04.493 に答える
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

于 2016-02-10T11:12:07.743 に答える
0

module_invokeテンプレートファイルのレンダリングブロックでは正常に機能していますが、多言語サイトでは機能していません。

于 2018-06-08T10:24:34.723 に答える