web-dev-qa-db-ja.com

Drupal 7でノードまたはテンプレートにブロックを挿入する方法?

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

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

ただし、Drupal 7で同じ命令を使用しても動作しないようです。見回したため、新しいメソッドが見つかりません。

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

36
Randy Burgess

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;
  ?>
20
canintex

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'はブロックのデルタです。

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

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

85
kloewer

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

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

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

27
Randy Burgess

私のためのこの仕事:

98はブロックのIDです

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

これをdrupal 7でテストし、動作します:

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

がんばろう!

7
DanyAlejandro

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

5
cafonso

何らかの理由でrender()は機能しませんが、これは機能します:

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

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'))))); ?>
3

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

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

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

これは私の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 で見つけることができます

3
Umesh Patil
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

これは、メニューブロックを印刷するのに役立ちます。

1
MilanG

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

注:この質問は「プログラムによってブロックをテンプレートまたはノードに挿入する」ことについて知っていますが、Googleはプログラマではない人を探している人もここに送ります私のような解決策。

1
Jasom Dotnet

Drupal=が _ block_render_blocks でそれを行う方法をご覧ください。その関数の結果は drupal_render に渡されます。

0
Oswald

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

0
Sohan Jangid

最近、私は同じ問題に直面し、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

0
Prabhat Ranjan