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


10

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

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

アイデア?


drupal_set_region_content()地域コンテンツの設定に使用しましたか?
kiamlaluno

2
そのような機能はありません。たぶんあなたが意味しdrupal_add_region_content()たかもしれませんが、私はそれに意味がありません:私はブロック管理インターフェースを介してリージョンのコンテンツを設定しました。
Morpheu5

1
はい、意味しましたdrupal_add_region_content()
kiamlaluno

回答:


18

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

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

そして私はできる

<?php print render($region_name) ?>

エコーを使用する理由 もちろん動作します。
SDMulroy、2015年

確かに、私がモジュールやパブリックテーマを実装している場合は、コミュニティ標準に従う必要があります。これは、クライアントが独占的に使用していたカスタムテーマです。
Morpheu5

これは非常に古い投稿であることは知っていますが、回答の作成者が遅延して質問に回答する場合、回答を受け入れるのは判断が悪いと思います。たとえば、追加する関数を提供しますが、すべての読者がこのコードの場所を魔法のように知っていると想定します。それは怠惰な部分であり、初心者のdrupalユーザー/開発者には何も提供しないので、私はこれに反対票を投じています。
スキットルズ

私はあなたの意見に感謝します、そして初心者が完全な説明を受けていないかもしれないという事実。ただし、a)スプーンフィーディングは怠惰な初心者を対象とすること、およびb)(怠惰でない初心者が持つべきであるように)ドキュメントをすばやく読んだことのある人にとっては、その機能の配置は比較的明白であることを考慮してください。そうでない場合は、正当な理由でマニュアルがあります。私の質問(および回答)は、Drupalテーマの特定の基本的な知識が想定できるレベルの問題を扱っています。さらに、これはQ&Aサイトであり、ドキュメントサイトが隣にあります。
Morpheu5

1
@Skitties新しいユーザーが質問に示されているような前処理関数が何であるかを知ることができなかったからといって、ここではドキュメントを複製できません。それは問題の一部でもありません。ユーザーが特定の質問処理前処理機能を持っている場合、ユーザーは新しい質問をします。
kiamlaluno

2

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

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())。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.