Убедитесь, что указанная учетная запись является учетной записью пользователя - PullRequest
2 голосов
/ 17 августа 2010

Мне нужна функция для плагина, чтобы проверить, является ли показанная учетная запись учетной записью пользователя или учетной записи другой. Я использую эту функцию для этого:

global $user; $account;
$account = user_load(array('uid' => arg(1)));
if ( $user->uid == $account->uid ) {

} 

Я делаю это внутри модуля, но он не работает. Когда я захожу в свой профиль, я никогда не вижу вывод из функции.

Почему?

Редактировать

Оригинальный контекст этого кода:

function tpzclassified_menu() { 
  global $user; 
  $account = user_load(array('uid' => 1)); 
  $account = user_load(array('uid' => 1)); 

  if ($user->uid == $account1->uid) { 
    $items['user/%user/classifieds'] = array(
      'title' => 'Meine Kleinanzeigen', 
      'type' => MENU_LOCAL_TASK, 
      'page callback' => 'tpzclassified_user_page', 
      'page arguments' => array(1), 
      'access callback' => 'user_view_access', 
      'access arguments' => array(1), 
      'weight' => 4, 
    ); 
  } 

  return $items; 
} 

Ответы [ 2 ]

2 голосов
/ 18 августа 2010

Мне нужна функция для плагина, чтобы проверить, является ли показанная учетная запись учетной записью пользователя или учетной записи другой.

То, что делает указанный код, заключается в проверке, является ли зарегистрированный пользователь суперпользователем Drupal (он же пользователь № 1). Если это то, что вам действительно нужно, то нет необходимости вызывать user_load() для загрузки объекта пользователя этой учетной записи. Вам достаточно использовать следующий код:

global $user; 

if ($user->uid == 1) { 
  $items['user/%user/classifieds'] = array(
    'title' => 'Meine Kleinanzeigen', 
    'type' => MENU_LOCAL_TASK, 
    'page callback' => 'tpzclassified_user_page', 
    'page arguments' => array(1), 
    'access callback' => 'user_view_access', 
    'access arguments' => array(1), 
    'weight' => 4, 
  ); 
} 

return $items; 

В Drupal нет двух пользователей с одинаковым идентификатором пользователя, и 1 - это идентификатор пользователя для суперпользователя Drupal (который также называется user # 1, поскольку его идентификатор равен 1).
Проблема с этим решением состоит в том, что начиная с Drupal 6, обратные вызовы меню кэшируются; условное добавление обратного вызова в меню не имеет никакого эффекта, поскольку кэш меню очищается только при установке нового модуля или при обновлении модуля (и вызывается update.php). Единственный способ заставить Drupal очистить кеш меню - использовать следующий код:

if (!variable_get('menu_rebuild_needed', FALSE)) {
  variable_set('menu_rebuild_needed', TRUE);
}

Если вы хотите проверить, имеет ли текущий вошедший в систему пользователь доступ к своей учетной записи, вы можете использовать следующий код:

function tpzclassified_menu() { 
  $items['user/%user/classifieds'] = array( 
    'title' => 'Meine Kleinanzeigen', 
    'type' => MENU_LOCAL_TASK, 
    'page callback' => 'tpzclassified_user_page', 
    'page arguments' => array(1), 
    'access callback' => 'user_view_access', 
    'access arguments' => array(1), 
    'weight' => 4, 
  );

  return $items;  
} 

Нет смысла использовать пользовательскую функцию, поскольку user_view_access() уже проверяет, ищет ли текущий пользователь свою учетную запись.

function user_view_access($account) {
  return $account && $account->uid &&
    (
      // Always let users view their own profile.
      ($GLOBALS['user']->uid == $account->uid) ||
      // Administrators can view all accounts.
      user_access('administer users') ||
      // The user is not blocked and logged in at least once.
      ($account->access && $account->status && user_access('access user profiles'))
  );
}
1 голос
/ 17 августа 2010

Редактировать

Исходя из вашего комментария, проблема заключается в том, где вы помещаете этот код: hook_menu() вызывается только при перестроении меню: поэтому вы ничего не видите.

Вы не можете условно добавлять элементы в систему меню следующим образом: вы должны зарегистрировать элемент меню, а затем использовать пункт меню access callback, чтобы определить, будет ли меню отображаться для определенного пользователя.access callback работает так же, как page callback, но должно возвращать TRUE или FALSE.Вы можете сделать что-то вроде этого:

function tpzclassified_menu() { 
  $items['user/%user/classifieds'] = array( 
    'title' => 'Meine Kleinanzeigen', 
    'type' => MENU_LOCAL_TASK, 
    'page callback' => 'tpzclassified_user_page', 
    'page arguments' => array(1), 
    'access callback' => 'tpzclassified_user_access', 
    'access arguments' => array(1), 
    'weight' => 4, 
  );

  return $items;  
} 

function tpzclassified_user_access($account) {
  global $user; 

  if ($user->uid == $account->uid) {
    return user_view_access($account);
  }
}
...