web-dev-qa-db-ja.com

MENU_CALLBACKからカスタムテンプレートを読み込む

これが私の現在の状況です。iframeを介してDrupalにロードする外部認証プラットフォームがあります。ユーザーが認証されると、外部アプリケーションはユーザーを次の方法で設定したDrupalエンドポイントにリダイレクトします。

function mymodule_menu() {

    $items['mymodule/oauth'] = array(
        'title' => 'My Module Receiver',
        'page callback' => 'mymodule_oauth',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
        'file' => 'mymodule.pages.inc'
    );

    return $items;
}

そして私のコールバック:

function myapp_oauth() {

    // Does some stuff, authenticates the user, etc

    echo '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<p>Please wait...</p>
<script type="text/javascript">
  // Check if we are in an iframe or not
  if (window.location.href != window.parent.location.href) {
    // Reload the parent page
    window.parent.location.reload();
  } else {
    // Not in an iframe, so go to the home page
    window.location.href = "' . base_path() . '";
  }
</script>
</body>
</html>
';
    exit;

}

これは私にこれを処理する信じられないほどずさんな方法のようです、私はアプリケーションを終了する必要がないことを好むでしょう、そして理想的にはこのページのテーマファイルの代わりにロードするtplテンプレートファイルを単に定義したいでしょう。誰かがこれを処理するより良い方法をお勧めできますか?

3
bhamrick

テンプレートファイルを使用するテーマ関数を定義し、テーマ関数を使用してメニューコールバック出力を行うことができます。
以下はDrupal 7のコード例です。同様のコードをDrupal 6.でも使用できます。

function mymodule_theme() {
  return array(
    'mymodule_oath' => array(
      'variables' => array('id' => NULL), // This is the list of the variables that will be passed to the template file. 
      'template' => 'mymodule_oath', // Change this to the template file name.
    ),
  );
}

function mymodule_oath() {
  // Does some stuff, authenticates the user, etc.

  print theme('mymodule_oath', array('id' => 10));
  return NULL;
}
3
kiamlaluno

メニューハンドラーからfalseを返す場合、Drupalは_page.tpl.php_を呼び出しません。

そう:

_function myapp_oath() {
    // Echo your page here
    return false;
}
_

テンプレートの定義方法は、使用しているDrupalのバージョンによって多少異なりますが、 hook_theme()theme() 開始点として。

1