You are here

function lti_tool_provider_memberships_alter_member in LTI Tool Provider 7

Alter membership for a member.

Parameters

array $member: An array of data for the member including changed roles and groups.

1 call to lti_tool_provider_memberships_alter_member()
lti_tool_provider_memberships_batch_process_altered_memberships in lti_tool_provider_memberships/lti_tool_provider_memberships.batch.inc
Batch Operation Callback to process altered memberships.

File

lti_tool_provider_memberships/lti_tool_provider_memberships.module, line 1353
lti_tool_provider_memberships hook implementations and support functions.

Code

function lti_tool_provider_memberships_alter_member($member) {
  dpm($member, 'member to alter');

  // Find membership.
  $query = new EntityFieldQuery();
  $result = $query
    ->entityCondition('entity_type', 'lti_tool_provider_memberships')
    ->propertyCondition('lti_tool_provider_memberships_user_id', $member['user_id'], '=')
    ->propertyCondition('lti_tool_provider_memberships_context_id', $_SESSION['lti_tool_provider_context_info']['context_id'], '=')
    ->execute();
  if (empty($result)) {

    // Missing membership.
    drupal_set_message(t('%name\'s membership not found.', array(
      '%name' => $member['user_id'],
    )));
    return;
  }
  $membership = reset(entity_load('lti_tool_provider_memberships', array_keys($result['lti_tool_provider_memberships'])));
  $account = user_load($membership->lti_tool_provider_memberships_uid);
  $existing_roles = $member['existing_roles'];

  // If handling context groups.
  if (module_exists('lti_tool_provider_og') && isset($_SESSION['lti_tool_provider_context_info']['course_entity_type'])) {
    $group_entity = $_SESSION['lti_tool_provider_context_info']['course_entity_type'];
    $group_eid = $_SESSION['lti_tool_provider_context_info']['course_entity_eid'];

    // if roles have changed.
    if (!empty($member['old_roles']) || !empty($member['new_roles'])) {

      // Remove current roles from context group.
      $current_roles = og_get_user_roles($group_entity, $group_eid, $account->uid, FALSE);
      foreach ($current_roles as $rid => $dropped_role) {
        og_role_revoke($group_entity, $group_eid, $account->uid, $rid);
      }
      $current_roles = og_get_user_roles($group_entity, $group_eid, $account->uid, FALSE);

      // Add roles to context group.
      $found_roles = lti_tool_provider_og_search_roles($member['new_roles']);
      foreach ($found_roles as $lti_role => $found_role) {
        og_role_grant($group_entity, $group_eid, $account->uid, $found_role);
      }
    }

    // If handling subgroups
    if (variable_get('lti_tool_provider_memberships_subgroups') && ($selected_subgroup_bundle = variable_get('lti_tool_provider_memberships_subgroup_mapping_bundle')) != 'none:None') {
      list($subgroup_entity, $subgroup_bundle) = explode(':', $selected_subgroup_bundle);

      // if roles have changed.
      if (!empty($member['old_roles']) || !empty($member['new_roles'])) {
        $subgroups = lti_tool_provider_memberships_get_subgroups();

        // Find the subgroup nids that match the member data groups.
        // Get users current groups.
        $users_groups = reset(og_get_entity_groups('user', $account->uid));
        $old_subgroups = array_intersect($subgroups, $users_groups);
        $subgroup_roles = lti_tool_provider_memberships_search_roles($member['new_roles']);
        foreach ($old_subgroups as $old_subgroup) {

          // Remove old roles from subgroups.
          $current_roles = og_get_user_roles($subgroup_entity, $old_subgroup, $account->uid, FALSE);
          foreach ($current_roles as $rid => $dropped_role) {
            og_role_revoke($subgroup_entity, $old_subgroup, $account->uid, $rid);
          }

          // Add new roles to subgroups.
          foreach ($subgroup_roles as $lti_role => $subgroup_role) {
            og_role_grant($subgroup_entity, $old_subgroup, $account->uid, $subgroup_role);
          }
        }
      }

      // Drop user from dropped subgroups.
      foreach ($member['dropped_subgroups'] as $dropped_subgroup) {

        // Find the subgroup that matches the dropped_group.
        $subgroup_eid = lti_tool_provider_memberships_get_subgroup($subgroup_entity, $subgroup_bundle, $dropped_subgroup);
        if ($mid = og_get_membership($subgroup_entity, $subgroup_eid, 'user', $account->uid)) {
          og_membership_delete($mid->id);
        }
      }

      // Add user to added subgroups (creating them as necessary).
      lti_tool_provider_memberships_add_user_to_membership_groups($account->uid, $member['added_subgroups'], $existing_roles);
    }
  }
  if (!empty($old_roles) || !empty($new_roles)) {

    // Update global roles.
    lti_tool_provider_unassign_global_roles_from_user($member['old_roles'], $account->uid);
    lti_tool_provider_assign_global_roles_to_user($member['new_roles'], $account->uid);
  }

  // Update membership as updated.
  $membership->lti_tool_provider_memberships_status = 'Active';
  if (!empty($member['old_roles']) || !empty($member['new_roles'])) {
    $membership->lti_tool_provider_memberships_role = $member['new_roles'];
  }
  $membership->date_updated = REQUEST_TIME;
  lti_tool_provider_memberships_save($membership);
  drupal_set_message(t('%name\'s membership updated.', array(
    '%name' => $membership->lti_tool_provider_memberships_user_id,
  )));
}