web-dev-qa-db-ja.com

html.tpl.phpでの領域の印刷

Html.tpl.phpテンプレートの一部の領域を出力する必要があります。これらの領域は、page.tpl.phpとpage-front.tpl.phpの間で変更されないためです(2つだけ挙げてください)。基本的に私はコードの重複を避けたいです。

ただし、html.tpl.phpの領域には何も関連付けられていないようです。drupal_get_region_contentを使用して何も取得できません(パラメーターありとパラメーターなしの両方で、空の配列を返すだけです)。

アイデア?

10
Morpheu5

私はこのように解決しました:

function mytheme_preprocess_html(&$variables) {
    $variables['region_name'] = block_get_blocks_by_region('region_name');
}

そして私はできる

<?php print render($region_name) ?>
18
Morpheu5

drupal_get_region_content()は、以前のdrupal_add_region_content()の呼び出しで設定されたコンテンツを返しますが、ページの block_page_buildを通じてレンダリングされるブロックのコンテンツは含まれません。 ()

Drupalソースコードで「drupal_add_region_content」を検索すると、関数が次のように呼び出されていることがわかります。

  • drupal_get_region_content()
  • install_display_output()
  • template_preprocess_maintenance_page()
  • update_task_list()

管理ページでブロックに設定するのは、ブロックがレンダリングされる領域ですが、そのコンテンツはdrupal_add_region_content()で追加されません。実際、上記の関数(drupal_add_region_content()を呼び出す唯一の関数です。ただし、Drupalインストールをテストするためのコードを除く)は、ブロックコンテンツのレンダリング/追加用ではありません。 。

独自のコードでブロックをレンダリングする必要がある場合は、block_page_build()で使用されているコードを確認する必要があります。特に、これはおそらくあなたにとってより有用なコードです:

  // Fetch a list of regions for the current theme.
  $all_regions = system_region_list($theme);

  $item = menu_get_item();
  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
    // Load all region content assigned via blocks.
    foreach (array_keys($all_regions) as $region) {
      // Assign blocks to region.
      if ($blocks = block_get_blocks_by_region($region)) {
        $page[$region] = $blocks;
      }
    }
    // …
  }

最初の2行は、表示されているページが、テーマ領域が配置されている場所を示すために使用されるデモページではないことを確認します。

別の方法でブロックをレンダリングする必要がある場合は、テーマで theme_block() をオーバーライドするか、または(おそらく)カスタムのblock.tpl.phpテンプレートを作成することに関心がある可能性が高くなります。ファイル。ブロックのレンダリング方法を変更する別の方法は、ブロックに前処理関数を使用することです( hook_preprocess_block() )。

2
kiamlaluno