解决profile2资料管理的问题

在启用profile2模块的前提下,假设我们给用户角色-“会员”赋予了权限“会员资料: Edit own profile”,这样就是让会员角色拥有了“会员资料”这样一个profile。

以此类推,我们还有用户角色B,拥有“B资料”的profile。 

然后呢,为了让管理员可以管理这两个角色的资料,我们赋予管理员“会员资料: Edit any profile”和“B资料: Edit any profile”的权限。

我们用管理员去编辑一个会员试试,发现不仅会出现会员资料的标签项,还会出现B资料的标签项,也就是说,profile2设置的这个标签项显示逻辑是根据编辑者拥有的权限去控制的,而不管被编辑者是否有这个profile权限。 其实就是它的权限判断逻辑不太准确。

那么我们很明显需要让管理员在编辑某个角色时,只看到这个角色应该有的资料。

我认为这是profile2的一个bug,所以我直接去修改了profile2.module里的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Implements hook_profile2_access().
 */
function profile2_profile2_access($op, $profile = NULL, $account = NULL) {
  // Don't grant access for users to delete their profile.
  if (isset($profile) && ($type_name = $profile->type) && $op != 'delete') {
    $edited_user = user_load($profile->uid); // Steven.jia added,即使编辑者是有edit any profile的权限,也还应该判断被编辑者是否有edit own profile的权限,即这个用户是否有这个profile
    if (user_access("$op any $type_name profile", $account) && user_access("$op own $type_name profile", $edited_user)) { // Steven.jia edited
      return TRUE;
    }
    $account = isset($account) ? $account : $GLOBALS['user'];
    if (isset($profile->uid) && $profile->uid == $account->uid && user_access("$op own $type_name profile", $account)) {
      return TRUE;
    }
  }
  // Do not explicitly deny access so others may still grant access.
}

你可能感兴趣的:(profile2)