Drupal 6では、次のコードを使用してテンプレートにブロックを簡単に挿入できました。
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
ただし、Drupal7で同じ手順を使用しても機能しないようです。周りを見回しましたが、新しい方法が見つかりません。
Drupal 7には、プログラムでブロックをテンプレートまたはノードに挿入できるルーチンがありますか?
Drupal 6では、次のコードを使用してテンプレートにブロックを簡単に挿入できました。
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
ただし、Drupal7で同じ手順を使用しても機能しないようです。周りを見回しましたが、新しい方法が見つかりません。
Drupal 7には、プログラムでブロックをテンプレートまたはノードに挿入できるルーチンがありますか?
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」はブロックのデルタです。
カスタムブロックには、「ブロック」というモジュール名とデルタの番号が付けられます。これは、ブロックを編集することでも確認できます。
これは、Drupal 7のテンプレートにブロックを挿入するための解決策のようですが、少し不格好なようで、パフォーマンスへの影響についてはわかりません。
$block = block_load('views', 'block_name');
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
誰かがより良い手順を持っているなら、追加してください。
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;
?>
私のためのこの仕事:
98はブロックのIDです
$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
これをdrupal7でテストしたところ、機能します。
$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
テンプレートにブロックを含めるための検索で、この投稿に出くわしました。
さらに、(ブロックインターフェイスを介して追加した)カスタムブロックを含める場合は、(block_load();
drupal 7ではなく)を使用する必要があります。
$block = block_get_custom_block($bid);
$content = $block['body'];
これは私の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を参照してください。
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'))))); ?>
$block = module_invoke('menu_block', 'block_view', '6');
echo render ($block['content']);
これは、メニューブロックを印刷する場合に機能します。
ブロック「Drupalway」を挿入したい人のためにinsert_blockと呼ばれるモジュールがあります(何もプログラムせず、モジュールを有効にするだけです)。設定方法は次のとおりです。
注:この質問は「プログラムでブロックをテンプレートまたはノードに挿入する」ことに関するものですが、Googleは、私のようなプログラマー以外のソリューションを探している人々をここに送ります。
Drupalが_block_render_blocksでどのようにそれを行うかを見てください。その関数の結果はdrupal_renderに渡されます。
最近、私は同じ問題に直面し、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
module_invokeテンプレートファイルのレンダリングブロックでは正常に機能していますが、多言語サイトでは機能していません。