检查显示的帐户是否为用户帐户

时间:2010-08-17 18:56:12

标签: drupal drupal-6 drupal-modules

如果显示的帐户是用户的帐户或来自另一个帐户,我需要一个插件检查功能。我正在使用此功能:

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 个答案:

答案 0 :(得分:2)

  

如果显示的帐户是用户的帐户或来自其他帐户的帐户,我需要一个插件检查功能。

报告的代码所做的是验证登录用户是否是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中,没有两个用户具有相同的用户ID,1是Drupal超级用户的用户ID(其用户ID为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 :(得分:1)

修改

根据您的评论,问题出在您放置此代码的位置:hook_menu()仅在重建菜单时调用:这就是您没有看到任何事情发生的原因。

您不能有条件地将菜单系统添加到菜单系统中:您必须注册一个菜单项,然后使用菜单项access callback来确定该菜​​单是否会显示给特定用户。 access callbackpage callback的工作方式类似,但必须返回TRUEFALSE。你可能会做这样的事情:

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);
  }
}