web-dev-qa-db-ja.com

メニューコールバックにURLパラメータを渡す

「user-login」という新しいパスを作成するためにhook_menu()を実装しました。ページコールバック関数は_$_GET['parameter']_;のようなURLパラメータを受け取ります。ただし、 http://site.com/user-login?parameter=test にアクセスすると、404エラーが発生します。これを機能させるには、hook_menu()をどのように実装すればよいですか?

これは私が使っているコードです

_/**
 * Implementation of hook_menu()
 */
function login_menu() {
  //$items = array();

  $items['user-login'] = array(
    'title' => 'External login',
    'page callback' => 'user_login_callback',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function user_login_callback() {

  // Get the URL params
  $uid = urldecode($_GET['uid']);
  $expiry = urldecode($_GET['expiry']);
  $provided_hash = urldecode($_GET['hash']);  

}
_

ページは次のように呼び出されます http://site.com/user-login?uid=2?expiry=3?hash=sd7wdah

7
Matthew Hui

drupalメニューシステムは$ _GET引数を気にしません。あなたはそれらを使って何でもできます。それはhook_menu()実装には影響しません**。

したがって、エラーは別の場所にあります。 hook_menu()の結果は保存され、すべてのページで呼び出されるわけではありません。その機能で何かを変更/追加した場合、メニューを再構築する必要があります。これを行う最も速い方法は、dvel.moduleの開発リンクブロックでdrushコマンド「drush cc all」または「rebuild menus」を使用することです。ただし、モジュールページを送信することもできます。

**とはいえ、追加のパス引数としてメニューシステムに引数throughを渡す方がはるかに一般的です。パスの後に渡されたものはすべて、引数としてページコールバックに自動的に渡されます。したがって、user-login/2/3/sd7wdahを呼び出すと、これら3つの引数がuser_login_callback(2、3、 'sd7wdah')として関数に渡されます。また、hook_menu():_user-login/%/%/%_で次のようなパスを指定し、'path arguments' => array(1, 2, 3),でパス引数を定義することにより、これらの引数を必須にすることもできます。これにより、関数はこれらの3つの引数でのみ呼び出すことができ、それらはオプションではなくなります。

4
Berdir

わかりやすくするために

http://site.com/user-login?uid=2?expiry=3?hash=sd7wdah

動作しません、それはする必要があります:

http://site.com/user-login?uid=2&expiry=3&hash=sd7wdah

「?」が1つしかないことに注意してください。追加の各パラメータは「&」で区切られます

1
DeeZone