diff --git a/includes/features.user.inc b/includes/features.user.inc index 11a219a..3efae60 100644 --- a/includes/features.user.inc +++ b/includes/features.user.inc @@ -16,6 +16,7 @@ function user_features_api() { 'feature_source' => TRUE, 'default_hook' => 'user_default_permissions', 'default_file' => FEATURES_DEFAULTS_INCLUDED, + 'duplicates' => FEATURES_DUPLICATES_ALLOWED, ), ); } @@ -64,7 +65,7 @@ function user_permission_features_export_options() { /** * Implements hook_features_export_render(). */ -function user_permission_features_export_render($module, $data) { +function user_permission_features_export_render($module, $data, $export) { $perm_modules = &drupal_static(__FUNCTION__ . '_perm_modules'); if (!isset($perm_modules)) { $perm_modules = user_permission_get_modules(); @@ -75,14 +76,32 @@ function user_permission_features_export_render($module, $data) { $code[] = ''; $permissions = _user_features_get_permissions(); + $roles = array(); + if (isset($export['features']['user_role'])) { + // Use the exported roles only. + $roles = array_keys($export['features']['user_role']); + } + else { + // Get the roles from component "user_role". + $feature_info = features_get_features($module); + $roles = isset($feature_info->info['features']['user_role']) ? $feature_info->info['features']['user_role'] : array(); + $roles = array_combine($roles, $roles); + } foreach ($data as $perm_name) { $permission = array(); $permission['name'] = $perm_name; + if (isset($permissions[$perm_name])) { - sort($permissions[$perm_name]); - $permission['roles'] = $permissions[$perm_name]; + asort($permissions[$perm_name]); $permission['module'] = $perm_modules[$perm_name]; + + $permission['roles'] = array(); + foreach ($roles as $role) { + if (isset($permissions[$perm_name][$role]) && $permissions[$perm_name][$role] == $role) { + $permission['roles'][$role] = $role; + } + } } else { $permission['roles'] = array(); @@ -119,7 +138,9 @@ function user_permission_features_rebuild($module) { $permissions_by_role = _user_features_get_permissions(FALSE); foreach ($defaults as $permission) { $perm = $permission['name']; - foreach ($roles as $role) { + + // Update permissions for roles described by exported permissions. + foreach ($permission['roles'] as $role) { if (in_array($role, $permission['roles'])) { $permissions_by_role[$role][$perm] = TRUE; } @@ -245,7 +266,7 @@ function _user_features_get_permissions($by_role = TRUE) { if ($by_role) { foreach (array_keys(array_filter($role_permissions)) as $permission) { if (isset($map[$permission])) { - $permissions[$permission][] = $roles[$rid]; + $permissions[$permission][$roles[$rid]] = $roles[$rid]; } } } diff --git a/tests/features_test.features.user_permission.inc b/tests/features_test.features.user_permission.inc index a789c2f..ca716d9 100644 --- a/tests/features_test.features.user_permission.inc +++ b/tests/features_test.features.user_permission.inc @@ -10,8 +10,8 @@ function features_test_user_default_permissions() { $permissions['create features_test content'] = array( 'name' => 'create features_test content', 'roles' => array( - '0' => 'anonymous user', - '1' => 'authenticated user', + 'anonymous user' => 'anonymous user', + 'authenticated user' => 'authenticated user', ), 'module' => 'node', );