function user_relationship_implications_user_relationships in User Relationships 5.2
Same name and namespace in other branches
- 5 plugins/user_relationship_implications/user_relationship_implications.module \user_relationship_implications_user_relationships()
- 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;
}
}