web-dev-qa-db-ja.com

hook_menuコールバック内のpage.tplテンプレートを変更します

私はそのようなhook_menuを持っています:

function mymodule_menu() {
    $items['mymodule-test'] = array(
        'page callback' => '_mymodule_test_callback',
        'access callback' => TRUE
    );
    return $items;
}

そしてコールバック関数:

function _mymodule_test_callback()
{
    // processing
    return $html;
}

私はググってみましたが、_mymodule_test_callback関数内にページテンプレートを強制する方法が見つかりません。

編集:なぜURLベースの提案ができない(または快適に感じない)か

URLベースの提案は実装が簡単ですが、私のニーズに完全には適合しません。

使用する必要があるテンプレートは、非常にさまざまな側面に従って、_mymodule_test_callback関数で決定されます。次に例を示します。

  1. タイプ「foo」のノードが存在し、フィールド「abc」の値は「xyx」ですか? =>テンプレート「page-mymodule-foo.tpl.php」を選択します
  2. ノードは存在しますが、フィールド「abc」の値は空ですか? => temlate 'page-mymodule-bar.tpl.php'を選択します
  3. ノードはまったく存在しませんが、ユーザーには「bimbumbam」の役割がありますか? =>テンプレート「page-mymodule-foobarz.tpl.php」を選択します

...等々。

これはまれな動作であり、テンプレートを切り替える代わりにリダイレクトできることは知っていますが、実際には関数本体は大きくないため、この方法を使用することを好みます。

不可能である?

1
Strae

ページコールバックからページテンプレートを直接変更することはできません。ページコールバックからページコンテンツを印刷することで、ページ全体のレンダリングをバイパスできます。または、グローバル変数を使用して、テンプレート提案の追加をトリガーできます hook_preprocess_HOOK 実装。

function _no_template_page_callback() {
  // ... processing ...
  // Print the result, and bypass the page template (so no blocks, no CSS, no JavaScript, etc.). 
  print $html;
}

function _template_suggestions_callback() {
  global $MODULE_page_template_suggestions;  
  // ... processing ...
  // Set flag to trigger usage of our custom page template. 
  $MODULE_suggest_page_template = $suggestions;
  return $html;
}

function MODULE_preprocess_page(&$variables) {
  global $MODULE_page_template_suggestions;
  if (!empty($MODULE_page_template_suggestions)) {
    // Use template suggestions set from _template_suggestions_callback the module.
    foreach ($MODULE_page_template_suggestions as $suggestion) {
      $variables['template_files'][] = $suggestion;
    }
  }
}
1
Pierre Buyle