web-dev-qa-db-ja.com

node.tpl.phpでブロックを印刷する

誰かがnode.tpl.phpのブロックを印刷する方法を教えてもらえれば幸いです。私は基本的にビューを通じて作成されたブロックを持っていますが、そのブロックの領域を設定していません。これは、このブロックをすべてのノードページの特定の位置に表示するためです。

これは私が私のテーマのテンプレートファイルでしたことです:

function mytheme_preprocess_node(&$vars) {
  $vars['my_block'] = mytheme_block_render('views', 'myblock-block_1');
}

function mytheme_block_render($module, $block_id) {
  $block = block_load($module, $block_id);  
  $block_content = _block_render_blocks(array($block));
  $build = _block_get_renderable_array($block_content);
  $block_rendered = drupal_render($build);
  return $block_rendered;
}

そして、私のnode.tpl.phpファイルでは、次のようにします:

<?php print $my_block; ?>

ただし、これにより、メモリ制限の枯渇エラーが発生します。 mytheme_preprocess_page関数でブロックをレンダリングしてpage.tpl.phpに印刷すると、完全に機能するようになりますが、node.tpl.phpに印刷する必要があります。私も以下を試しました:

function mytheme_block_render($module, $block_id) {
  $block = module_invoke('views', 'block_view', 'myblock-block_1');
  return render($block);
}

それは私に同じメモリ枯渇エラーを与えています。ノード前処理関数でブロックをレンダリングするのは遅すぎますか?ノードではなくページの前処理関数でレンダリングできるのはなぜですか?レンダリングしてnode.tpl.phpにアクセスできる他の前処理関数はありますか?

3
SN_26

module_invoke() は正しいと思います。tplファイルでそれを呼び出すだけです。しかしながら、

使用する

print $block['subject'];

print $block['content'];

の代わりに

print render($block);

また

D6以前:

$block = module_invoke('module_name', 'block', 'view', 'block_delta');
print $block['content'];

D7:

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

参照

さらにヘルプが必要な場合。

7
SGhosh

新規インストールで Views モジュールをインストールするたびに、メモリ制限の問題が発生していました。通常、settings.phpにini_set('memory_limit', '512M')を追加しました。それは私の問題を解決しました。

あなたの場合、ブロックをテンプレートにレンダリングするときになぜこの問題に直面しているのかわかりません。

モジュールレベルから試してみることもできます hook_node_view

function MYMODULE_node_view($node, $view_mode = 'full', $langcode = NULL) {
    if($view_mode == 'full'){
        $block = module_invoke('views', 'block_view', 'myblock-block_1');
        $node->content['my_block'] = array(     
            '#markup' => render($block['content']), 
        );
    }   
}
1
Sithu