'. t('This module allows you to create relationship types that users can use to connect to each other.') .'
'; return $output; case 'admin/user/relationships': $output = ''. t('This page lets you setup user relationship types.') .'
'; return $output; } } /** * Perm */ function user_relationships_perm() { return array( 'administer user relationships', 'maintain relationships', 'view user relationships', 'can have relationship', ); } /** * Menu */ function user_relationships_menu($may_cache) { $items = array(); if ($may_cache) { $items[] = array( 'path' => 'admin/user/relationships', 'title' => t('Relationships'), 'description' => t('Create relationship types'), 'access' => user_access('administer user relationships'), 'callback' => 'user_relationships_types_list_page', ); $items[] = array( 'path' => 'admin/user/relationships/list', 'title' => t('List'), 'callback' => 'user_relationships_types_list_page', 'access' => user_access('administer user relationships'), 'type' => MENU_DEFAULT_LOCAL_TASK, ); $items[] = array( 'path' => 'admin/user/relationships/add', 'title' => t('Add type'), 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_type_edit'), 'access' => user_access('administer user relationships'), 'type' => MENU_LOCAL_TASK, 'weight' => 1, ); $items[] = array( 'path' => 'admin/user/relationships/edit', 'title' => t('Edit type'), 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_type_edit'), 'access' => user_access('administer user relationships'), 'type' => MENU_CALLBACK, ); $items[] = array( 'path' => 'admin/user/relationships/delete', 'title' => t('Delete type'), 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_type_delete'), 'access' => user_access('administer user relationships'), 'type' => MENU_CALLBACK, ); $items[] = array( 'path' => 'admin/user/relationships/settings', 'title' => t('Settings'), 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_settings'), 'access' => user_access('administer user relationships'), 'type' => MENU_LOCAL_TASK, 'weight' => 2, ); $items[] = array( 'path' => 'relationship_types/autocomplete', 'title' => t('User Relationships Autocomplete'), 'callback' => '_user_relationships_autocomplete_types', 'access' => user_access('administer user relationships'), 'type' => MENU_CALLBACK ); } else { global $user; $id = is_numeric(arg(1)) ? arg(1) : $user->uid; $edit_access = ($id == $user->uid && user_access('maintain relationships')) || user_access('administer users'); $items[] = array( 'path' => 'relationships', 'title' => t('My relationships'), 'access' => ($id && user_access('maintain relationships')), 'callback' => 'theme', 'callback arguments' => array('user_relationships_page'), ); $items[] = array( 'path' => "relationship/request", 'title' => t('Create a relationship'), 'access' => $edit_access, 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_request', arg(2)), 'type' => MENU_CALLBACK, ); $items[] = array( 'path' => "relationship/{$id}/remove", 'title' => t('Remove relationship'), 'access' => $edit_access, 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_remove', $id, arg(3)), 'type' => MENU_CALLBACK, ); if (true || ($approval_required && $edit_access)) { $items[] = array( 'path' => "relationships/{$id}/requests", 'title' => t('Pending requests'), 'access' => $edit_access, 'callback' => 'theme', 'type' => MENU_LOCAL_TASK, 'weight' => 0, 'callback arguments' => array('user_relationships_pending_requests_page', $id) ); } // 'view only' tabs $view_access = (($id == $user->uid && user_access('maintain relationships')) || user_access('view user relationships')); $items[] = array( 'path' => "relationships/{$id}", 'title' => t('Relationships'), 'access' => ($view_access && $id), ); $items[] = array( 'path' => "relationships/{$id}/list", 'title' => t('All'), 'access' => $view_access, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1, 'callback' => 'theme', 'callback arguments' => array('user_relationships_page', $id), ); // operations // arg(3) should be one of "approve" "disapprove" or "cancel" $items[] = array( 'path' => "relationships/{$id}/requested", 'title' => t('Approve Relationship'), 'access' => $edit_access, 'type' => MENU_CALLBACK, 'callback' => 'drupal_get_form', 'callback arguments' => array('user_relationships_pending_requested', arg(3), $id, arg(4)), ); $relationships = user_relationships_relationship_types_load(); foreach ($relationships as $relationship) { $items[] = array( 'path' => "relationships/{$id}/{$relationship->rtid}", 'title' => t($relationship->name), 'access' => $view_access, 'type' => MENU_LOCAL_TASK, 'callback' => 'theme', 'callback arguments' => array('user_relationships_page', $id, $relationship), ); } } return $items; } /** * User */ function user_relationships_user($type, &$edit, &$account, $category = NULL) { switch($type) { case 'login': if (user_access('maintain relationships')) { _user_relationships_set_notifications($account); } break; case 'view': global $user; $viewer = user_load(array('uid' => $user->uid)); if (($account->uid == $user->uid) && user_access('maintain relationships')) { _user_relationships_set_notifications($account); } $output = array(); if ($viewer != $account && $list = _user_relationships_between($viewer, $account)) { $output[] = array( 'title' => t('Your relationships to this user'), 'value' => theme('item_list', $list), 'class' => 'user_relationships' ); } if ($actions = _user_relationships_actions_between($viewer, $account)) { $output[] = array( 'title' => t('Relationship actions'), 'value' => theme('item_list', $actions), 'class' => 'user_relationships_actions' ); } if(sizeof($output)) { return array(t('Relationships') => $output); } break; case 'delete': db_query("DELETE FROM {user_relationships} WHERE requester_id = %d OR requestee_id = %d", $account->uid, $account->uid); cache_clear_all("user_relationships", 'cache_user_relationships', TRUE); break; case 'form': if (($category == 'account') && variable_get('user_relationships_require_approval', TRUE) && user_access('maintain relationships', $account) ) { $form['user_relationships_settings'] = array( '#type' => 'fieldset', '#title' => t('Relationship settings'), '#weight' => 5 ); if (variable_get('user_relationships_allow_auto_approve', FALSE) && ($relationships = user_relationships_relationship_types_load())) { $options = array(); foreach ($relationships as $relationship) { if ($relationship->requires_approval) { $options[$relationship->rtid] = $relationship->name; } } $form['user_relationships_settings']['user_relationships_auto_approve'] = array( '#type' => 'checkboxes', '#title' => t('Automatically approve the following relationship requests'), '#options' => $options, '#default_value' => $edit['user_relationships_auto_approve'], '#description' => t("Check off the types of relationships you'd like to automatically approve.") ); } } // No options have been set so don't display it if (sizeof($form['user_relationships_settings']) == 3) { unset($form['user_relationships_settings']); } return $form; } } /** * Cron */ function user_relationships_cron() { $now = time(); // only expire relationships once a day $last_cron = variable_get('user_relationships_last_expire', 0); if ($now > $last_cron + (24 * 60 * 60)) { return FALSE; } switch ($GLOBALS['db_type']) { case 'mysql': case 'mysqli': db_query( " DELETE ur FROM user_relationships ur, user_relationship_types urt WHERE ur.approved = 0 AND ur.rtid = urt.rtid AND urt.expires_val > 0 AND NOW() > DATE_ADD(ur.updated_at, INTERVAL urt.expires_val DAY)" ); break; } // remember when we last expired relationships variable_set('user_relationships_last_expire', $now); return TRUE; } /** * Implementation for hook_block */ define('USER_PAGES', '_USER_PAGES_'); function user_relationships_block($op = 'list', $delta = 0, $edit = array()) { $all_types = 'ALL'; if (0 != strcmp($op, 'list')) { $block_rtype = explode('|', $delta); $block = $block_rtype[0]; // 'MY' or 'USER' $rtype = $block_rtype[1]; // valid rtid or $all_types } $which_rels_options = array( 1 => 'Newest', 2 => 'Oldest', 3 => 'Random', ); $default_option = 1; switch ($op) { case 'list': // return list of all blocks defined by the module $relationships = user_relationships_relationship_types_load(); $block = array(); foreach ($relationships as $relationship) { $block["MY|{$relationship->rtid}"]['info'] = t( 'My Relationships: @type', array('@type' => drupal_ucfirst($relationship->plural_name)) ); $block["USER|{$relationship->rtid}"]['info'] = t( 'User Relationships: @type', array('@type' => drupal_ucfirst($relationship->plural_name)) ); } $block["MY|{$all_types}"]['info'] = t('My Relationships: All relationships'); $block["USER|{$all_types}"]['info'] = t('User Relationships: All relationships'); return $block; break; case 'configure': $form = array(); if ($block == 'MY') { $block_desc = t('NOTE: This block displays relationships of the user who is currently logged in.'); } else { $block_desc = t('NOTE: This block displays the relationships of the user whose node is being viewed.'); $page_types = array(); $node_types = node_get_types(); foreach ($node_types as $ntype) { $page_types[$ntype->type] = $ntype->name; } asort($page_types); $page_types[USER_PAGES] = t('user pages (/user/