public static function updateRoleUsers(AclRole $role)
 {
     $current_users = UserRole::where('role_id', '=', $role->role_id)->lists('user_id');
     $users_to_delete = array_diff($current_users, $role->users->toArray());
     if ($users_to_delete) {
         static::where('role_id', '=', $role->role_id)->whereIn('user_id', $users_to_delete)->delete();
         $default_role_id = static::getDefaultRoleId();
         if ($default_role_id) {
             $users_with_roles = static::whereIn('user_id', $users_to_delete)->get()->lists('user_id');
             $user_without_roles = array_diff($users_to_delete, $users_with_roles);
             foreach ($user_without_roles as $user_id) {
                 UserRole::create(['role_id' => $default_role_id, 'user_id' => $user_id]);
             }
         }
     }
     $users_to_add = array_diff($role->users->toArray(), $current_users);
     if ($users_to_add) {
         foreach ($users_to_add as $user_id) {
             UserRole::create(['role_id' => $role->role_id, 'user_id' => $user_id]);
         }
     }
 }
Exemple #2
0
 public function setRoles(array $roleIds)
 {
     DB::beginTransaction();
     $new_roles = array_diff($roleIds, $this->roles);
     $exist_roles = array_intersect($roleIds, $this->roles);
     $deleted_roles = array_diff($this->roles, $roleIds);
     $new_role_saved = [];
     $roleProviders = AclFacade::getRoleProvidersTypes();
     foreach ($roleProviders as $rp_type) {
         $rp = AclFacade::getRoleProvider($rp_type);
         if ($rp->allowUpdateRole()) {
             $roles_to_delete = $deleted_roles ? $rp->getRoles($deleted_roles)->lists('role_id') : [];
             if ($roles_to_delete) {
                 UserRole::where('user_id', '=', $this->getKey())->whereIn('role_id', $roles_to_delete)->delete();
             }
             $roles = $new_roles ? $rp->getRoles($new_roles) : [];
             foreach ($roles as $role) {
                 $role_id = $role->role_id;
                 UserRole::create(['user_id' => $this->user_id, 'role_id' => $role_id]);
                 $new_role_saved[] = $role_id;
             }
         }
     }
     DB::commit();
     $this->roles = array_merge($exist_roles, $new_role_saved);
     Event::fire('acl_role_updated', array($roleIds));
     $cache_prefix = Config::get('acl::cache_key', '_volicon_acl_');
     Cache::forever($cache_prefix . '_last_role_update', new MicrotimeDate());
 }