/** * Search based on current config * @param $query * @param array $rules * @return array */ public function searchFriend($query, $rules = array()) { $config = CFactory::getConfig(); $my = CFactory::getUser(); $nameField = $config->getString('displayname'); $data = array(); $myFriends = $my->getFriendIds(); $allowSelf = true; // to allow the own user in the list /* * type of rules, * public = friends only and whoever is in the id * private = only those who is in the id array */ if (count($rules) > 1) { switch ($rules['case']) { case 'all-friends': //return everyone, full list // do nothing since everyone returned is in full list $myFriends = $my->getFriendIds(); break; case 'private-message-tag': // only return active participant in the conversation $msgModel = CFactory::getModel('inbox'); $membersIds = $msgModel->getParticipantsID($rules['message_id'], $my->id); $myFriends = $membersIds; break; case 'video-comment-tag': //this is a video and we should return a list of user who has been tagged in the video $tagModel = CFactory::getModel('videotagging'); $taggedList = $tagModel->getTaggedList($rules['video_id']); $membersIds = array(); foreach ($taggedList as $member) { $membersIds[] = $member->userid; } //for commentors $members = CWallLibrary::getWallUser($rules['video_id'], 'videos'); $membersIds = array_merge($membersIds, array_map('current', $members)); //we merge people who has been tagged in the video, commented and friends $myFriends = array_merge($myFriends, $membersIds); break; case 'photo-comment-tag': $tagModel = CFactory::getModel('phototagging'); $taggedList = $tagModel->getTaggedList($rules['photo_id']); $membersIds = array(); foreach ($taggedList as $member) { $membersIds[] = $member->userid; } // this is a photo comment tagging rules, not the photo tagging rules, so, include user who has been tagged in photo and whoever commented $members = CWallLibrary::getWallUser($rules['photo_id'], 'photos'); $membersIds = array_merge($membersIds, array_map('current', $members)); //in this case, we merge people who has been tagged in the photo, commented and friends $myFriends = array_merge($myFriends, $membersIds); break; case 'photo-tag': $tagModel = CFactory::getModel('phototagging'); $taggedList = $tagModel->getTaggedList($rules['photo_id']); $membersIds = array(); foreach ($taggedList as $member) { $membersIds[] = $member->userid; } //in this case, we remove all the member id who already been tagged $myFriends[] = $my->id; $myFriends = array_diff(array_unique($myFriends), $membersIds); break; case 'public-comment': //we can get the poster as well $table = JTable::getInstance('Activity', 'CTable'); $table->load($rules['activity_id']); $wall = CWallLibrary::getWallUser($rules['activity_id']); $memberIds = array_map('current', $wall); $memberIds[] = $table->actor; //in comment, only my friends or those who have commented can be tagged $myFriends = array_unique(array_merge($memberIds, $myFriends)); $allowSelf = false; break; case 'group': $groupModel = CFactory::getModel('groups'); $approvedMembers = $groupModel->getMembers($rules['group_id'], 0, true, false, true); $membersIds = array(); foreach ($approvedMembers as $member) { $membersIds[] = $member->id; } //now, we need to know if this group is private or not $group = JTable::getInstance('Group', 'CTable'); $group->load($rules['group_id']); if ($group->approvals) { // can only tag members $myFriends = $membersIds; } else { // can tag friends and members of the group $myFriends = array_unique(array_merge($membersIds, $myFriends)); } $allowSelf = false; break; case 'discussion': //group discussion // Load models $discussion = JTable::getInstance('Discussion', 'CTable'); $discussion->load($rules['discussion_id']); $groupModel = CFactory::getModel('groups'); $approvedMembers = $groupModel->getMembers($discussion->groupid, 0, true, false, true); $membersIds = array(); foreach ($approvedMembers as $member) { $membersIds[] = $member->id; } //now, we need to know if this group is private or not $group = JTable::getInstance('Group', 'CTable'); $group->load($discussion->groupid); if ($group->approvals) { // can only tag members $myFriends = $membersIds; } else { // can tag friends and members of the group $myFriends = array_unique(array_merge($membersIds, $myFriends)); } $allowSelf = false; break; case 'event': $event = JTable::getInstance('Event', 'CTable'); $event->load($rules['event_id']); $eventMembers = $event->getMembers(COMMUNITY_EVENT_STATUS_ATTEND, 0, CC_RANDOMIZE); $membersIds = array(); foreach ($eventMembers as $member) { $membersIds[] = $member->id; } if ($event->permission == 1) { // can only tag members $myFriends = $membersIds; } else { $myFriends = array_unique(array_merge($membersIds, $myFriends)); } $allowSelf = false; break; case 'album': //able to tag any friends. //for commentors $membersIds = array(); $members = CWallLibrary::getWallUser($rules['album_id'], 'albums'); $membersIds = array_merge($membersIds, array_map('current', $members)); //we merge people who has been tagged in the video, commented and friends $myFriends = array_merge($myFriends, $membersIds); break; } } if (isset($rules['case']) && $rules['case'] != '') { //we always make sure that we load our own friends only. $result = array(); $friends = array_merge($my->getFriendIds(), array($my->id), $myFriends); // add our own id in the list as well if (!$allowSelf) { //remove self tagging if needed $friends = array_diff($friends, array($my->id)); } $friends = array_unique($friends); foreach ($friends as $friend) { $usr = CFactory::getUser($friend); if (!$usr->isBlocked()) { $result[] = $usr; } } } return $result; }