/**
  * Takes post data and prepares it for setting the membership on the group.
  * Adds and removes users to group based on a form's userMembershipData
  * @return boolean. True if membership was set successfully.
  */
 public static function setMembershipFromForm($form, $group)
 {
     assert('$group instanceof Group');
     assert('$form instanceof GroupUserMembershipForm');
     $removedUsers = array();
     $addedUsers = array();
     foreach ($group->users as $index => $user) {
         if (empty($form->userMembershipData[$user->id])) {
             $group->users->removeByIndex($index);
             $removedUsers[] = $user;
         }
     }
     $users = GroupUserMembershipFormUtil::makeUsersFromUserMembershipData($form->userMembershipData);
     foreach ($users as $user) {
         if (!$group->users->contains($user)) {
             $group->users->add($user);
             $addedUsers[] = $user;
         }
     }
     $group->save();
     foreach ($removedUsers as $user) {
         ReadPermissionsOptimizationUtil::userRemovedFromGroup($group, $user);
     }
     foreach ($addedUsers as $user) {
         ReadPermissionsOptimizationUtil::userAddedToGroup($group, $user);
     }
     return true;
 }
 /**
  * @param Group $group
  * @param User $user
  */
 public static function userAddedToGroup(Group $group, User $user)
 {
     ReadPermissionsOptimizationUtil::userAddedToGroup($group, $user);
     AllPermissionsOptimizationCache::forgetAll();
 }