web-dev-qa-db-ja.com

このコードの何が問題になっていますか?

_function welcome_menu() {
  $item=array();
  $item['welcome'] = array(
    'title' => 'welcome',
    'access callback' => 'welcome_init', 
    'page callback' => 'welcome_test',
    'type' => MENU_CALLBACK,
  ); 

  return $item;
}

/*
 * Implements hook_init().
 */
function welcome_init() {
  if (empty($GLOBALS['user']->uid)&& arg(0)!='welcome') {
    drupal_goto('welcome');
  }
}

function welcome_test() {
  $output = 'welcome';
  return $output;
}
_

匿名ユーザーをログインページに自動リダイレクトし、認証されたユーザーがこのページを表示できないようにしたい。 user_login_block()をページコールバックとして使用するにはどうすればよいですか?

1
enjoylife

アクセスコールバックは、ユーザーがページにアクセスできる場合はTRUE、ページにアクセスできない場合はFALSEのブール値を返す必要があります。ユーザーを他のページにリダイレクトしないでください。

Drupalには、ユーザーが匿名の場合にTRUEを返す関数があります。

function welcome_menu() {
  $items = array();

  $items['welcome'] = array(
    'title' => 'welcome',
    'access callback' => 'user_is_anonymous', 
    'page callback' => 'welcome_test',
    'type' => MENU_CALLBACK,
  ); 

  return $item;
}

コードは、ユーザーモジュールで使用されるものと似ています。

function user_menu() {
  // …

  $items['user/login'] = array(
    'title' => 'Log in', 
    'access callback' => 'user_is_anonymous', 
    'type' => MENU_DEFAULT_LOCAL_TASK,
  );

  // …
  return $items;
}

メニューコールバックを使用してログインブロックを表示するには、関数コードを次のように変更する必要があります。

function welcome_test() {
  return drupal_get_form('user_login_block');
}

hook_init() はキャッシュされたページに対して呼び出されず、Drupalは通常、匿名ユーザーのページをキャッシュします(そうするように設定されている場合)。

1
kiamlaluno

最も明白なことは、Drupalのコーディング標準にまったく準拠していないことです。それは読むのを非常に難しくします。

hook_init()はそれ自身のフックであり、アクセスコールバックとして使用しないでください。アクセスコールバックは、TRUEまたはFALSEのいずれかを返す必要があります。

2
tim.plunkett