You are here

function user_relationship_implications_user_relationships_save in User Relationships 7

Implements hook_user_relationships_save().

File

user_relationship_implications/user_relationship_implications.module, line 200
Drupal Module: User Relationship Implications

Code

function user_relationship_implications_user_relationships_save($relationship, $action) {
  $type = user_relationships_type_load($relationship->rtid);
  if ($type->implies) {

    // Do not act if it is a pending relationship, as it may still be rejected.
    if ($type->requires_approval && !$relationship->approved) {
      return;
    }

    // If the type of the relationship we're inserting or updating implies other
    // relationship type(s), loop through the implied relationship types and do
    // the right thing.
    foreach ($type->implies as $implied) {

      // Load eventually existing relationships of that type.
      // Uses explicit requestee and requester id to account for one way
      // relationships.
      $relationships = user_relationships_load(array(
        'requestee_id' => $implied->reverse ? $relationship->requester_id : $relationship->requestee_id,
        'requester_id' => $implied->reverse ? $relationship->requestee_id : $relationship->requester_id,
        'rtid' => $implied->implies_rtid,
      ));

      // If there aren't any, create one with the same approved status as the
      // relationship we're inserting/updating.
      if (count($relationships) == 0) {

        // Dimensions are [rtid][requester uid][requestee uid].
        global $_user_relationship_implications_created_implications;
        if (!$_user_relationship_implications_created_implications) {
          $_user_relationship_implications_created_implications = array();
        }
        $users = array(
          $relationship->requester_id,
          $relationship->requestee_id,
        );
        if ($implied->reverse) {
          $users = array_reverse($users);
        }
        $implied = user_relationships_type_load($implied->implies_rtid);

        // Infinite loop prevention.
        if (isset($_user_relationship_implications_created_implications[$implied->rtid][$users[0]][$users[1]])) {
          return;
        }
        user_relationships_request_relationship($users[0], $users[1], $implied, $relationship->approved);

        // Remember relationships just added to skip in case they have
        // implications, and this function recurses.
        $_user_relationship_implications_created_implications[$implied->rtid][$users[0]][$users[1]] = TRUE;
        if (!$implied->is_oneway) {

          // Store the other direction, as it has been added as well.
          $_user_relationship_implications_created_implications[$implied->rtid][$users[1]][$users[0]] = TRUE;
        }
      }
      else {
        foreach ($relationships as $existing) {
          if ($relationship->approved && !$existing->approved) {

            // Approve the relationship.
            $existing->approved = TRUE;
            user_relationships_save_relationship($existing, 'request');

            // Set the message informing the user (use requester and requestee
            // from original relationship).
            drupal_set_message(user_relationships_get_message('accepted', $existing));
          }
        }
      }
    }
  }
}