6 ORDER BY id ASC'; $result = Database::query($sql); $friend_relation_list = []; while ($row = Database::fetch_array($result, 'ASSOC')) { $friend_relation_list[] = $row; } $count_list = count($friend_relation_list); if ($count_list == 0) { $friend_relation_list[] = get_lang('Unknown'); } else { return $friend_relation_list; } } /** * Get the kind of relation between contacts. * * @param int user id * @param int user friend id * @param string * * @return int * * @author isaac flores paz */ public static function get_relation_between_contacts($user_id, $user_friend) { $table = Database::get_main_table(TABLE_MAIN_USER_FRIEND_RELATION_TYPE); $userRelUserTable = Database::get_main_table(TABLE_MAIN_USER_REL_USER); $sql = 'SELECT rt.id as id FROM '.$table.' rt WHERE rt.id = ( SELECT uf.relation_type FROM '.$userRelUserTable.' uf WHERE user_id='.((int) $user_id).' AND friend_user_id='.((int) $user_friend).' AND uf.relation_type <> '.USER_RELATION_TYPE_RRHH.' LIMIT 1 )'; $res = Database::query($sql); if (Database::num_rows($res) > 0) { $row = Database::fetch_array($res, 'ASSOC'); return $row['id']; } else { return USER_UNKNOWN; } } /** * Get count of friends from user. * * @param int $userId * * @return int */ public static function getCountFriends($userId) { $table = Database::get_main_table(TABLE_MAIN_USER_REL_USER); $userId = (int) $userId; if (empty($userId)) { return 0; } $sql = 'SELECT count(friend_user_id) count FROM '.$table.' WHERE relation_type NOT IN ('.USER_RELATION_TYPE_DELETED.', '.USER_RELATION_TYPE_RRHH.') AND friend_user_id<>'.$userId.' AND user_id='.$userId; $res = Database::query($sql); if (Database::num_rows($res)) { $row = Database::fetch_array($res, 'ASSOC'); return (int) $row['count']; } return 0; } /** * Gets friends id list. * * @param int user id * @param int group id * @param string name to search * @param bool true will load firstname, lastname, and image name * * @return array * * @author Julio Montoya Cleaning code, function renamed, $load_extra_info option added * @author isaac flores paz */ public static function get_friends( $user_id, $id_group = null, $search_name = null, $load_extra_info = true ) { $user_id = (int) $user_id; $tbl_my_friend = Database::get_main_table(TABLE_MAIN_USER_REL_USER); $tbl_my_user = Database::get_main_table(TABLE_MAIN_USER); $sql = 'SELECT friend_user_id FROM '.$tbl_my_friend.' WHERE relation_type NOT IN ('.USER_RELATION_TYPE_DELETED.', '.USER_RELATION_TYPE_RRHH.') AND friend_user_id<>'.$user_id.' AND user_id='.$user_id; if (isset($id_group) && $id_group > 0) { $sql .= ' AND relation_type='.$id_group; } if (isset($search_name)) { $search_name = trim($search_name); $search_name = str_replace(' ', '', $search_name); $sql .= ' AND friend_user_id IN ( SELECT user_id FROM '.$tbl_my_user.' WHERE firstName LIKE "%'.Database::escape_string($search_name).'%" OR lastName LIKE "%'.Database::escape_string($search_name).'%" OR '.(api_is_western_name_order() ? 'concat(firstName, lastName)' : 'concat(lastName, firstName)').' LIKE concat("%","'.Database::escape_string($search_name).'","%") ) '; } $res = Database::query($sql); $list = []; while ($row = Database::fetch_array($res, 'ASSOC')) { if ($load_extra_info) { $userInfo = api_get_user_info($row['friend_user_id']); $list[] = [ 'friend_user_id' => $row['friend_user_id'], 'firstName' => $userInfo['firstName'], 'lastName' => $userInfo['lastName'], 'username' => $userInfo['username'], 'image' => $userInfo['avatar'], 'user_info' => $userInfo, ]; } else { $list[] = $row; } } return $list; } /** * get web path of user invitate. * * @author isaac flores paz * @author Julio Montoya setting variable array * * @param int user id * * @return array */ public static function get_list_web_path_user_invitation_by_user_id($user_id) { $list_ids = self::get_list_invitation_of_friends_by_user_id($user_id); $list = []; foreach ($list_ids as $values_ids) { $list[] = UserManager::get_user_picture_path_by_id( $values_ids['user_sender_id'], 'web' ); } return $list; } /** * Sends an invitation to contacts. * * @param int user id * @param int user friend id * @param string title of the message * @param string content of the message * * @return bool * * @author isaac flores paz * @author Julio Montoya Cleaning code */ public static function send_invitation_friend( $user_id, $friend_id, $message_title, $message_content ) { $tbl_message = Database::get_main_table(TABLE_MESSAGE); $user_id = (int) $user_id; $friend_id = (int) $friend_id; //Just in case we replace the and \n and \n\r while saving in the DB $message_content = str_replace(["\n", "\n\r"], '
', $message_content); $clean_message_content = Database::escape_string($message_content); $now = api_get_utc_datetime(); $sql = 'SELECT COUNT(*) AS count FROM '.$tbl_message.' WHERE user_sender_id='.$user_id.' AND user_receiver_id='.$friend_id.' AND msg_status IN('.MESSAGE_STATUS_INVITATION_PENDING.', '.MESSAGE_STATUS_INVITATION_ACCEPTED.', '.MESSAGE_STATUS_INVITATION_DENIED.'); '; $res_exist = Database::query($sql); $row_exist = Database::fetch_array($res_exist, 'ASSOC'); if ($row_exist['count'] == 0) { $params = [ 'user_sender_id' => $user_id, 'user_receiver_id' => $friend_id, 'msg_status' => MESSAGE_STATUS_INVITATION_PENDING, 'send_date' => $now, 'title' => $message_title, 'content' => $message_content, 'group_id' => 0, 'parent_id' => 0, 'update_date' => $now, ]; $messageId = Database::insert($tbl_message, $params); $senderInfo = api_get_user_info($user_id); $notification = new Notification(); $notification->saveNotification( $messageId, Notification::NOTIFICATION_TYPE_INVITATION, [$friend_id], $message_title, $message_content, $senderInfo ); return true; } else { // invitation already exist $sql = 'SELECT COUNT(*) AS count, id FROM '.$tbl_message.' WHERE user_sender_id='.$user_id.' AND user_receiver_id='.$friend_id.' AND msg_status = 7'; $res_if_exist = Database::query($sql); $row_if_exist = Database::fetch_array($res_if_exist, 'ASSOC'); if ($row_if_exist['count'] == 1) { $sql = 'UPDATE '.$tbl_message.' SET msg_status = 5, content = "'.$clean_message_content.'" WHERE user_sender_id='.$user_id.' AND user_receiver_id='.$friend_id.' AND msg_status = 7 '; Database::query($sql); return true; } else { return false; } } } /** * Get number messages of the inbox. * * @author isaac flores paz * * @param int $userId user receiver id * * @return int */ public static function get_message_number_invitation_by_user_id($userId) { $table = Database::get_main_table(TABLE_MESSAGE); $userId = (int) $userId; $sql = 'SELECT COUNT(*) as count_message_in_box FROM '.$table.' WHERE user_receiver_id='.$userId.' AND msg_status = '.MESSAGE_STATUS_INVITATION_PENDING; $res = Database::query($sql); $row = Database::fetch_array($res, 'ASSOC'); if ($row) { return (int) $row['count_message_in_box']; } return 0; } /** * Get number of messages sent to other users. * * @param int $userId * * @return int */ public static function getCountMessagesSent($userId) { $userId = (int) $userId; $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'SELECT COUNT(*) FROM '.$table.' WHERE user_sender_id='.$userId.' AND msg_status < 5'; $res = Database::query($sql); $row = Database::fetch_row($res); return $row[0]; } /** * Get number of messages received from other users. * * @param int $receiver_id * * @return int */ public static function getCountMessagesReceived($receiver_id) { $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'SELECT COUNT(*) FROM '.$table.' WHERE user_receiver_id='.intval($receiver_id).' AND msg_status < 4'; $res = Database::query($sql); $row = Database::fetch_row($res); return $row[0]; } /** * Get number of messages posted on own wall. * * @param int $userId * * @return int */ public static function getCountWallPostedMessages($userId) { $userId = (int) $userId; if (empty($userId)) { return 0; } $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'SELECT COUNT(*) FROM '.$table.' WHERE user_sender_id='.$userId.' AND (msg_status = '.MESSAGE_STATUS_WALL.' OR msg_status = '.MESSAGE_STATUS_WALL_POST.') AND parent_id = 0'; $res = Database::query($sql); $row = Database::fetch_row($res); return $row[0]; } /** * Get invitation list received by user. * * @author isaac flores paz * * @param int $userId * @param int $limit * * @return array */ public static function get_list_invitation_of_friends_by_user_id($userId, $limit = 0) { $userId = (int) $userId; $limit = (int) $limit; if (empty($userId)) { return []; } $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'SELECT user_sender_id, send_date, title, content FROM '.$table.' WHERE user_receiver_id = '.$userId.' AND msg_status = '.MESSAGE_STATUS_INVITATION_PENDING; if ($limit != null && $limit > 0) { $sql .= ' LIMIT '.$limit; } $res = Database::query($sql); $list = []; while ($row = Database::fetch_array($res, 'ASSOC')) { $list[] = $row; } return $list; } /** * Get invitation list sent by user. * * @author Julio Montoya * * @param int $userId * * @return array */ public static function get_list_invitation_sent_by_user_id($userId) { $userId = (int) $userId; if (empty($userId)) { return []; } $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'SELECT user_receiver_id, send_date,title,content FROM '.$table.' WHERE user_sender_id = '.$userId.' AND msg_status = '.MESSAGE_STATUS_INVITATION_PENDING; $res = Database::query($sql); $list = []; while ($row = Database::fetch_array($res, 'ASSOC')) { $list[$row['user_receiver_id']] = $row; } return $list; } /** * Get count invitation sent by user. * * @author Julio Montoya * * @param int $userId * * @return int */ public static function getCountInvitationSent($userId) { $userId = (int) $userId; if (empty($userId)) { return 0; } $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'SELECT count(user_receiver_id) count FROM '.$table.' WHERE user_sender_id = '.$userId.' AND msg_status = '.MESSAGE_STATUS_INVITATION_PENDING; $res = Database::query($sql); if (Database::num_rows($res)) { $row = Database::fetch_array($res, 'ASSOC'); return (int) $row['count']; } return 0; } /** * Accepts invitation. * * @param int $user_send_id * @param int $user_receiver_id * * @return bool * * @author isaac flores paz * @author Julio Montoya Cleaning code */ public static function invitation_accepted($user_send_id, $user_receiver_id) { if (empty($user_send_id) || empty($user_receiver_id)) { return false; } $table = Database::get_main_table(TABLE_MESSAGE); $sql = "UPDATE $table SET msg_status = ".MESSAGE_STATUS_INVITATION_ACCEPTED." WHERE user_sender_id = ".((int) $user_send_id)." AND user_receiver_id=".((int) $user_receiver_id)." AND msg_status = ".MESSAGE_STATUS_INVITATION_PENDING; Database::query($sql); return true; } /** * Denies invitation. * * @param int user sender id * @param int user receiver id * * @return bool * * @author isaac flores paz * @author Julio Montoya Cleaning code */ public static function invitation_denied($user_send_id, $user_receiver_id) { if (empty($user_send_id) || empty($user_receiver_id)) { return false; } $table = Database::get_main_table(TABLE_MESSAGE); $sql = 'DELETE FROM '.$table.' WHERE user_sender_id = '.((int) $user_send_id).' AND user_receiver_id='.((int) $user_receiver_id).' AND msg_status = '.MESSAGE_STATUS_INVITATION_PENDING; Database::query($sql); return true; } /** * Get user's feeds. * * @param int $user User ID * @param int $limit Limit of posts per feed * * @return string HTML section with all feeds included * * @author Yannick Warnier * * @since Dokeos 1.8.6.1 */ public static function getUserRssFeed($user, $limit = 5) { $feed = UserManager::get_extra_user_data_by_field($user, 'rssfeeds'); if (empty($feed)) { return ''; } $feeds = explode(';', $feed['rssfeeds']); if (count($feeds) == 0) { return ''; } $res = ''; foreach ($feeds as $url) { if (empty($url)) { continue; } try { $channel = Reader::import($url); $i = 1; if (!empty($channel)) { $iconRss = ''; if (!empty($feed)) { $iconRss = Display::url( Display::return_icon('social_rss.png', '', [], 22), Security::remove_XSS($feed['rssfeeds']), ['target' => '_blank'] ); } $res .= '

'.$iconRss.' '.$channel->getTitle().'

'; $res .= '
'; /** @var Rss $item */ foreach ($channel as $item) { if ($limit >= 0 and $i > $limit) { break; } $res .= '

'.$item->getTitle().'

'; $res .= '
'.api_get_local_time($item->getDateCreated()).'
'; $res .= '

'.$item->getDescription().'

'; $i++; } $res .= '
'; } } catch (Exception $e) { error_log($e->getMessage()); } } return $res; } /** * Sends invitations to friends. * * @param int $userId * @param string $subject * @param string $content * * @return bool */ public static function sendInvitationToUser($userId, $subject = '', $content = '') { $user_info = api_get_user_info($userId); $success = get_lang('MessageSentTo'); $success .= ' : '.api_get_person_name($user_info['firstName'], $user_info['lastName']); if (isset($subject) && isset($content) && isset($userId)) { $result = MessageManager::send_message($userId, $subject, $content); if ($result) { Display::addFlash( Display::return_message($success, 'normal', false) ); } else { Display::addFlash( Display::return_message(get_lang('ErrorSendingMessage'), 'error', false) ); } return false; } elseif (isset($userId) && !isset($subject)) { if (isset($userId) && $userId > 0) { $count = self::send_invitation_friend( api_get_user_id(), $userId, get_lang('Invitation'), $content ); if ($count) { Display::addFlash( Display::return_message( api_htmlentities(get_lang('InvitationHasBeenSent')), 'normal', false ) ); } else { Display::addFlash( Display::return_message( api_htmlentities(get_lang('YouAlreadySentAnInvitation')), 'warning', false ) ); } } } } /** * Helper functions definition. */ public static function get_logged_user_course_html($my_course, $count) { $result = ''; $count = (int) $count; // Table definitions $main_user_table = Database::get_main_table(TABLE_MAIN_USER); $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); $course_directory = $my_course['course_info']['directory']; $course_title = $my_course['course_info']['title']; $course_visibility = $my_course['course_info']['visibility']; $user_in_course_status = CourseManager::getUserInCourseStatus( api_get_user_id(), $my_course['course_info']['real_id'] ); $course_path = api_get_path(SYS_COURSE_PATH).$course_directory; // course path if (api_get_setting('course_images_in_courses_list') === 'true') { if (file_exists($course_path.'/course-pic85x85.png')) { $image = $my_course['course_info']['course_image']; $imageCourse = Display::img($image, $course_title, ['class' => 'img-course']); } else { $imageCourse = Display::return_icon( 'session_default_small.png', $course_title, ['class' => 'img-course'] ); } } else { $imageCourse = Display::return_icon( 'course.png', get_lang('Course'), ['class' => 'img-default'] ); } //display course entry if (api_get_setting('course_images_in_courses_list') === 'true') { $result .= '
  • '; } else { $result .= '
  • '; } $result .= $imageCourse; //show a hyperlink to the course, unless the course is closed and user is not course admin if ($course_visibility != COURSE_VISIBILITY_HIDDEN && ($course_visibility != COURSE_VISIBILITY_CLOSED || $user_in_course_status == COURSEMANAGER) ) { $result .= ''.$course_title.''; } else { $result .= $course_title.' '.get_lang('CourseClosed'); } $result .= '
  • '; $session = ''; if (!empty($my_course['session_name']) && !empty($my_course['id_session'])) { // Request for the name of the general coach $sql = 'SELECT lastname, firstname FROM '.$tbl_session.' ts LEFT JOIN '.$main_user_table.' tu ON ts.id_coach = tu.user_id WHERE ts.id='.(int) $my_course['id_session'].' LIMIT 1'; $rs = Database::query($sql); $sessioncoach = Database::store_result($rs); $sessioncoach = $sessioncoach[0]; $session = []; $session['title'] = $my_course['session_name']; if ($my_course['access_start_date'] == '0000-00-00') { $session['dates'] = get_lang('WithoutTimeLimits'); if (api_get_setting('show_session_coach') === 'true') { $session['coach'] = get_lang('GeneralCoach').': '. api_get_person_name($sessioncoach['firstname'], $sessioncoach['lastname']); } } else { $session['dates'] = ' - '.get_lang('From').' '.$my_course['access_start_date'].' '.get_lang('To').' '.$my_course['access_end_date']; if (api_get_setting('show_session_coach') === 'true') { $session['coach'] = get_lang('GeneralCoach').': '. api_get_person_name($sessioncoach['firstname'], $sessioncoach['lastname']); } } } $my_course['id_session'] = isset($my_course['id_session']) ? $my_course['id_session'] : 0; $output = [ $my_course['user_course_cat'], $result, $my_course['id_session'], $session, ]; return $output; } /** * Shows the avatar block in social pages. * * @param string $show highlight link possible values: * group_add, * home, * messages, * messages_inbox, * messages_compose, * messages_outbox, * invitations, * shared_profile, * friends, * groups search * @param int $group_id * @param int $user_id */ public static function show_social_avatar_block($show = '', $group_id = 0, $user_id = 0) { $user_id = (int) $user_id; $group_id = (int) $group_id; if (empty($user_id)) { $user_id = api_get_user_id(); } $show_groups = [ 'groups', 'group_messages', 'messages_list', 'group_add', 'mygroups', 'group_edit', 'member_list', 'invite_friends', 'waiting_list', 'browse_groups', ]; $template = new Template(null, false, false, false, false, false); if (in_array($show, $show_groups) && !empty($group_id)) { // Group image $userGroup = new UserGroup(); $group_info = $userGroup->get($group_id); $userGroupImage = $userGroup->get_picture_group( $group_id, $group_info['picture'], 128, GROUP_IMAGE_SIZE_BIG ); $template->assign('show_group', true); $template->assign('group_id', $group_id); $template->assign('user_group_image', $userGroupImage); $template->assign( 'user_is_group_admin', $userGroup->is_group_admin( $group_id, api_get_user_id() ) ); } else { $template->assign('show_group', false); $template->assign('show_user', true); $template->assign( 'user_image', [ 'big' => UserManager::getUserPicture( $user_id, USER_IMAGE_SIZE_BIG ), 'normal' => UserManager::getUserPicture( $user_id, USER_IMAGE_SIZE_MEDIUM ), ] ); } $skillBlock = $template->get_template('social/avatar_block.tpl'); return $template->fetch($skillBlock); } /** * Shows the right menu of the Social Network tool. * * @param string $show highlight link possible values: * group_add, * home, * messages, * messages_inbox, * messages_compose , * messages_outbox, * invitations, * shared_profile, * friends, * groups search * @param int $group_id group id * @param int $user_id user id * @param bool $show_full_profile show profile or not (show or hide the user image/information) * @param bool $show_delete_account_button */ public static function show_social_menu( $show = '', $group_id = 0, $user_id = 0, $show_full_profile = false, $show_delete_account_button = false ) { $user_id = (int) $user_id; $group_id = (int) $group_id; if (empty($user_id)) { $user_id = api_get_user_id(); } $usergroup = new UserGroup(); $show_groups = [ 'groups', 'group_messages', 'messages_list', 'group_add', 'mygroups', 'group_edit', 'member_list', 'invite_friends', 'waiting_list', 'browse_groups', ]; // get count unread message and total invitations $count_unread_message = MessageManager::getCountNewMessagesFromDB(api_get_user_id()); $count_unread_message = !empty($count_unread_message) ? Display::badge($count_unread_message) : null; $number_of_new_messages_of_friend = self::get_message_number_invitation_by_user_id(api_get_user_id()); $group_pending_invitations = $usergroup->get_groups_by_user( api_get_user_id(), GROUP_USER_PERMISSION_PENDING_INVITATION, false ); $group_pending_invitations = count($group_pending_invitations); $total_invitations = $number_of_new_messages_of_friend + $group_pending_invitations; $total_invitations = (!empty($total_invitations) ? Display::badge($total_invitations) : ''); $filesIcon = Display::return_icon('sn-files.png', get_lang('MyFiles'), null, ICON_SIZE_SMALL); $friendsIcon = Display::return_icon('sn-friends.png', get_lang('Friends'), null, ICON_SIZE_SMALL); $groupsIcon = Display::return_icon('sn-groups.png', get_lang('SocialGroups'), null, ICON_SIZE_SMALL); $homeIcon = Display::return_icon('sn-home.png', get_lang('Home'), null, ICON_SIZE_SMALL); $invitationsIcon = Display::return_icon('sn-invitations.png', get_lang('Invitations'), null, ICON_SIZE_SMALL); $messagesIcon = Display::return_icon('sn-message.png', get_lang('Messages'), null, ICON_SIZE_SMALL); $sharedProfileIcon = Display::return_icon('sn-profile.png', get_lang('ViewMySharedProfile')); $searchIcon = Display::return_icon('sn-search.png', get_lang('Search'), null, ICON_SIZE_SMALL); $portfolioIcon = Display::return_icon('wiki_task.png', get_lang('Portfolio')); $personalDataIcon = Display::return_icon('database.png', get_lang('PersonalDataReport')); $messageSocialIcon = Display::return_icon('promoted_message.png', get_lang('PromotedMessages')); $forumCourseId = api_get_configuration_value('global_forums_course_id'); $groupUrl = api_get_path(WEB_CODE_PATH).'social/groups.php'; if (!empty($forumCourseId)) { $courseInfo = api_get_course_info_by_id($forumCourseId); if (!empty($courseInfo)) { $groupUrl = api_get_path(WEB_CODE_PATH).'forum/index.php?cidReq='.$courseInfo['code']; } } $html = ''; $active = null; if (!in_array( $show, ['shared_profile', 'groups', 'group_edit', 'member_list', 'waiting_list', 'invite_friends'] )) { $links = ''; $html .= Display::panelCollapse( get_lang('SocialNetwork'), $links, 'social-network-menu', null, 'sn-sidebar', 'sn-sidebar-collapse' ); } if (!empty($group_id) && in_array($show, $show_groups)) { $html .= $usergroup->show_group_column_information( $group_id, api_get_user_id(), $show ); } if ($show === 'shared_profile') { $links = ''; } } // My friend profile. if ($user_id != api_get_user_id()) { $sendMessageText = get_lang('SendMessage'); $sendMessageIcon = Display::return_icon( 'new-message.png', $sendMessageText ); $sendMessageUrl = api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?'.http_build_query([ 'a' => 'get_user_popup', 'user_id' => $user_id, ]); $links .= '
  • '; $links .= Display::url( "$sendMessageIcon $sendMessageText", $sendMessageUrl, [ 'class' => 'ajax', 'title' => $sendMessageText, 'data-title' => $sendMessageText, ] ); $links .= '
  • '; if (api_get_configuration_value('allow_portfolio_tool')) { $links .= '
  • '.$portfolioIcon.' '.get_lang('Portfolio').'
  • '; } } // Check if I already sent an invitation message $invitationSentList = self::get_list_invitation_sent_by_user_id(api_get_user_id()); if (isset($invitationSentList[$user_id]) && is_array($invitationSentList[$user_id]) && count($invitationSentList[$user_id]) > 0 ) { $links .= '
  • '. Display::return_icon('invitation.png', get_lang('YouAlreadySentAnInvitation')) .'  '.get_lang('YouAlreadySentAnInvitation').'
  • '; } else { if (!$show_full_profile) { $links .= '
  • '. Display::return_icon('invitation.png', get_lang('SocialInvitationToFriends')).' '.get_lang('SendInvitation'). '
  • '; } } $links .= ''; $html .= Display::panelCollapse( get_lang('SocialNetwork'), $links, 'social-network-menu', null, 'sn-sidebar', 'sn-sidebar-collapse' ); if ($show_full_profile && $user_id == api_get_user_id()) { // Announcements $announcements = []; $announcementsByCourse = AnnouncementManager::getAnnoucementCourseTotalByUser($user_id); if (!empty($announcementsByCourse)) { foreach ($announcementsByCourse as $announcement) { $url = Display::url( Display::return_icon( 'announcement.png', get_lang('Announcements') ).$announcement['course']['name'].' ('.$announcement['count'].')', api_get_path(WEB_CODE_PATH).'announcements/announcements.php?cidReq='.$announcement['course']['code'] ); $announcements[] = Display::tag('li', $url); } } if (!empty($announcements)) { $html .= ''; } } } if ($show_delete_account_button) { $html .= '
    '; $html .= ''; $html .= '
    '; } $html .= ''; return $html; } /** * Displays a sortable table with the list of online users. * * @param array $user_list The list of users to be shown * @param bool $wrap Whether we want the function to wrap the spans list in a div or not * * @return string HTML block or null if and ID was defined * @assert (null) === false */ public static function display_user_list($user_list, $wrap = true) { $html = ''; if (isset($_GET['id']) || count($user_list) < 1) { return false; } $course_url = ''; if (isset($_GET['cidReq']) && strlen($_GET['cidReq']) > 0) { $course_url = '&cidReq='.Security::remove_XSS($_GET['cidReq']); } $hide = api_get_configuration_value('hide_complete_name_in_whoisonline'); foreach ($user_list as $uid) { $user_info = api_get_user_info($uid, true); $lastname = $user_info['lastname']; $firstname = $user_info['firstname']; $completeName = $firstname.', '.$lastname; $user_rol = $user_info['status'] == 1 ? Display::return_icon('teacher.png', get_lang('Teacher'), null, ICON_SIZE_TINY) : Display::return_icon('user.png', get_lang('Student'), null, ICON_SIZE_TINY); $status_icon_chat = null; if (isset($user_info['user_is_online_in_chat']) && $user_info['user_is_online_in_chat'] == 1) { $status_icon_chat = Display::return_icon('online.png', get_lang('Online')); } else { $status_icon_chat = Display::return_icon('offline.png', get_lang('Offline')); } $userPicture = $user_info['avatar']; $officialCode = ''; if (api_get_setting('show_official_code_whoisonline') == 'true') { $officialCode .= '

    '.$user_info['official_code'].'

    '; } if ($hide === true) { $completeName = ''; $firstname = ''; $lastname = ''; } $img = ''.$completeName.''; $url = null; // Anonymous users can't have access to the profile if (!api_is_anonymous()) { if (api_get_setting('allow_social_tool') === 'true') { $url = api_get_path(WEB_CODE_PATH).'social/profile.php?u='.$uid.$course_url; } else { $url = '?id='.$uid.$course_url; } } else { $url = null; } $name = ''.$firstname.'
    '.$lastname.'
    '; $html .= '
    '.$name.'
    '.$officialCode.'
    '.$status_icon_chat.' '.$user_rol.'
    '; } return $html; } /** * Displays the information of an individual user. * * @param int $user_id * * @return string */ public static function display_individual_user($user_id) { global $interbreadcrumb; $safe_user_id = (int) $user_id; $currentUserId = api_get_user_id(); $user_table = Database::get_main_table(TABLE_MAIN_USER); $sql = "SELECT * FROM $user_table WHERE user_id = ".$safe_user_id; $result = Database::query($sql); $html = null; if (Database::num_rows($result) == 1) { $user_object = Database::fetch_object($result); $userInfo = api_get_user_info($user_id); $alt = $userInfo['complete_name'].($currentUserId == $user_id ? ' ('.get_lang('Me').')' : ''); $status = get_status_from_code($user_object->status); $interbreadcrumb[] = ['url' => 'whoisonline.php', 'name' => get_lang('UsersOnLineList')]; $html .= '
    '; $fullurl = $userInfo['avatar']; $html .= ''.$alt.''; if (!empty($status)) { $html .= '
    '.$status.'
    '; } $html .= '
    '; if (api_get_setting('show_email_addresses') == 'true') { $html .= Display::encrypted_mailto_link($user_object->email, $user_object->email).'
    '; } if ($user_object->competences) { $html .= Display::page_subheader(get_lang('MyCompetences')); $html .= '

    '.$user_object->competences.'

    '; } if ($user_object->diplomas) { $html .= Display::page_subheader(get_lang('MyDiplomas')); $html .= '

    '.$user_object->diplomas.'

    '; } if ($user_object->teach) { $html .= Display::page_subheader(get_lang('MyTeach')); $html .= '

    '.$user_object->teach.'

    '; } self::display_productions($user_object->user_id); if ($user_object->openarea) { $html .= Display::page_subheader(get_lang('MyPersonalOpenArea')); $html .= '

    '.$user_object->openarea.'

    '; } } else { $html .= '
    '; $html .= get_lang('UsersOnLineList'); $html .= '
    '; } return $html; } /** * Display productions in who is online. * * @param int $user_id User id */ public static function display_productions($user_id) { $webdir_array = UserManager::get_user_picture_path_by_id($user_id, 'web'); $sysdir = UserManager::getUserPathById($user_id, 'system'); $webdir = UserManager::getUserPathById($user_id, 'web'); if (!is_dir($sysdir)) { mkdir($sysdir, api_get_permissions_for_new_directories(), true); } $productions = UserManager::get_user_productions($user_id); if (count($productions) > 0) { echo '
    '.get_lang('Productions').'
    '; echo '
      '; foreach ($productions as $file) { // Only display direct file links to avoid browsing an empty directory if (is_file($sysdir.$file) && $file != $webdir_array['file']) { echo '
    • '.$file.'
    • '; } // Real productions are under a subdirectory by the User's id if (is_dir($sysdir.$file)) { $subs = scandir($sysdir.$file); foreach ($subs as $my => $sub) { if (substr($sub, 0, 1) != '.' && is_file($sysdir.$file.'/'.$sub)) { echo '
    • '.$sub.'
    • '; } } } } echo '
    '; } } /** * @param string $content * @param string $span_count * * @return string */ public static function social_wrapper_div($content, $span_count) { $span_count = (int) $span_count; $html = '
    '; $html .= '
    '; $html .= $content; $html .= '
    '; return $html; } /** * Dummy function. */ public static function get_plugins($place = SOCIAL_CENTER_PLUGIN) { $content = ''; switch ($place) { case SOCIAL_CENTER_PLUGIN: $social_plugins = [1, 2]; if (is_array($social_plugins) && count($social_plugins) > 0) { $content .= '
    '; foreach ($social_plugins as $plugin) { $content .= ''; } $content .= '
    '; } break; case SOCIAL_LEFT_PLUGIN: break; case SOCIAL_RIGHT_PLUGIN: break; } return $content; } /** * Sends a message to someone's wall. * * @param int $userId id of author * @param int $friendId id where we send the message * @param string $messageContent of the message * @param int $messageId id parent * @param string $messageStatus status type of message * * @return int * * @author Yannick Warnier */ public static function sendWallMessage( $userId, $friendId, $messageContent, $messageId = 0, $messageStatus = '' ) { $tblMessage = Database::get_main_table(TABLE_MESSAGE); $userId = (int) $userId; $friendId = (int) $friendId; $messageId = (int) $messageId; if (empty($userId) || empty($friendId)) { return 0; } // Just in case we replace the and \n and \n\r while saving in the DB $messageContent = str_replace(["\n", "\n\r"], '
    ', $messageContent); $now = api_get_utc_datetime(); $attributes = [ 'user_sender_id' => $userId, 'user_receiver_id' => $friendId, 'msg_status' => $messageStatus, 'send_date' => $now, 'title' => '', 'content' => $messageContent, 'parent_id' => $messageId, 'group_id' => 0, 'update_date' => $now, ]; return Database::insert($tblMessage, $attributes); } /** * Send File attachment (jpg,png). * * @author Anibal Copitan * * @param int $userId id user * @param array $fileAttach * @param int $messageId id message (relation with main message) * @param string $fileComment description attachment file * * @return bool|int */ public static function sendWallMessageAttachmentFile( $userId, $fileAttach, $messageId, $fileComment = '' ) { $safeFileName = Database::escape_string($fileAttach['name']); $extension = strtolower(substr(strrchr($safeFileName, '.'), 1)); $allowedTypes = api_get_supported_image_extensions(); $allowedTypes[] = 'mp4'; $allowedTypes[] = 'webm'; $allowedTypes[] = 'ogg'; if (in_array($extension, $allowedTypes)) { return MessageManager::saveMessageAttachmentFile($fileAttach, $fileComment, $messageId, $userId); } return false; } /** * Gets all messages from someone's wall (within specific limits). * * @param int $userId id of wall shown * @param int|string $parentId id message (Post main) * @param int|array $groupId * @param int|array $friendId * @param string $startDate Date from which we want to show the messages, in UTC time * @param int $start Limit for the number of parent messages we want to show * @param int $length Wall message query offset * @param bool $getCount * @param array $threadList * * @return array|int * * @author Yannick Warnier */ public static function getWallMessages( $userId, $parentId = 0, $groupId = 0, $friendId = 0, $startDate = '', $start = 0, $length = 10, $getCount = false, $threadList = [] ) { $tblMessage = Database::get_main_table(TABLE_MESSAGE); $parentId = (int) $parentId; $userId = (int) $userId; $start = (int) $start; $length = (int) $length; $select = " SELECT id, user_sender_id, user_receiver_id, send_date, content, parent_id, msg_status, group_id, '' as forum_id, '' as thread_id, '' as c_id "; if ($getCount) { $select = ' SELECT count(id) as count_items '; } $sqlBase = "$select FROM $tblMessage m WHERE "; $sql = []; $sql[1] = $sqlBase."msg_status <> ".MESSAGE_STATUS_WALL_DELETE.' AND '; // Get my own posts $userReceiverCondition = ' ( user_receiver_id = '.$userId.' AND msg_status IN ('.MESSAGE_STATUS_WALL_POST.', '.MESSAGE_STATUS_WALL.') AND parent_id = '.$parentId.' )'; $sql[1] .= $userReceiverCondition; $sql[2] = $sqlBase.' msg_status = '.MESSAGE_STATUS_PROMOTED.' '; // Get my group posts $groupCondition = ''; if (!empty($groupId)) { if (is_array($groupId)) { $groupId = array_map('intval', $groupId); $groupId = implode(",", $groupId); $groupCondition = " ( group_id IN ($groupId) "; } else { $groupId = (int) $groupId; $groupCondition = " ( group_id = $groupId "; } $groupCondition .= ' AND (msg_status = '.MESSAGE_STATUS_NEW.' OR msg_status = '.MESSAGE_STATUS_UNREAD.')) '; } if (!empty($groupCondition)) { $sql[3] = $sqlBase.$groupCondition; } // Get my friend posts $friendCondition = ''; if (!empty($friendId)) { if (is_array($friendId)) { $friendId = array_map('intval', $friendId); $friendId = implode(",", $friendId); $friendCondition = " ( user_receiver_id IN ($friendId) "; } else { $friendId = (int) $friendId; $friendCondition = " ( user_receiver_id = $friendId "; } $friendCondition .= ' AND msg_status = '.MESSAGE_STATUS_WALL_POST.' AND parent_id = 0) '; } if (!empty($friendCondition)) { $sql[4] = $sqlBase.$friendCondition; } if (!empty($threadList)) { if ($getCount) { $select = ' SELECT count(iid) count_items '; } else { $select = " SELECT iid as id, poster_id as user_sender_id, '' as user_receiver_id, post_date as send_date, post_text as content, '' as parent_id, ".MESSAGE_STATUS_FORUM." as msg_status, '' as group_id, forum_id, thread_id, c_id "; } $threadList = array_map('intval', $threadList); $threadList = implode("','", $threadList); $condition = " thread_id IN ('$threadList') "; $sql[5] = "$select FROM c_forum_post WHERE $condition "; } if ($getCount) { $count = 0; foreach ($sql as $oneQuery) { if (!empty($oneQuery)) { $res = Database::query($oneQuery); $row = Database::fetch_array($res); $count += (int) $row['count_items']; } } return $count; } $sqlOrder = ' ORDER BY send_date DESC '; $sqlLimit = " LIMIT $start, $length "; $messages = []; foreach ($sql as $index => $oneQuery) { if ($index === 5) { // Exception only for the forum query above (field name change) $oneQuery .= ' ORDER BY post_date DESC '.$sqlLimit; } else { $oneQuery .= $sqlOrder.$sqlLimit; } $res = Database::query($oneQuery); $em = Database::getManager(); if (Database::num_rows($res) > 0) { $repo = $em->getRepository('ChamiloCourseBundle:CForumPost'); $repoThread = $em->getRepository('ChamiloCourseBundle:CForumThread'); $groups = []; $userGroup = new UserGroup(); $urlGroup = api_get_path(WEB_CODE_PATH).'social/group_view.php?id='; while ($row = Database::fetch_array($res, 'ASSOC')) { $row['group_info'] = []; if (!empty($row['group_id'])) { if (!in_array($row['group_id'], $groups)) { $group = $userGroup->get($row['group_id']); $group['url'] = $urlGroup.$group['id']; $groups[$row['group_id']] = $group; $row['group_info'] = $group; } else { $row['group_info'] = $groups[$row['group_id']]; } } // Forums $row['post_title'] = ''; $row['forum_title'] = ''; $row['thread_url'] = ''; if ($row['msg_status'] == MESSAGE_STATUS_FORUM) { /** @var CForumPost $post */ $post = $repo->find($row['id']); /** @var CForumThread $thread */ $thread = $repoThread->find($row['thread_id']); if ($post && $thread) { $courseInfo = api_get_course_info_by_id($post->getCId()); $row['post_title'] = $post->getForumId(); $row['forum_title'] = $thread->getThreadTitle(); $row['thread_url'] = api_get_path(WEB_CODE_PATH).'forum/viewthread.php?'.http_build_query([ 'cidReq' => $courseInfo['code'], 'forum' => $post->getForumId(), 'thread' => $post->getThreadId(), 'post_id' => $post->getIid(), ]).'#post_id_'.$post->getIid(); } } $messages[$row['id']] = $row; } } } // Reordering messages by ID (reverse order) is enough to have the // latest first, as there is currently no option to edit messages // afterwards krsort($messages); return $messages; } /** * Gets all messages from someone's wall (within specific limits), formatted. * * @param int $userId USER ID of the person's wall * @param array $messageInfo * @param string $start Start date (from when we want the messages until today) * @param int $limit Limit to the number of messages we want * @param int $offset Wall messages offset * * @return string HTML formatted string to show messages */ public static function getWallPostComments( $userId, $messageInfo, $start = null, $limit = 10, $offset = 0 ) { $messageId = $messageInfo['id']; $messages = MessageManager::getMessagesByParent($messageInfo['id'], 0, $offset, $limit); $formattedList = '
    '; $users = []; // The messages are ordered by date descendant, for comments we need ascendant krsort($messages); foreach ($messages as $message) { $userIdLoop = $message['user_sender_id']; if (!isset($users[$userIdLoop])) { $users[$userIdLoop] = api_get_user_info($userIdLoop); } $media = self::processPostComment($message, $users); $formattedList .= $media; } $formattedList .= '
    '; $formattedList .= '
    '; $formattedList .= '
    '; $formattedList .= '
    '; return $formattedList; } /** * @param array $message * @param array $users * * @return string */ public static function processPostComment($message, $users = []) { if (empty($message)) { return false; } $date = Display::dateToStringAgoAndLongDate($message['send_date']); $currentUserId = api_get_user_id(); $userIdLoop = $message['user_sender_id']; $receiverId = $message['user_receiver_id']; if (!isset($users[$userIdLoop])) { $users[$userIdLoop] = api_get_user_info($userIdLoop); } $iconStatus = $users[$userIdLoop]['icon_status']; $nameComplete = $users[$userIdLoop]['complete_name']; $url = api_get_path(WEB_CODE_PATH).'social/profile.php?u='.$userIdLoop; $comment = '
    '; $comment .= ''; $comment .= ''; $comment .= ''; $comment .= '
    '; return $comment; } /** * @param array $message * * @return array */ public static function getAttachmentPreviewList($message) { $messageId = $message['id']; $list = []; if (empty($message['group_id'])) { $files = MessageManager::getAttachmentList($messageId); if ($files) { $downloadUrl = api_get_path(WEB_CODE_PATH).'social/download.php?message_id='.$messageId; foreach ($files as $row_file) { $url = $downloadUrl.'&attachment_id='.$row_file['id']; $display = Display::fileHtmlGuesser($row_file['filename'], $url); $list[] = $display; } } } else { $list = MessageManager::getAttachmentLinkList($messageId, 0); } return $list; } /** * @param array $message * * @return string */ public static function getPostAttachment($message) { $previews = self::getAttachmentPreviewList($message); if (empty($previews)) { return ''; } return implode('', $previews); } /** * @param array $messages * * @return array */ public static function formatWallMessages($messages) { $data = []; $users = []; foreach ($messages as $key => $message) { $userIdLoop = $message['user_sender_id']; $userFriendIdLoop = $message['user_receiver_id']; if (!isset($users[$userIdLoop])) { $users[$userIdLoop] = api_get_user_info($userIdLoop); } if (!isset($users[$userFriendIdLoop])) { $users[$userFriendIdLoop] = api_get_user_info($userFriendIdLoop); } $html = self::headerMessagePost( $users[$userIdLoop], $users[$userFriendIdLoop], $message ); $data[$key] = $message; $data[$key]['html'] = $html; } return $data; } /** * get html data with OpenGrap passing the URL. * * @param $link url * * @return string data html */ public static function readContentWithOpenGraph($link) { if (strpos($link, "://") === false && substr($link, 0, 1) != "/") { $link = "http://".$link; } $graph = OpenGraph::fetch($link); $link = parse_url($link); $host = $link['host'] ? strtoupper($link['host']) : $link['path']; if (!$graph) { return false; } $url = $graph->url; $image = $graph->image; $description = $graph->description; $title = $graph->title; $html = ''; return $html; } /** * verify if Url Exist - Using Curl. * * @param $uri url * * @return bool */ public static function verifyUrl($uri) { $curl = curl_init($uri); curl_setopt($curl, CURLOPT_FAILONERROR, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 15); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); $response = curl_exec($curl); curl_close($curl); if (!empty($response)) { return true; } return false; } /** * Soft delete a message and his chidren. * * @param int $id id message to delete * * @return bool status query */ public static function deleteMessage($id) { $id = (int) $id; $messageInfo = MessageManager::get_message_by_id($id); if (!empty($messageInfo)) { // Delete comments too $messages = MessageManager::getMessagesByParent($id); if (!empty($messages)) { foreach ($messages as $message) { self::deleteMessage($message['id']); } } // Soft delete message $tblMessage = Database::get_main_table(TABLE_MESSAGE); $statusMessage = MESSAGE_STATUS_WALL_DELETE; $sql = "UPDATE $tblMessage SET msg_status = '$statusMessage' WHERE id = '{$id}' "; Database::query($sql); MessageManager::delete_message_attachment_file($id, $messageInfo['user_sender_id']); MessageManager::delete_message_attachment_file($id, $messageInfo['user_receiver_id']); return true; } return false; } /** * Generate the social block for a user. * * @param Template $template * @param int $userId The user id * @param string $groupBlock Optional. Highlight link possible values: * group_add, home, messages, messages_inbox, messages_compose, * messages_outbox, invitations, shared_profile, friends, groups, search * @param int $groupId Optional. Group ID * @param bool $show_full_profile * * @return string The HTML code with the social block */ public static function setSocialUserBlock( Template $template, $userId, $groupBlock = '', $groupId = 0, $show_full_profile = true ) { if (api_get_setting('allow_social_tool') != 'true') { return ''; } $currentUserId = api_get_user_id(); $userId = (int) $userId; $userRelationType = 0; $socialAvatarBlock = self::show_social_avatar_block( $groupBlock, $groupId, $userId ); $profileEditionLink = null; if ($currentUserId === $userId) { $profileEditionLink = Display::getProfileEditionLink($userId); } else { $userRelationType = self::get_relation_between_contacts($currentUserId, $userId); } $options = api_get_configuration_value('profile_fields_visibility'); if (isset($options['options'])) { $options = $options['options']; } $vCardUserLink = Display::getVCardUserLink($userId); if (isset($options['vcard']) && $options['vcard'] === false) { $vCardUserLink = ''; } $userInfo = api_get_user_info($userId, true, false, true, true); if (isset($options['firstname']) && $options['firstname'] === false) { $userInfo['firstname'] = ''; } if (isset($options['lastname']) && $options['lastname'] === false) { $userInfo['lastname'] = ''; } if (isset($options['email']) && $options['email'] === false) { $userInfo['email'] = ''; } // Ofaj $hasCertificates = Certificate::getCertificateByUser($userId); $userInfo['has_certificates'] = 0; if (!empty($hasCertificates)) { $userInfo['has_certificates'] = 1; } $userInfo['is_admin'] = UserManager::is_admin($userId); $languageId = api_get_language_id($userInfo['language']); $languageInfo = api_get_language_info($languageId); if ($languageInfo) { $userInfo['language'] = [ 'label' => $languageInfo['original_name'], 'value' => $languageInfo['english_name'], 'code' => $languageInfo['isocode'], ]; } if (isset($options['language']) && $options['language'] === false) { $userInfo['language'] = ''; } if (isset($options['photo']) && $options['photo'] === false) { $socialAvatarBlock = ''; } $extraFieldBlock = self::getExtraFieldBlock($userId, true); $showLanguageFlag = api_get_configuration_value('social_show_language_flag_in_profile'); $template->assign('user', $userInfo); $template->assign('show_language_flag', $showLanguageFlag); $template->assign('extra_info', $extraFieldBlock); $template->assign('social_avatar_block', $socialAvatarBlock); $template->assign('profile_edition_link', $profileEditionLink); //Added the link to export the vCard to the Template //If not friend $show_full_profile is False and the user can't see Email Address and Vcard Download Link if ($show_full_profile) { $template->assign('vcard_user_link', $vCardUserLink); } if (api_get_setting('gamification_mode') === '1') { $gamificationPoints = GamificationUtils::getTotalUserPoints( $userId, $userInfo['status'] ); $template->assign('gamification_points', $gamificationPoints); } $chatEnabled = api_is_global_chat_enabled(); if (isset($options['chat']) && $options['chat'] === false) { $chatEnabled = ''; } $template->assign('chat_enabled', $chatEnabled); $template->assign('user_relation', $userRelationType); $template->assign('user_relation_type_friend', USER_RELATION_TYPE_FRIEND); $template->assign('show_full_profile', $show_full_profile); $templateName = $template->get_template('social/user_block.tpl'); if (in_array($groupBlock, ['groups', 'group_edit', 'member_list'])) { $templateName = $template->get_template('social/group_block.tpl'); } $template->assign('social_avatar_block', $template->fetch($templateName)); } /** * @param int $user_id * @param $link_shared * @param bool $showLinkToChat * * @return string */ public static function listMyFriendsBlock($user_id, $link_shared = '', $showLinkToChat = false) { //SOCIALGOODFRIEND , USER_RELATION_TYPE_FRIEND, USER_RELATION_TYPE_PARENT $friends = self::get_friends($user_id, USER_RELATION_TYPE_FRIEND); $numberFriends = count($friends); $friendHtml = ''; if (!empty($numberFriends)) { $friendHtml .= '
    '; $j = 1; usort( $friends, function ($a, $b) { return strcmp($b['user_info']['user_is_online_in_chat'], $a['user_info']['user_is_online_in_chat']); } ); foreach ($friends as $friend) { if ($j > $numberFriends) { break; } $name_user = api_get_person_name($friend['firstName'], $friend['lastName']); $user_info_friend = api_get_user_info($friend['friend_user_id'], true); $statusIcon = Display::return_icon('statusoffline.png', get_lang('Offline')); $status = 0; if (!empty($user_info_friend['user_is_online_in_chat'])) { $statusIcon = Display::return_icon('statusonline.png', get_lang('Online')); $status = 1; } $friendAvatarMedium = UserManager::getUserPicture( $friend['friend_user_id'], USER_IMAGE_SIZE_MEDIUM ); $friendAvatarSmall = UserManager::getUserPicture( $friend['friend_user_id'], USER_IMAGE_SIZE_SMALL ); $friend_avatar = ''; $relation = self::get_relation_between_contacts( $friend['friend_user_id'], api_get_user_id() ); if ($showLinkToChat) { $friendHtml .= ''; $friendHtml .= $friend_avatar.' '.$name_user.''; $friendHtml .= ''.$statusIcon.''; } else { $link_shared = empty($link_shared) ? '' : '&'.$link_shared; $friendHtml .= ''; $friendHtml .= $friend_avatar.' '.$name_user.''; $friendHtml .= ''.$statusIcon.''; } $friendHtml .= ''; $j++; } $friendHtml .= '
    '; } else { $friendHtml = Display::return_message(get_lang('NoFriendsInYourContactList'), 'warning'); } return $friendHtml; } /** * @return string Get the JS code necessary for social wall to load open graph from URLs. */ public static function getScriptToGetOpenGraph() { return ''; } /** * @param string $urlForm * * @return string */ public static function getWallForm($urlForm) { $userId = isset($_GET['u']) ? '?u='.intval($_GET['u']) : ''; $form = new FormValidator( 'social_wall_main', 'post', $urlForm.$userId, null, ['enctype' => 'multipart/form-data'], FormValidator::LAYOUT_HORIZONTAL ); $socialWallPlaceholder = isset($_GET['u']) ? get_lang('SocialWallWriteNewPostToFriend') : get_lang( 'SocialWallWhatAreYouThinkingAbout' ); $form->addTextarea( 'social_wall_new_msg_main', null, [ 'placeholder' => $socialWallPlaceholder, 'cols-size' => [1, 12, 1], 'aria-label' => $socialWallPlaceholder, ] ); $form->addHtml('
    '); $form->addHtml('
    '); $form->addFile('picture', get_lang('UploadFile'), ['custom' => true]); $form->addHtml('
    '); $form->addHtml('
    '); $form->addButtonSend( get_lang('Post'), 'wall_post_button', false, [ 'cols-size' => [1, 10, 1], 'custom' => true, ] ); $form->addHtml('
    '); $form->addHtml('
    '); $form->addHidden('url_content', ''); $html = Display::panel($form->returnForm(), get_lang('SocialWall')); return $html; } /** * @param int $userId * @param int $start * @param int $length * @param array $threadList * * @return array */ public static function getMyWallMessages($userId, $start = 0, $length = 10, $threadList = []) { $userGroup = new UserGroup(); $groups = $userGroup->get_groups_by_user($userId, [GROUP_USER_PERMISSION_READER, GROUP_USER_PERMISSION_ADMIN]); $groupList = []; if (!empty($groups)) { $groupList = array_column($groups, 'id'); } $friends = self::get_friends($userId, USER_RELATION_TYPE_FRIEND); $friendList = []; if (!empty($friends)) { $friendList = array_column($friends, 'friend_user_id'); } $messages = self::getWallMessages( $userId, 0, $groupList, $friendList, '', $start, $length, false, $threadList ); $countPost = self::getCountWallMessagesByUser($userId, $groupList, $friendList, $threadList); $messages = self::formatWallMessages($messages); $html = ''; foreach ($messages as $message) { $post = $message['html']; $comments = ''; if (in_array($message['msg_status'], [MESSAGE_STATUS_WALL_POST, MESSAGE_STATUS_PROMOTED])) { $comments = self::getWallPostComments($userId, $message); } $html .= self::wrapPost($message, $post.$comments); } return [ 'posts' => $html, 'count' => $countPost, ]; } /** * @param string $message * @param string $content * * @return string */ public static function wrapPost($message, $content) { $class = ''; if ($message['msg_status'] === MESSAGE_STATUS_PROMOTED) { $class = 'promoted_post'; } return Display::panel($content, '', '', 'default', '', 'post_'.$message['id'], null, $class ); } /** * @param int $userId * @param array $groupList * @param array $friendList * @param array $threadList * * @return int */ public static function getCountWallMessagesByUser($userId, $groupList = [], $friendList = [], $threadList = []) { $count = self::getWallMessages( $userId, 0, $groupList, $friendList, '', 0, 0, true, $threadList ); return $count; } /** * @param int $userId * * @return string */ public static function getWallMessagesByUser($userId) { $messages = self::getWallMessages($userId); $messages = self::formatWallMessages($messages); $html = ''; foreach ($messages as $message) { $post = $message['html']; $comments = self::getWallPostComments($userId, $message); $html .= self::wrapPost($message, $post.$comments); } return $html; } /** * Get HTML code block for user skills. * * @param int $userId The user ID * @param string $orientation * * @return string */ public static function getSkillBlock($userId, $orientation = 'horizontal') { if (Skill::isAllowed($userId, false) === false) { return ''; } $skill = new Skill(); $ranking = $skill->getUserSkillRanking($userId); $template = new Template(null, false, false, false, false, false); $template->assign('ranking', $ranking); $template->assign('orientation', $orientation); $template->assign('skills', $skill->getUserSkillsTable($userId, 0, 0, false)['skills']); $template->assign('user_id', $userId); $template->assign('show_skills_report_link', api_is_student() || api_is_student_boss() || api_is_drh()); $skillBlock = $template->get_template('social/skills_block.tpl'); return $template->fetch($skillBlock); } /** * @param int $user_id * @param bool $isArray * * @return string|array */ public static function getExtraFieldBlock($user_id, $isArray = false) { $fieldVisibility = api_get_configuration_value('profile_fields_visibility'); $fieldVisibilityKeys = []; if (isset($fieldVisibility['options'])) { $fieldVisibility = $fieldVisibility['options']; $fieldVisibilityKeys = array_keys($fieldVisibility); } $t_ufo = Database::get_main_table(TABLE_EXTRA_FIELD_OPTIONS); $extra_user_data = UserManager::get_extra_user_data($user_id); $extra_information = ''; if (is_array($extra_user_data) && count($extra_user_data) > 0) { $extra_information_value = ''; $extraField = new ExtraField('user'); $listType = []; $extraFieldItem = []; foreach ($extra_user_data as $key => $data) { if (empty($data)) { continue; } if (in_array($key, $fieldVisibilityKeys) && $fieldVisibility[$key] === false) { continue; } // Avoiding parameters if (in_array( $key, [ 'mail_notify_invitation', 'mail_notify_message', 'mail_notify_group_message', ] )) { continue; } // get display text, visibility and type from user_field table $field_variable = str_replace('extra_', '', $key); $extraFieldInfo = $extraField->get_handler_field_info_by_field_variable( $field_variable ); if (in_array($extraFieldInfo['variable'], ['skype', 'linkedin_url'])) { continue; } // if is not visible skip if ($extraFieldInfo['visible_to_self'] != 1) { continue; } // if is not visible to others skip also if ($extraFieldInfo['visible_to_others'] != 1) { continue; } if (is_array($data)) { switch ($extraFieldInfo['field_type']) { case ExtraField::FIELD_TYPE_RADIO: $objEfOption = new ExtraFieldOption('user'); $value = $data['extra_'.$extraFieldInfo['variable']]; $optionInfo = $objEfOption->get_field_option_by_field_and_option( $extraFieldInfo['id'], $value ); if ($optionInfo && isset($optionInfo[0])) { $optionInfo = $optionInfo[0]; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $optionInfo['display_text'], ]; } else { $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => implode(',', $data), ]; } break; default: $extra_information_value .= '
  • '.ucfirst($extraFieldInfo['display_text']).' ' .' '.implode(',', $data).'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => implode(',', $data), ]; break; } } else { switch ($extraFieldInfo['field_type']) { case ExtraField::FIELD_TYPE_RADIO: $objEfOption = new ExtraFieldOption('user'); $optionInfo = $objEfOption->get_field_option_by_field_and_option($extraFieldInfo['id'], $extraFieldInfo['value']); break; case ExtraField::FIELD_TYPE_GEOLOCALIZATION_COORDINATES: case ExtraField::FIELD_TYPE_GEOLOCALIZATION: $data = explode('::', $data); $data = $data[0]; $extra_information_value .= '
  • '.ucfirst($extraFieldInfo['display_text']).': '.$data.'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $data, ]; break; case ExtraField::FIELD_TYPE_DOUBLE_SELECT: $id_options = explode('::', $data); $value_options = []; // get option display text from user_field_options table foreach ($id_options as $id_option) { $sql = "SELECT display_text FROM $t_ufo WHERE id = '$id_option'"; $res_options = Database::query($sql); $row_options = Database::fetch_row($res_options); $value_options[] = $row_options[0]; } $extra_information_value .= '
  • '.ucfirst($extraFieldInfo['display_text']).': ' .' '.implode(' ', $value_options).'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $value_options, ]; break; case ExtraField::FIELD_TYPE_TAG: $user_tags = UserManager::get_user_tags($user_id, $extraFieldInfo['id']); $tag_tmp = ''; foreach ($user_tags as $tags) { $tag_tmp .= '' .$tags['tag'] .''; } if (is_array($user_tags) && count($user_tags) > 0) { $extra_information_value .= '
  • '.ucfirst($extraFieldInfo['display_text']).': ' .' '.$tag_tmp.'
  • '; } $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $tag_tmp, ]; break; case ExtraField::FIELD_TYPE_SOCIAL_PROFILE: $icon_path = UserManager::get_favicon_from_url($data); if (self::verifyUrl($icon_path) == false) { break; } $bottom = '0.2'; //quick hack for hi5 $domain = parse_url($icon_path, PHP_URL_HOST); if ($domain == 'www.hi5.com' || $domain == 'hi5.com') { $bottom = '-0.8'; } $data = '' .'icon' .$extraFieldInfo['display_text'] .''; $extra_information_value .= '
  • '.$data.'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $data, ]; break; case ExtraField::FIELD_TYPE_SELECT_WITH_TEXT_FIELD: $parsedData = explode('::', $data); if (!$parsedData) { break; } $objEfOption = new ExtraFieldOption('user'); $optionInfo = $objEfOption->get($parsedData[0]); $extra_information_value .= '
  • ' .$optionInfo['display_text'].': ' .$parsedData[1].'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $parsedData[1], ]; break; case ExtraField::FIELD_TYPE_TRIPLE_SELECT: $optionIds = explode(';', $data); $optionValues = []; foreach ($optionIds as $optionId) { $objEfOption = new ExtraFieldOption('user'); $optionInfo = $objEfOption->get($optionId); $optionValues[] = $optionInfo['display_text']; } $extra_information_value .= '
  • ' .ucfirst($extraFieldInfo['display_text']).': ' .implode(' ', $optionValues).'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => implode(' ', $optionValues), ]; break; default: // Ofaj // Converts "Date of birth" into "age" if ($key === 'terms_datedenaissance') { $dataArray = date_to_str_ago($data, 'UTC', true); $dataToString = isset($dataArray['years']) && !empty($dataArray['years']) ? $dataArray['years'] : 0; if (!empty($dataToString)) { $data = $dataToString; $extraFieldInfo['display_text'] = get_lang('Age'); } } $extra_information_value .= '
  • '.ucfirst($extraFieldInfo['display_text']).': '.$data.'
  • '; $extraFieldItem = [ 'variable' => $extraFieldInfo['variable'], 'label' => ucfirst($extraFieldInfo['display_text']), 'value' => $data, ]; break; } } $listType[] = $extraFieldItem; } if ($isArray) { return $listType; } else { // if there are information to show if (!empty($extra_information_value)) { $extra_information_value = '
      '.$extra_information_value.'
    '; $extra_information .= Display::panelCollapse( get_lang('ExtraInformation'), $extra_information_value, 'sn-extra-information', null, 'sn-extra-accordion', 'sn-extra-collapse' ); } } } return $extra_information; } /** * @param string $url */ public static function handlePosts($url) { $friendId = isset($_GET['u']) ? (int) $_GET['u'] : api_get_user_id(); $url = Security::remove_XSS($url); // Main post if (!empty($_POST['social_wall_new_msg_main']) || !empty($_FILES['picture']['tmp_name'])) { $messageContent = $_POST['social_wall_new_msg_main']; if (!empty($_POST['url_content'])) { $messageContent = $_POST['social_wall_new_msg_main'].'

    '.$_POST['url_content']; } $messageId = self::sendWallMessage( api_get_user_id(), $friendId, $messageContent, 0, MESSAGE_STATUS_WALL_POST ); if ($messageId && !empty($_FILES['picture']['tmp_name'])) { self::sendWallMessageAttachmentFile( api_get_user_id(), $_FILES['picture'], $messageId ); } Display::addFlash(Display::return_message(get_lang('MessageSent'))); header('Location: '.$url); exit; } } /** * @param int $countPost * @param array $htmlHeadXtra */ public static function getScrollJs($countPost, &$htmlHeadXtra) { // $ajax_url = api_get_path(WEB_AJAX_PATH).'message.ajax.php'; $socialAjaxUrl = api_get_path(WEB_AJAX_PATH).'social.ajax.php'; $javascriptDir = api_get_path(LIBRARY_PATH).'javascript/'; $locale = api_get_language_isocode(); // Add Jquery scroll pagination plugin $htmlHeadXtra[] = api_get_js('jscroll/jquery.jscroll.js'); // Add Jquery Time ago plugin $htmlHeadXtra[] = api_get_asset('jquery-timeago/jquery.timeago.js'); $timeAgoLocaleDir = $javascriptDir.'jquery-timeago/locales/jquery.timeago.'.$locale.'.js'; if (file_exists($timeAgoLocaleDir)) { $htmlHeadXtra[] = api_get_js('jquery-timeago/locales/jquery.timeago.'.$locale.'.js'); } if ($countPost > self::DEFAULT_WALL_POSTS) { $htmlHeadXtra[] = ''; } $htmlHeadXtra[] = ''; } /** * @param int $userId * @param int $countPost * * @return string */ public static function getAutoExtendLink($userId, $countPost) { $userId = (int) $userId; $socialAjaxUrl = api_get_path(WEB_AJAX_PATH).'social.ajax.php'; $socialAutoExtendLink = ''; if ($countPost > self::DEFAULT_WALL_POSTS) { $socialAutoExtendLink = Display::url( get_lang('SeeMore'), $socialAjaxUrl.'?u='.$userId.'&a=list_wall_message&start='. self::DEFAULT_WALL_POSTS.'&length='.self::DEFAULT_SCROLL_NEW_POST, [ 'class' => 'nextPage next', ] ); } return $socialAutoExtendLink; } /** * @param int $userId * * @return array */ public static function getThreadList($userId) { $forumCourseId = api_get_configuration_value('global_forums_course_id'); require_once api_get_path(SYS_CODE_PATH).'forum/forumfunction.inc.php'; $threads = []; if (!empty($forumCourseId)) { $courseInfo = api_get_course_info_by_id($forumCourseId); getNotificationsPerUser($userId, true, $forumCourseId); $notification = Session::read('forum_notification'); Session::erase('forum_notification'); $threadUrlBase = api_get_path(WEB_CODE_PATH).'forum/viewthread.php?'.http_build_query([ 'cidReq' => $courseInfo['code'], ]).'&'; if (isset($notification['thread']) && !empty($notification['thread'])) { $threadList = array_filter(array_unique($notification['thread'])); $em = Database::getManager(); $repo = $em->getRepository('ChamiloCourseBundle:CForumThread'); foreach ($threadList as $threadId) { /** @var \Chamilo\CourseBundle\Entity\CForumThread $thread */ $thread = $repo->find($threadId); if ($thread) { $threadUrl = $threadUrlBase.http_build_query([ 'forum' => $thread->getForumId(), 'thread' => $thread->getIid(), ]); $threads[] = [ 'id' => $threadId, 'url' => Display::url( $thread->getThreadTitle(), $threadUrl ), 'name' => Display::url( $thread->getThreadTitle(), $threadUrl ), 'description' => '', ]; } } } } return $threads; } /** * @param int $userId * * @return string */ public static function getGroupBlock($userId) { $threadList = self::getThreadList($userId); $userGroup = new UserGroup(); $forumCourseId = api_get_configuration_value('global_forums_course_id'); $courseInfo = null; if (!empty($forumCourseId)) { $courseInfo = api_get_course_info_by_id($forumCourseId); } $social_group_block = ''; if (!empty($courseInfo)) { if (!empty($threadList)) { $social_group_block .= '
    '; foreach ($threadList as $group) { $social_group_block .= '
  • '; $social_group_block .= $group['name']; $social_group_block .= '
  • '; } $social_group_block .= '
    '; } $social_group_block .= Display::url( get_lang('SeeAllCommunities'), api_get_path(WEB_CODE_PATH).'forum/index.php?cidReq='.$courseInfo['code'] ); if (!empty($social_group_block)) { $social_group_block = Display::panelCollapse( get_lang('MyCommunities'), $social_group_block, 'sm-groups', null, 'grups-acordion', 'groups-collapse' ); } } else { // Load my groups $results = $userGroup->get_groups_by_user( $userId, [ GROUP_USER_PERMISSION_ADMIN, GROUP_USER_PERMISSION_READER, GROUP_USER_PERMISSION_MODERATOR, GROUP_USER_PERMISSION_HRM, ] ); $myGroups = []; if (!empty($results)) { foreach ($results as $result) { $id = $result['id']; $result['description'] = Security::remove_XSS($result['description'], STUDENT, true); $result['name'] = Security::remove_XSS($result['name'], STUDENT, true); $group_url = "group_view.php?id=$id"; $link = Display::url( api_ucwords(cut($result['name'], 40, true)), $group_url ); $result['name'] = $link; $picture = $userGroup->get_picture_group( $id, $result['picture'], null, GROUP_IMAGE_SIZE_BIG ); $result['picture'] = ''; $group_actions = ''; $group_info = '

    '.cut($result['description'], 120, true)."

    "; $myGroups[] = [ 'url' => Display::url( $result['picture'], $group_url ), 'name' => $result['name'], 'description' => $group_info.$group_actions, ]; } $social_group_block .= '
    '; foreach ($myGroups as $group) { $social_group_block .= '
  • '; $social_group_block .= $group['name']; $social_group_block .= '
  • '; } $social_group_block .= '
    '; $form = new FormValidator( 'find_groups_form', 'get', api_get_path(WEB_CODE_PATH).'social/search.php?search_type=2', null, null, FormValidator::LAYOUT_BOX_NO_LABEL ); $form->addHidden('search_type', 2); $form->addText( 'q', get_lang('Search'), false, [ 'aria-label' => get_lang('Search'), 'custom' => true, 'placeholder' => get_lang('Search'), ] ); $social_group_block .= $form->returnForm(); if (!empty($social_group_block)) { $social_group_block = Display::panelCollapse( get_lang('MyGroups'), $social_group_block, 'sm-groups', null, 'grups-acordion', 'groups-collapse' ); } } } return $social_group_block; } /** * Returns the formatted header message post. * * @param int $authorInfo * @param int $receiverInfo * @param array $message Message data * * @return string $html The formatted header message post */ private static function headerMessagePost($authorInfo, $receiverInfo, $message) { $currentUserId = api_get_user_id(); $authorId = (int) $authorInfo['user_id']; $receiverId = (int) $receiverInfo['user_id']; $iconStatus = $authorInfo['icon_status']; $date = Display::dateToStringAgoAndLongDate($message['send_date']); $avatarAuthor = $authorInfo['avatar']; $urlAuthor = api_get_path(WEB_CODE_PATH).'social/profile.php?u='.$authorId; $nameCompleteAuthor = $authorInfo['complete_name']; $urlReceiver = api_get_path(WEB_CODE_PATH).'social/profile.php?u='.$receiverId; $nameCompleteReceiver = $receiverInfo['complete_name']; $htmlReceiver = ''; if ($authorId !== $receiverId) { $htmlReceiver = ' > '.$nameCompleteReceiver.' '; } if (!empty($message['group_info'])) { $htmlReceiver = ' > '.$message['group_info']['name'].' '; } $canEdit = ($currentUserId == $authorInfo['user_id'] || $currentUserId == $receiverInfo['user_id']) && empty($message['group_info']); if (!empty($message['thread_id'])) { $htmlReceiver = ' > '.$message['forum_title'].' '; $canEdit = false; } $postAttachment = self::getPostAttachment($message); $html = '
    '; $html .= '
    '; $html .= MessageManager::getLikesButton( $message['id'], $currentUserId, !empty($message['group_info']['id']) ? (int) $message['group_info']['id'] : 0 ); if ($canEdit) { $htmlDelete = Display::url( Display::returnFontAwesomeIcon('trash', '', true), 'javascript:void(0)', [ 'id' => 'message_'.$message['id'], 'title' => get_lang('SocialMessageDelete'), 'onclick' => 'deleteMessage('.$message['id'].')', 'class' => 'btn btn-default', ] ); $html .= $htmlDelete; } $html .= '
    '; $html .= '
    '; $html .= ' '.$nameCompleteAuthor.''; $html .= '
    '; $html .= '
    '; $html .= $iconStatus; $html .= '
    '.$nameCompleteAuthor.''.$htmlReceiver.'
    '; $html .= ''; $html .= '
    '; $html .= '
    '; if (!empty($postAttachment)) { $html .= '
    '; $html .= $postAttachment; $html .= '
    '; } $html .= '
    '.Security::remove_XSS($message['content']).'
    '; $html .= '
    '; $html .= '
    '; // end mediaPost // Popularity post functionality $html .= '
    '; return $html; } }