You are here

function user_relationship_implications_user_relationships in User Relationships 5.2

Same name and namespace in other branches
  1. 5 plugins/user_relationship_implications/user_relationship_implications.module \user_relationship_implications_user_relationships()
  2. 6 user_relationship_implications/user_relationship_implications.module \user_relationship_implications_user_relationships()

hook_user_relationships()

File

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

Code

function user_relationship_implications_user_relationships($type, &$relationship, $category = NULL) {
  switch ($type) {
    case 'load':
      if ($category == 'type' && $relationship->rtid) {
        static $loaded_relationship_implications = array();
        if (!is_array($loaded_relationship_implications[$relationship->rtid])) {
          $loaded_relationship_implications[$relationship->rtid] = array();
          $results = db_query("SELECT * FROM {user_relationship_implications} WHERE rtid = %d OR implies_rtid = %d", $relationship->rtid, $relationship->rtid);
          while ($implication = db_fetch_object($results)) {
            $loaded_relationship_implications[$relationship->rtid][] = $implication;
          }
        }
        $relationship->implies = array();
        $relationship->implied_by = array();
        foreach ($loaded_relationship_implications[$relationship->rtid] as $implication) {
          if ($implication->rtid == $relationship->rtid) {
            $relationship->implies[$implication->implies_rtid] = $implication;
          }
          else {
            $relationship->implied_by[$implication->rtid] = $implication;
          }
        }
      }
      break;
    case 'delete':
      if ($category == 'type') {
        if (!$relationship->rtid) {
          break;
        }
        $results = db_query("DELETE FROM {user_relationship_implications} WHERE rtid = %d OR implies_rtid = %d", $relationship->rtid, $relationship->rtid);

        // clean out the implications cache
        static $loaded_relationship_implications;
        unset($loaded_relationship_implications);
      }
      else {
        if ($category != 'type') {
          $current_type = user_relationships_type_load($relationship->rtid);

          // nothing else matters if there aren't implications involved
          $reversed = array_filter($current_type->implies, '_user_relationship_implications_filter_for_reverse');
          if (!$current_type->implied_by && !$reversed) {
            break;
          }

          // load relationships that imply this relationship
          $rids = array_merge(array_keys($current_type->implied_by), array_keys($reversed));
          $relationships = user_relationships_load(array(
            'between' => array(
              $relationship->requester_id,
              $relationship->requestee_id,
            ),
            'rtid' => $rids,
          ), FALSE, 'rtid');
          foreach ($relationships as $rtid => $relationship) {
            $relationship = array_shift($relationship);

            // the relationship being deleted (current_type) is implied by this relationship (only matters if "strict" is set)
            if ($current_type->implied_by[$rtid]->strict || $reversed[$rtid]->strict) {
              user_relationships_delete_relationship($relationship, $current_type->deleted_by, $category);
              drupal_set_message(user_relationships_get_message($category, $relationship));
            }
          }
        }
      }
      break;
    case 'post-save':
      $type = user_relationships_type_load($relationship->rtid);
      if ($type->implies) {

        // 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 all the pre-existing relationships between these two users of the implied relationship type
          $relationships = user_relationships_load(array(
            'between' => array(
              $relationship->requester_id,
              $relationship->requestee_id,
            ),
            'rtid' => $implied->implies_rtid,
          ));

          // if there aren't any, create one with the same approved status as the relationship we're inserting/updateing
          if (sizeof($relationships) == 0) {
            $users = array(
              $relationship->requester_id,
              $relationship->requestee_id,
            );
            if ($implied->reverse) {
              $users = array_reverse($users);
            }
            $implied = user_relationships_type_load($implied->implies_rtid);
            user_relationships_request_relationship($users[0], $users[1], $implied, $relationship->approved);
          }
          else {
            foreach ($relationships as $existing) {
              if ($relationship->approved && !$existing->approved) {

                // approve the relationship
                $approved = $existing;
                $approved->approved = TRUE;
                user_relationships_update_relationship($existing, $approved);

                // set the message informing the user (use requester and requestee from original relationship)
                drupal_set_message(user_relationships_get_message('accepted', $approved));
              }
            }
          }
        }
      }
      break;
  }
}