| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | 
							- <?php
 
- namespace AU\SuggestedFriends;
 
- /*
 
-  * People usort callback
 
-  */
 
- function suggested_friends_sorter($a, $b) {
 
- 	if ($a['priority'] == $b['priority']) {
 
- 		return 0;
 
- 	}
 
- 	return ($a['priority'] < $b['priority']) ? 1 : -1;
 
- }
 
- /**
 
-  *
 
-  * Returns array of people containing entity, mutuals (friends), groups (shared) and priority
 
-  * @param Int $guid
 
-  * @param Int $friends_limit
 
-  * @param Int $groups_limit
 
-  * @return Array
 
-  */
 
- function get_suggestions($guid, $friends_of_friends_limit = 10, $groups_members_limit = 10) {
 
- 	$dbprefix = elgg_get_config('dbprefix');
 
- 	$guid = sanitize_int($guid);
 
- 	$suggestions = array();
 
- 	if ($friends_of_friends_limit) {
 
- 		// get some friends of friends
 
- 		$options = array(
 
- 			'selects' => array(
 
- 				'COUNT(fof.guid_two) as priority'
 
- 			),
 
- 			'type' => 'user',
 
- 			'joins' => array(
 
- 				"JOIN {$dbprefix}users_entity ue ON ue.guid = e.guid",
 
- 				"JOIN {$dbprefix}entity_relationships fr ON fr.guid_one = {$guid} AND fr.relationship = 'friend'",
 
- 				"JOIN {$dbprefix}entity_relationships fof ON fof.guid_one = fr.guid_two AND fof.relationship = 'friend'"
 
- 			),
 
- 			"wheres" => array(
 
- 				"ue.banned = 'no'",
 
- 				"e.guid NOT IN (SELECT f.guid_two FROM {$dbprefix}entity_relationships f WHERE f.guid_one = {$guid} AND f.relationship = 'friend')",
 
- 				"fof.guid_two = e.guid",
 
- 				"e.guid != {$guid}"
 
- 			),
 
- 			'group_by' => 'e.guid',
 
- 			'order_by' => 'priority desc, ue.last_action desc',
 
- 			'limit' => abs((int) $friends_of_friends_limit)
 
- 		);
 
- 		$fof = elgg_get_entities($options);
 
- 		foreach ($fof as $f) {
 
- 			$priority = (int) $f->getVolatileData('select:priority');
 
- 			$suggestions[$f->guid] = array(
 
- 				'entity' => $f,
 
- 				'mutuals' => $priority,
 
- 				'groups' => 0,
 
- 				'priority' => $priority
 
- 			);
 
- 		}
 
- 	}
 
- 	if ($groups_members_limit) {
 
- 		// get some mutual group members
 
- 		$options = array(
 
- 			'selects' => array(
 
- 				'COUNT(mog.guid_two) as priority'
 
- 			),
 
- 			'type' => 'user',
 
- 			'joins' => array(
 
- 				"JOIN {$dbprefix}users_entity ue ON ue.guid = e.guid",
 
- 				"JOIN {$dbprefix}entity_relationships g ON g.guid_one = {$guid} AND g.relationship = 'member'",
 
- 				"JOIN {$dbprefix}groups_entity ge ON ge.guid = g.guid_two", //ensure it's a group
 
- 				"JOIN {$dbprefix}entity_relationships mog ON mog.guid_two = g.guid_two AND mog.relationship = 'member'"
 
- 			),
 
- 			"wheres" => array(
 
- 				"ue.banned = 'no'",
 
- 				"e.guid NOT IN (SELECT f.guid_two FROM {$dbprefix}entity_relationships f WHERE f.guid_one = {$guid} AND f.relationship = 'friend')",
 
- 				"mog.guid_one = e.guid",
 
- 				"e.guid != {$guid}"
 
- 			),
 
- 			'group_by' => 'e.guid',
 
- 			'order_by' => 'priority desc, ue.last_action desc',
 
- 			'limit' => 3 //abs((int) $groups_members_limit)
 
- 		);
 
- 		// get members of groups
 
- 		$mog = elgg_get_entities($options);
 
- 		foreach ($mog as $m) {
 
- 			if (!isset($suggestions[$m->guid])) {
 
- 				$priority = (int) $m->getVolatileData('select:priority');
 
- 				$suggestions[$m->guid] = array(
 
- 					'entity' => $m,
 
- 					'mutuals' => 0,
 
- 					'groups' => $priority,
 
- 					'priority' => $priority
 
- 				);
 
- 			} else {
 
- 				$priority = (int) $m->getVolatileData('select:priority');
 
- 				$suggestions[$m->guid]['groups'] = $priority;
 
- 				$suggestions[$m->guid]['priority'] += $priority;
 
- 			}
 
- 		}
 
- 	}
 
- 	// sort by priority
 
- 	usort($suggestions, __NAMESPACE__ . '\\suggested_friends_sorter');
 
- 	return $suggestions;
 
- }
 
 
  |