web-dev-qa-db-ja.com

モジュールから異なる領域を操作する方法

私のモジュールには、hook_theme()を使用してデータをカスタムテンプレートに出力するメニューコールバックがあります。

通常、Drupalは、render($page['content'])を使用してpage.tpl.phpレベルでレンダリングされるコンテンツ領域にこの出力を含めます。

モジュールからのものを同時にpage.tpl.phpの他の領域に出力するにはどうすればよいですか?例えば ​​$page['sidebar_first']または$page['footer']

これは可能ですか?
または、メニューコールバックが呼び出されたときにDrupalにカスタムpage.tpl.phpを使用するように指示するにはどうすればよいですか?

1
Carlos Muñiz

コンテンツを_$page['sidebar_first']_に正確に配置する場合は、 hook_page_build() または hook_page_alter() を実装できます。フック間の違いは、最初のフックが最初に実行されるときに、モジュールがhook_page_build()を使用して別のモジュールによって追加されたいくつかの要素を変更する必要がある場合に使用されることです。

hook_page_build()の例は次の関数です。

_function toolbar_page_build(&$page) {
  $page['page_top']['toolbar'] = array(
    '#pre_render' => array('toolbar_pre_render'), 
    '#access' => user_access('access toolbar'), 
    'toolbar_drawer' => array(),
  );
}
_
_function dashboard_page_build(&$page) {
  global $theme_key;

  if (dashboard_is_visible()) {
    $block_info = array();

    // Create a wrapper for the dashboard itself, then insert each dashboard
    // region into it.
    $page['content']['dashboard'] = array('#theme_wrappers' => array('dashboard'));
    foreach (dashboard_regions() as $region) {
      // Do not show dashboard blocks that are disabled.
      if ($region == 'dashboard_inactive') {
        continue;
      }
      // …
    }
    // …
  }
}
_

別の方法として、モジュールでブロックを定義することもできますが、その場合、ブロックは管理者ユーザー(または適切な権限を持つ任意のユーザー)によって設定されたリージョンに配置され、別のリージョンに配置できます。モジュールが追加するコンテンツを特定のリージョンに配置する理由がない場合は、ブロックを実装することを選択します。

2
kiamlaluno