web-dev-qa-db-ja.com

独自の実装でメニュー項目をオーバーライドするにはどうすればよいですか?

私の具体的な使用例は次のとおりです。ユーザーがユーザー/%user /編集メニューにアクセスすることを望みません。これはDrupalにかなり埋め込まれているため、扱いにくいです。忘れられたパスワードシステム。 drupal管理者用のフォームが必要ですが、エンドユーザー用に別のフォームが必要です。特定のユーザーフィールドを公開したくないため、また、必要な更新が必要になる場合があるためです。外部データベースで処理されるため、Drupalで変更することは役に立ちません。

hook_form_alter()を使用しても、実際にそれをカットするわけではありません。実際には、まったく異なる形式である必要があります。

自分のモジュールを使用して、user /%user/editパスをオーバーライドすることを計画していました。次に、アクセスしているユーザーが管理者であるかどうかを確認し、管理者である場合はストックフォームを提示しますが、そうでない場合はdrupal_goto('client/updates');になりますが、これは機能しません。モジュールのページコールバックが呼び出されません。

4
artfulrobot

hook_menu_alter() を使用して、そのページのリクエストを独自のモジュールの関数に転送できます。

function MYMODULE_menu_alter(&$items) {
  $items['user/%user/edit']['access callback'] = 'MYMODULE_access_callback';
  $items['user/%user/edit']['page callback'] = 'MYMODULE_user_edit_page_callback';
}

function MYMODULE_access_callback($account) {
  if ($something) {
    return FALSE;
  }

  return TRUE;
}

function MYMODULE_user_edit_page_callback($account) {
  if ($something) {
    return drupal_get_form('some_form');
  }
  else {
    return drupal_get_form('some_other_form');
  }
}
5
Clive