これが私の現在の状況です。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テンプレートファイルを単に定義したいでしょう。誰かがこれを処理するより良い方法をお勧めできますか?
テンプレートファイルを使用するテーマ関数を定義し、テーマ関数を使用してメニューコールバック出力を行うことができます。
以下は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;
}
メニューハンドラーからfalseを返す場合、Drupalは_page.tpl.php
_を呼び出しません。
そう:
_function myapp_oath() {
// Echo your page here
return false;
}
_
テンプレートの定義方法は、使用しているDrupalのバージョンによって多少異なりますが、 hook_theme()
と theme()
開始点として。