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));
}
}
}
}
}
}