* @package chamilo.library */ class GroupPortalManager { /** * Creates a new group * * @author Julio Montoya , * * @param string $name The URL of the site * @param string $description The description of the site * @param string $url * @param int $visibility is active or not * @param string $picture * * @return boolean if success */ public static function add($name, $description, $url, $visibility, $picture = '') { $now = api_get_utc_datetime(); $table = Database :: get_main_table(TABLE_MAIN_GROUP); $sql = "INSERT INTO $table SET name = '".Database::escape_string($name)."', description = '".Database::escape_string($description)."', picture_uri = '".Database::escape_string($picture)."', url = '".Database::escape_string($url)."', visibility = '".Database::escape_string($visibility)."', created_on = '".$now."', updated_on = '".$now."'"; Database::query($sql); $id = Database::insert_id(); if ($id) { Event::addEvent(LOG_GROUP_PORTAL_CREATED, LOG_GROUP_PORTAL_ID, $id); return $id; } return false; } /** * Updates a group * @author Julio Montoya , * * @param int $group_id The id * @param string $name The description of the site * @param string $description * @param string $url * @param int $visibility * @param string $picture_uri * @param bool $allowMemberGroupToLeave * @return bool if success */ public static function update($group_id, $name, $description, $url, $visibility, $picture_uri, $allowMemberGroupToLeave = null) { $group_id = intval($group_id); $table = Database::get_main_table(TABLE_MAIN_GROUP); $now = api_get_utc_datetime(); $groupLeaveCondition = null; if (isset($allowMemberGroupToLeave)) { $allowMemberGroupToLeave = $allowMemberGroupToLeave == true ? 1 : 0; $groupLeaveCondition = " allow_members_leave_group = $allowMemberGroupToLeave , "; } $sql = "UPDATE $table SET name = '".Database::escape_string($name)."', description = '".Database::escape_string($description)."', picture_uri = '".Database::escape_string($picture_uri)."', url = '".Database::escape_string($url)."', visibility = '".Database::escape_string($visibility)."', $groupLeaveCondition updated_on = '".$now."' WHERE id = '$group_id'"; $result = Database::query($sql); return $result; } /** * Deletes a group * @author Julio Montoya * @param int $id * @return boolean true if success * */ public static function delete($id) { $id = intval($id); $table = Database :: get_main_table(TABLE_MAIN_GROUP); $sql = "DELETE FROM $table WHERE id = ".intval($id); $result = Database::query($sql); // Deleting all relationship with users and groups self::delete_users($id); // Delete group image self::delete_group_picture($id); Event::addEvent(LOG_GROUP_PORTAL_DELETED, LOG_GROUP_PORTAL_ID, $id); return $result; } /** * Gets data of all groups * @author Julio Montoya * @param int $visibility * @param int $from which record the results will begin (use for pagination) * @param int $number_of_items * * @return array * */ public static function get_all_group_data($visibility = GROUP_PERMISSION_OPEN, $from = 0, $number_of_items = 10) { $table = Database :: get_main_table(TABLE_MAIN_GROUP); $visibility = intval($visibility); $sql = "SELECT * FROM $table WHERE visibility = $visibility "; $res = Database::query($sql); $data = array(); while ($item = Database::fetch_array($res)) { $data[] = $item; } return $data; } /** * Gets a list of all group * @param int $without_this_one id of a group not to include (i.e. to exclude) * * @return array : id => name * */ public static function get_groups_list($without_this_one = NULL) { $where = ''; if (isset($without_this_one) && (intval($without_this_one) == $without_this_one)) { $where = "WHERE id <> $without_this_one"; } $table = Database :: get_main_table(TABLE_MAIN_GROUP); $sql = "SELECT id, name FROM $table $where order by name"; $res = Database::query($sql); $list = array(); while ($item = Database::fetch_assoc($res)) { $list[$item['id']] = $item['name']; } return $list; } /** * Gets the group data * @param int $group_id * * @return array */ public static function get_group_data($group_id) { $table = Database :: get_main_table(TABLE_MAIN_GROUP); $group_id = intval($group_id); $sql = "SELECT * FROM $table WHERE id = $group_id "; $res = Database::query($sql); $item = array(); if (Database::num_rows($res) > 0) { $item = Database::fetch_array($res, 'ASSOC'); } return $item; } /** * Set a parent group * @param int $group_id * @param int $parent_group_id if 0, we delete the parent_group association * @param int $relation_type * @return resource **/ public static function set_parent_group($group_id, $parent_group_id, $relation_type = 1) { $table = Database :: get_main_table(TABLE_MAIN_GROUP_REL_GROUP); $group_id = intval($group_id); $parent_group_id = intval($parent_group_id); if ($parent_group_id == 0) { $sql = "DELETE FROM $table WHERE subgroup_id = $group_id"; } else { $sql = "SELECT group_id FROM $table WHERE subgroup_id = $group_id"; $res = Database::query($sql); if (Database::num_rows($res) == 0) { $sql = "INSERT INTO $table SET group_id = $parent_group_id, subgroup_id = $group_id, relation_type = $relation_type"; } else { $sql = "UPDATE $table SET group_id = $parent_group_id, relation_type = $relation_type WHERE subgroup_id = $group_id"; } } $res = Database::query($sql); return $res; } /** * Get the parent group * @param int $group_id * @param int $relation_type * @return int parent_group_id or false * */ public static function get_parent_group($group_id, $relation_type = 1) { $table = Database :: get_main_table(TABLE_MAIN_GROUP_REL_GROUP); $group_id = intval($group_id); $sql = "SELECT group_id FROM $table WHERE subgroup_id = $group_id"; $res = Database::query($sql); if (Database::num_rows($res) == 0) { return 0; } else { $arr = Database::fetch_assoc($res); return $arr['group_id']; } } /** * Get the subgroups ID from a group. * The default $levels value is 10 considering it as a extensive level of depth * @param int $groupId The parent group ID * @param int $levels The depth levels * @return array The list of ID */ public static function getGroupsByDepthLevel($groupId, $levels = 10) { $groups = array(); $groupId = intval($groupId); $groupTable = Database::get_main_table(TABLE_MAIN_GROUP); $groupRelGroupTable = Database :: get_main_table(TABLE_MAIN_GROUP_REL_GROUP); $select = "SELECT "; $from = "FROM $groupTable g1 "; for ($i = 1; $i <= $levels; $i++) { $tableIndexNumber = $i; $tableIndexJoinNumber = $i - 1; $select .= "g$i.id as id_$i "; $select .= ($i != $levels ? ", " : null); if ($i == 1) { $from .= "INNER JOIN $groupRelGroupTable gg0 ON g1.id = gg0.subgroup_id and gg0.group_id = $groupId "; } else { $from .= "LEFT JOIN $groupRelGroupTable gg$tableIndexJoinNumber "; $from .= " ON g$tableIndexJoinNumber.id = gg$tableIndexJoinNumber.group_id "; $from .= "LEFT JOIN $groupTable g$tableIndexNumber "; $from .= " ON gg$tableIndexJoinNumber.subgroup_id = g$tableIndexNumber.id "; } } $result = Database::query("$select $from"); while ($item = Database::fetch_assoc($result)) { foreach ($item as $groupId) { if (!empty($groupId)) { $groups[] = $groupId; } } } return array_map('intval', $groups); } /** * @param int $root * @param int $level * @return array */ public static function get_subgroups($root, $level) { $t_group = Database::get_main_table(TABLE_MAIN_GROUP); $t_rel_group = Database :: get_main_table(TABLE_MAIN_GROUP_REL_GROUP); $select_part = "SELECT "; $cond_part = ''; for ($i = 1; $i <= $level; $i++) { $g_number = $i; $rg_number = $i - 1; if ($i == $level) { $select_part .= "g$i.id as id_$i, g$i.name as name_$i "; } else { $select_part .= "g$i.id as id_$i, g$i.name name_$i, "; } if ($i == 1) { $cond_part .= "FROM $t_group g1 JOIN $t_rel_group rg0 on g1.id = rg0.subgroup_id and rg0.group_id = $root "; } else { $cond_part .= "LEFT JOIN $t_rel_group rg$rg_number on g$rg_number.id = rg$rg_number.group_id "; $cond_part .= "LEFT JOIN $t_group g$g_number on rg$rg_number.subgroup_id = g$g_number.id "; } } $sql = $select_part.' '.$cond_part; $res = Database::query($sql); $toReturn = array(); while ($item = Database::fetch_assoc($res)) { foreach ($item as $key => $value) { if ($key == 'id_1') { $toReturn[$value]['name'] = $item['name_1']; } else { $temp = explode('_', $key); $indexKey = $temp[1]; $stringKey = $temp[0]; $previousKey = $stringKey.'_'.$indexKey - 1; if ($stringKey == 'id' && isset($item[$key])) { $toReturn[$item[$previousKey]]['hrms'][$indexKey]['name'] = $item['name_'.$indexKey]; } } } } return $toReturn; } /** * @param int $group_id * @return array */ public static function get_parent_groups($group_id) { $t_rel_group = Database :: get_main_table(TABLE_MAIN_GROUP_REL_GROUP); $max_level = 10; $select_part = "SELECT "; $cond_part = ''; for ($i = 1; $i <= $max_level; $i++) { $g_number = $i; $rg_number = $i - 1; if ($i == $max_level) { $select_part .= "rg$rg_number.group_id as id_$rg_number "; } else { $select_part .="rg$rg_number.group_id as id_$rg_number, "; } if ($i == 1) { $cond_part .= "FROM $t_rel_group rg0 LEFT JOIN $t_rel_group rg$i on rg$rg_number.group_id = rg$i.subgroup_id "; } else { $cond_part .= " LEFT JOIN $t_rel_group rg$i on rg$rg_number.group_id = rg$i.subgroup_id "; } } $sql = $select_part.' '.$cond_part."WHERE rg0.subgroup_id='$group_id'"; $res = Database::query($sql); $temp_arr = Database::fetch_array($res, 'NUM'); $toReturn = array(); if (is_array($temp_arr)) { foreach ($temp_arr as $elt) { if (isset($elt)) { $toReturn[] = $elt; } } } return $toReturn; } /** * Gets the tags from a given group * @param int $group_id * @param bool $show_tag_links show group links or not * */ public static function get_group_tags($group_id, $show_tag_links = true) { $tag = Database :: get_main_table(TABLE_MAIN_TAG); $table_group_rel_tag = Database :: get_main_table(TABLE_MAIN_GROUP_REL_TAG); $group_id = intval($group_id); $sql = "SELECT tag FROM $tag t INNER JOIN $table_group_rel_tag gt ON (gt.tag_id= t.id) WHERE gt.group_id = $group_id "; $res = Database::query($sql); $tags = array(); if (Database::num_rows($res) > 0) { while ($row = Database::fetch_array($res, 'ASSOC')) { $tags[] = $row; } } if ($show_tag_links) { if (is_array($tags) && count($tags) > 0) { foreach ($tags as $tag) { $tag_tmp[] = ''.$tag['tag'].''; } if (is_array($tags) && count($tags) > 0) { $tags = implode(', ', $tag_tmp); } } else { $tags = ''; } } return $tags; } /** * Gets the inner join from users and group table * @param string $user_id * @param string $relation_type * @param bool $with_image * @return array Database::store_result of the result * @author Julio Montoya **/ public static function get_groups_by_user($user_id = '', $relation_type = GROUP_USER_PERMISSION_READER, $with_image = false) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); $tbl_group = Database::get_main_table(TABLE_MAIN_GROUP); $user_id = intval($user_id); if ($relation_type == 0) { $where_relation_condition = ''; } else { $relation_type = intval($relation_type); $where_relation_condition = "AND gu.relation_type = $relation_type "; } $sql = "SELECT g.picture_uri, g.name, g.description, g.id, gu.relation_type FROM $tbl_group g INNER JOIN $table_group_rel_user gu ON gu.group_id = g.id WHERE gu.user_id = $user_id $where_relation_condition ORDER BY created_on desc "; $result = Database::query($sql); $array = array(); if (Database::num_rows($result) > 0) { while ($row = Database::fetch_array($result, 'ASSOC')) { if ($with_image) { $picture = self::get_picture_group($row['id'], $row['picture_uri'], 80); $img = ''; $row['picture_uri'] = $img; } $array[$row['id']] = $row; } } return $array; } /** Gets the inner join of users and group table * @param int quantity of records * @param bool show groups with image or not * @return array with group content * @author Julio Montoya * */ public static function get_groups_by_popularity($num = 6, $with_image = true) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); $tbl_group = Database::get_main_table(TABLE_MAIN_GROUP); if (empty($num)) { $num = 6; } else { $num = intval($num); } // only show admins and readers $where_relation_condition = " WHERE gu.relation_type IN ('".GROUP_USER_PERMISSION_ADMIN."' , '".GROUP_USER_PERMISSION_READER."', '".GROUP_USER_PERMISSION_HRM."') "; $sql = "SELECT DISTINCT count(user_id) as count, g.picture_uri, g.name, g.description, g.id FROM $tbl_group g INNER JOIN $table_group_rel_user gu ON gu.group_id = g.id $where_relation_condition GROUP BY g.id ORDER BY count DESC LIMIT $num"; $result = Database::query($sql); $array = array(); while ($row = Database::fetch_array($result, 'ASSOC')) { if ($with_image) { $picture = self::get_picture_group($row['id'], $row['picture_uri'], 80); $img = ''; $row['picture_uri'] = $img; } if (empty($row['id'])) { continue; } $array[$row['id']] = $row; } return $array; } /** * Gets the last groups created * @param int quantity of records * @param bool show groups with image or not * @return array with group content * @author Julio Montoya * */ public static function get_groups_by_age($num = 6, $with_image = true) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); $tbl_group = Database::get_main_table(TABLE_MAIN_GROUP); if (empty($num)) { $num = 6; } else { $num = intval($num); } $where_relation_condition = " WHERE gu.relation_type IN ('".GROUP_USER_PERMISSION_ADMIN."' , '".GROUP_USER_PERMISSION_READER."', '".GROUP_USER_PERMISSION_HRM."') "; $sql = "SELECT DISTINCT count(user_id) as count, g.picture_uri, g.name, g.description, g.id FROM $tbl_group g INNER JOIN $table_group_rel_user gu ON gu.group_id = g.id $where_relation_condition GROUP BY g.id ORDER BY created_on DESC LIMIT $num "; $result = Database::query($sql); $array = array(); while ($row = Database::fetch_array($result, 'ASSOC')) { if ($with_image) { $picture = self::get_picture_group($row['id'], $row['picture_uri'], 80); $img = ''; $row['picture_uri'] = $img; } if (empty($row['id'])) { continue; } $array[$row['id']] = $row; } return $array; } /** * Gets the group's members * @param int group id * @param bool show image or not of the group * @param array list of relation type use constants * @param int from value * @param int limit * @param array image configuration, i.e array('height'=>'20px', 'size'=> '20px') * @return array list of users in a group */ public static function get_users_by_group( $group_id, $with_image = false, $relation_type = array(), $from = null, $limit = null, $image_conf = array('size' => USER_IMAGE_SIZE_MEDIUM, 'height' => 80) ) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); $tbl_user = Database::get_main_table(TABLE_MAIN_USER); $group_id = intval($group_id); if (empty($group_id)) { return array(); } $limit_text = ''; if (isset($from) && isset($limit)) { $from = intval($from); $limit = intval($limit); $limit_text = "LIMIT $from, $limit"; } if (count($relation_type) == 0) { $where_relation_condition = ''; } else { $new_relation_type = array(); foreach ($relation_type as $rel) { $rel = intval($rel); $new_relation_type[] = "'$rel'"; } $relation_type = implode(',', $new_relation_type); if (!empty($relation_type)) $where_relation_condition = "AND gu.relation_type IN ($relation_type) "; } $sql = "SELECT picture_uri as image, u.user_id, u.firstname, u.lastname, relation_type FROM $tbl_user u INNER JOIN $table_group_rel_user gu ON (gu.user_id = u.user_id) WHERE gu.group_id= $group_id $where_relation_condition ORDER BY relation_type, firstname $limit_text"; $result = Database::query($sql); $array = array(); while ($row = Database::fetch_array($result, 'ASSOC')) { if ($with_image) { $picture = UserManager::getUserPicture($row['user_id']); $row['image'] = ''; } $array[$row['user_id']] = $row; } return $array; } /** * Gets all the members of a group no matter the relationship for more specifications use get_users_by_group * @param int group id * @return array */ public static function get_all_users_by_group($group_id) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); $tbl_user = Database::get_main_table(TABLE_MAIN_USER); $group_id = intval($group_id); if (empty($group_id)) { return array(); } $sql = "SELECT u.user_id, u.firstname, u.lastname, relation_type FROM $tbl_user u INNER JOIN $table_group_rel_user gu ON (gu.user_id = u.user_id) WHERE gu.group_id= $group_id ORDER BY relation_type, firstname"; $result = Database::query($sql); $array = array(); while ($row = Database::fetch_array($result, 'ASSOC')) { $array[$row['user_id']] = $row; } return $array; } /** * Gets the relationship between a group and a User * @author Julio Montoya * @param int user id * @param int group_id * @return int 0 if there are not relationship otherwise returns the user group * */ public static function get_user_group_role($user_id, $group_id) { $table_group_rel_user = Database :: get_main_table(TABLE_MAIN_USER_REL_GROUP); $return_value = 0; if (!empty($user_id) && !empty($group_id)) { $sql = "SELECT relation_type FROM $table_group_rel_user WHERE group_id = ".intval($group_id)." AND user_id = ".intval($user_id)." "; $result = Database::query($sql); if (Database::num_rows($result) > 0) { $row = Database::fetch_array($result, 'ASSOC'); $return_value = $row['relation_type']; } } return $return_value; } /** * Add a user into a group * @author Julio Montoya * @param int user_id * @param int url_id * @return boolean true if success **/ public static function add_user_to_group($user_id, $group_id, $relation_type = GROUP_USER_PERMISSION_READER) { $result = false; $table_url_rel_group = Database :: get_main_table(TABLE_MAIN_USER_REL_GROUP); if (!empty($user_id) && !empty($group_id)) { $role = self::get_user_group_role($user_id, $group_id); if ($role == 0) { $sql = "INSERT INTO $table_url_rel_group SET user_id = ".intval($user_id).", group_id = ".intval($group_id).", relation_type = ".intval($relation_type); $result = Database::query($sql); Event::addEvent( LOG_GROUP_PORTAL_USER_SUBSCRIBED, LOG_GROUP_PORTAL_REL_USER_ARRAY, array( 'user_id' => $user_id, 'group_id' => $group_id, 'relation_type' => $relation_type, ) ); } elseif ($role == GROUP_USER_PERMISSION_PENDING_INVITATION) { // If somebody already invited me I can be added self::update_user_role( $user_id, $group_id, GROUP_USER_PERMISSION_READER ); } } return $result; } /** * Add a group of users into a group of URLs * @author Julio Montoya * @param array $user_list of user_ids * @param array $group_list of url_ids * @param string $relation_type **/ public static function add_users_to_groups($user_list, $group_list, $relation_type = GROUP_USER_PERMISSION_READER) { $result_array = array(); $relation_type = intval($relation_type); if (is_array($user_list) && is_array($group_list)) { foreach ($group_list as $group_id) { foreach ($user_list as $user_id) { $result = self::add_user_to_group($user_id, $group_id, $relation_type); if ($result) { $result_array[$group_id][$user_id] = 1; } else { $result_array[$group_id][$user_id] = 0; } } } } return $result_array; } /** * Deletes a group and user relationship * @author Julio Montoya * @param int $group_id * @param int $relation_type (optional) * @return boolean true if success * */ public static function delete_users($group_id, $relation_type = null) { $table = Database :: get_main_table(TABLE_MAIN_USER_REL_GROUP); $condition_relation = ""; if (!empty($relation_type)) { $relation_type = intval($relation_type); $condition_relation = " AND relation_type = '$relation_type'"; } $sql = "DELETE FROM $table WHERE group_id = ".intval($group_id).$condition_relation; $result = Database::query($sql); Event::addEvent( LOG_GROUP_PORTAL_USER_DELETE_ALL, LOG_GROUP_PORTAL_REL_USER_ARRAY, array('group_id' => $group_id, 'relation_type' => $relation_type) ); return $result; } /** * Deletes an url and session relationship * @author Julio Montoya * @param int $user_id * @param int $group_id * @return boolean true if success * */ public static function delete_user_rel_group($user_id, $group_id) { $table = Database :: get_main_table(TABLE_MAIN_USER_REL_GROUP); $sql = "DELETE FROM $table WHERE user_id = ".intval($user_id)." AND group_id=".intval($group_id); $result = Database::query($sql); Event::addEvent( LOG_GROUP_PORTAL_USER_UNSUBSCRIBED, LOG_GROUP_PORTAL_REL_USER_ARRAY, array('user_id' => $user_id, 'group_id' => $group_id) ); return $result; } /** * Updates the group_rel_user table with a given user and group ids * @author Julio Montoya * @param int $user_id * @param int $group_id * @param int $relation_type * * @return bool **/ public static function update_user_role($user_id, $group_id, $relation_type = GROUP_USER_PERMISSION_READER) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); if (empty($user_id) || empty($group_id) || empty($relation_type)) { return false; } $group_id = intval($group_id); $user_id = intval($user_id); $sql = "UPDATE $table_group_rel_user SET relation_type = ".intval($relation_type)." WHERE user_id = $user_id AND group_id = $group_id "; Database::query($sql); Event::addEvent( LOG_GROUP_PORTAL_USER_UPDATE_ROLE, LOG_GROUP_PORTAL_REL_USER_ARRAY, array('user_id' => $user_id, 'group_id' => $group_id, 'relation_type' => $relation_type) ); return true; } /** * @param int $user_id * @param int $group_id */ public static function get_group_admin_list($user_id, $group_id) { $table_group_rel_user = Database :: get_main_table(TABLE_MAIN_USER_REL_GROUP); $group_id = intval($group_id); $user_id = intval($user_id); $sql = "SELECT user_id FROM $table_group_rel_user WHERE relation_type = ".GROUP_USER_PERMISSION_ADMIN." AND user_id = $user_id AND group_id = $group_id"; Database::query($sql); } /** * @param string $tag * @param int $from * @param int $number_of_items * @param bool $getCount * @return array */ public static function get_all_group_tags($tag, $from = 0, $number_of_items = 10, $getCount = false) { // Database table definition $group_table = Database::get_main_table(TABLE_MAIN_GROUP); $table_tag = Database::get_main_table(TABLE_MAIN_TAG); $table_group_tag_values = Database::get_main_table(TABLE_MAIN_GROUP_REL_TAG); $field_id = 5; $from = intval($from); $number_of_items = intval($number_of_items); // all the information of the field if ($getCount) { $select = "SELECT count(DISTINCT g.id) count"; } else { $select = " SELECT DISTINCT g.id, g.name, g.description, g.picture_uri "; } $sql = " $select FROM $group_table g LEFT JOIN $table_group_tag_values tv ON (g.id AND tv.group_id) LEFT JOIN $table_tag t ON (tv.tag_id = t.id) WHERE tag LIKE '$tag%' AND field_id= $field_id OR ( g.name LIKE '".Database::escape_string('%'.$tag.'%')."' OR g.description LIKE '".Database::escape_string('%'.$tag.'%')."' OR g.url LIKE '".Database::escape_string('%'.$tag.'%')."' )"; $sql .= " LIMIT $from, $number_of_items"; $result = Database::query($sql); $return = array(); if (Database::num_rows($result) > 0) { if ($getCount) { $row = Database::fetch_array($result, 'ASSOC'); return $row['count']; } while ($row = Database::fetch_array($result, 'ASSOC')) { $return[$row['id']] = $row; } } return $return; } /** * Creates new group pictures in various sizes of a user, or deletes user photos. * Note: This method relies on configuration setting from main/inc/conf/profile.conf.php * @param int The group id * @param string $file The common file name for the newly created photos. * It will be checked and modified for compatibility with the file system. * If full name is provided, path component is ignored. * If an empty name is provided, then old user photos are deleted only, @see UserManager::delete_user_picture() * as the prefered way for deletion. * @param string $source_file The full system name of the image from which user photos will be created. * @return string/bool Returns the resulting file name of created images which usually should be stored in DB. * When deletion is recuested returns empty string. In case of internal error or negative validation returns FALSE. */ public static function update_group_picture($group_id, $file = null, $source_file = null) { // Validation. if (empty($group_id)) { return false; } $delete = empty($file); if (empty($source_file)) { $source_file = $file; } // User-reserved directory where photos have to be placed. $path_info = self::get_group_picture_path_by_id($group_id, 'system', true); $path = $path_info['dir']; // If this directory does not exist - we create it. if (!file_exists($path)) { @mkdir($path, api_get_permissions_for_new_directories(), true); } // The old photos (if any). $old_file = $path_info['file']; // Let us delete them. if (!empty($old_file)) { if (KEEP_THE_OLD_IMAGE_AFTER_CHANGE) { $prefix = 'saved_'.date('Y_m_d_H_i_s').'_'.uniqid('').'_'; @rename($path.'small_'.$old_file, $path.$prefix.'small_'.$old_file); @rename($path.'medium_'.$old_file, $path.$prefix.'medium_'.$old_file); @rename($path.'big_'.$old_file, $path.$prefix.'big_'.$old_file); @rename($path.$old_file, $path.$prefix.$old_file); } else { @unlink($path.'small_'.$old_file); @unlink($path.'medium_'.$old_file); @unlink($path.'big_'.$old_file); @unlink($path.$old_file); } } // Exit if only deletion has been requested. Return an empty picture name. if ($delete) { return ''; } // Validation 2. $allowed_types = array('jpg', 'jpeg', 'png', 'gif'); $file = str_replace('\\', '/', $file); $filename = (($pos = strrpos($file, '/')) !== false) ? substr($file, $pos + 1) : $file; $extension = strtolower(substr(strrchr($filename, '.'), 1)); if (!in_array($extension, $allowed_types)) { return false; } // This is the common name for the new photos. if (KEEP_THE_NAME_WHEN_CHANGE_IMAGE && !empty($old_file)) { $old_extension = strtolower(substr(strrchr($old_file, '.'), 1)); $filename = in_array($old_extension, $allowed_types) ? substr($old_file, 0, -strlen($old_extension)) : $old_file; $filename = (substr($filename, -1) == '.') ? $filename.$extension : $filename.'.'.$extension; } else { $filename = api_replace_dangerous_char($filename); if (PREFIX_IMAGE_FILENAME_WITH_UID) { $filename = uniqid('').'_'.$filename; } // We always prefix user photos with user ids, so on setting // api_get_setting('split_users_upload_directory') === 'true' // the correspondent directories to be found successfully. $filename = $group_id.'_'.$filename; } // Storing the new photos in 4 versions with various sizes. $small = self::resize_picture($source_file, 22); $medium = self::resize_picture($source_file, 85); $normal = self::resize_picture($source_file, 200); $big = new Image($source_file); // This is the original picture. $ok = $small && $small->send_image($path.'small_'.$filename) && $medium && $medium->send_image($path.'medium_'.$filename) && $normal && $normal->send_image($path.'big_'.$filename) && $big && $big->send_image($path.$filename); return $ok ? $filename : false; } /** * Gets the group picture URL or path from group ID (returns an array). * The return format is a complete path, enabling recovery of the directory * with dirname() or the file with basename(). This also works for the * functions dealing with the user's productions, as they are located in * the same directory. * @internal Don't delete this function * @param integer $id * @param string $type Type of path to return (can be 'system', 'web') * @param bool $preview Whether we want to have the directory name returned 'as if' there was a file or not * (in the case we want to know which directory to create - otherwise no file means no split subdir) * @param bool $anonymous If we want that the function returns the /main/img/unknown.jpg image set it at true * * @return array Array of 2 elements: 'dir' and 'file' which contain the dir and file as the name implies * if image does not exist it will return the unknow image if anonymous parameter is true if not it returns an empty */ public static function get_group_picture_path_by_id($id, $type = 'web', $preview = false, $anonymous = false) { switch ($type) { case 'system': // Base: absolute system path. $base = api_get_path(SYS_UPLOAD_PATH); break; case 'web': // Base: absolute web path. default: $base = api_get_path(WEB_UPLOAD_PATH); break; } $noPicturePath = array('dir' => $base.'img/', 'file' => 'unknown.jpg'); if (empty($id) || empty($type)) { return $anonymous ? $noPicturePath : array('dir' => '', 'file' => ''); } $id = intval($id); $group_table = Database :: get_main_table(TABLE_MAIN_GROUP); $sql = "SELECT picture_uri FROM $group_table WHERE id=".$id; $res = Database::query($sql); if (!Database::num_rows($res)) { return $anonymous ? $noPicturePath : array('dir' => '', 'file' => ''); } $user = Database::fetch_array($res); $picture_filename = trim($user['picture_uri']); if (api_get_setting('split_users_upload_directory') === 'true') { if (!empty($picture_filename)) { $dir = $base.'groups/'.substr($picture_filename, 0, 1).'/'.$id.'/'; } elseif ($preview) { $dir = $base.'groups/'.substr((string) $id, 0, 1).'/'.$id.'/'; } else { $dir = $base.'groups/'.$id.'/'; } } else { $dir = $base.'groups/'.$id.'/'; } if (empty($picture_filename) && $anonymous) { return $noPicturePath; } return array('dir' => $dir, 'file' => $picture_filename); } /** * Resize a picture * * @param string file picture * @param int size in pixels * @return obj image object */ public static function resize_picture($file, $max_size_for_picture) { $temp = new Image($file); $picture_infos = api_getimagesize($file); if ($picture_infos['width'] > $max_size_for_picture) { $thumbwidth = $max_size_for_picture; if (empty($thumbwidth) or $thumbwidth == 0) { $thumbwidth = $max_size_for_picture; } $new_height = round(($thumbwidth / $picture_infos['width']) * $picture_infos['height']); if ($new_height > $max_size_for_picture) $new_height = $thumbwidth; $temp->resize($thumbwidth, $new_height, 0); } return $temp; } /** * Gets the current group image * @param string $id group id * @param string $picture_file picture group name * @param string $height * @param string $size_picture picture size it can be small_, medium_or big_ * @param string $style css * @return array with the file and the style of an image i.e $array['file'] $array['style'] */ public static function get_picture_group( $id, $picture_file, $height, $size_picture = GROUP_IMAGE_SIZE_MEDIUM, $style = '' ) { $picture = array(); $picture['style'] = $style; if ($picture_file == 'unknown.jpg') { $picture['file'] = api_get_path(WEB_CODE_PATH).'img/'.$picture_file; return $picture; } switch ($size_picture) { case GROUP_IMAGE_SIZE_ORIGINAL: $size_picture = ''; break; case GROUP_IMAGE_SIZE_BIG: $size_picture = 'big_'; break; case GROUP_IMAGE_SIZE_MEDIUM: $size_picture = 'medium_'; break; case GROUP_IMAGE_SIZE_SMALL: $size_picture = 'small_'; break; default: $size_picture = 'medium_'; } $image_array_sys = self::get_group_picture_path_by_id($id, 'system', false, true); $image_array = self::get_group_picture_path_by_id($id, 'web', false, true); $file = $image_array_sys['dir'].$size_picture.$picture_file; if (file_exists($file)) { $picture['file'] = $image_array['dir'].$size_picture.$picture_file; $picture['style'] = ''; if ($height > 0) { $dimension = api_getimagesize($picture['file']); $margin = (($height - $dimension['width']) / 2); //@ todo the padding-top should not be here $picture['style'] = ' style="padding-top:'.$margin.'px; width:'.$dimension['width'].'px; height:'.$dimension['height'].';" '; } } else { $file = $image_array_sys['dir'].$picture_file; if (file_exists($file) && !is_dir($file)) { $picture['file'] = $image_array['dir'].$picture_file; } else { $picture['file'] = api_get_path(WEB_CODE_PATH).'img/unknown_group.png'; } } return $picture; } /** * @param int $group_id * @return string */ public static function delete_group_picture($group_id) { return self::update_group_picture($group_id); } /** * @param int $group_id * @param int $user_id * @return bool */ public static function is_group_admin($group_id, $user_id = 0) { if (empty($user_id)) { $user_id = api_get_user_id(); } $user_role = GroupPortalManager::get_user_group_role($user_id, $group_id); if (in_array($user_role, array(GROUP_USER_PERMISSION_ADMIN))) { return true; } else { return false; } } /** * @param int $group_id * @param int $user_id * @return bool */ public static function is_group_moderator($group_id, $user_id = 0) { if (empty($user_id)) { $user_id = api_get_user_id(); } $user_role = GroupPortalManager::get_user_group_role($user_id, $group_id); if (in_array($user_role, array(GROUP_USER_PERMISSION_ADMIN, GROUP_USER_PERMISSION_MODERATOR))) { return true; } else { return false; } } /** * @param int $group_id * @param int $user_id * @return bool */ public static function is_group_member($group_id, $user_id = 0) { if (empty($user_id)) { $user_id = api_get_user_id(); } $user_role = GroupPortalManager::get_user_group_role($user_id, $group_id); $permissions = array( GROUP_USER_PERMISSION_ADMIN, GROUP_USER_PERMISSION_MODERATOR, GROUP_USER_PERMISSION_READER, GROUP_USER_PERMISSION_HRM ); if (in_array($user_role, $permissions)) { return true; } else { return false; } } /** * Shows the left column of the group page * @param int $group_id * @param int $user_id * */ public static function show_group_column_information($group_id, $user_id, $show = '') { global $relation_group_title, $my_group_role; $html = ''; $group_info = GroupPortalManager::get_group_data($group_id); // My relation with the group is set here. $my_group_role = self::get_user_group_role($user_id, $group_id); //@todo this must be move to default.css for dev use only $html .= ''; //Loading group permission $links = ''; switch ($my_group_role) { case GROUP_USER_PERMISSION_READER: // I'm just a reader $relation_group_title = get_lang('IAmAReader'); $links .= '
  • '.Display::return_icon('invitation_friend.png', get_lang('InviteFriends'), array('hspace' => '6')).''.get_lang('InviteFriends').'
  • '; if (GroupPortalManager::canLeave($group_info)) { $links .= '
  • '.Display::return_icon('group_leave.png', get_lang('LeaveGroup'), array('hspace' => '6')).'
  • '; } break; case GROUP_USER_PERMISSION_ADMIN: $relation_group_title = get_lang('IAmAnAdmin'); $links .= '
  • '.Display::return_icon('group_edit.png', get_lang('EditGroup'), array('hspace' => '6')).''.get_lang('EditGroup').'
  • '; $links .= '
  • '.Display::return_icon('waiting_list.png', get_lang('WaitingList'), array('hspace' => '6')).''.get_lang('WaitingList').'
  • '; $links .= '
  • '.Display::return_icon('invitation_friend.png', get_lang('InviteFriends'), array('hspace' => '6')).''.get_lang('InviteFriends').'
  • '; if (GroupPortalManager::canLeave($group_info)) { $links .= '
  • '.Display::return_icon('group_leave.png', get_lang('LeaveGroup'), array('hspace' => '6')).'
  • '; } break; case GROUP_USER_PERMISSION_PENDING_INVITATION: // $links .= '
  • '.Display::return_icon('addd.gif', get_lang('YouHaveBeenInvitedJoinNow'), array('hspace'=>'6')).'
  • '; break; case GROUP_USER_PERMISSION_PENDING_INVITATION_SENT_BY_USER: $relation_group_title = get_lang('WaitingForAdminResponse'); break; case GROUP_USER_PERMISSION_MODERATOR: $relation_group_title = get_lang('IAmAModerator'); if ($group_info['visibility'] == GROUP_PERMISSION_CLOSED) { $links .= '
  • '.Display::return_icon('waiting_list.png', get_lang('WaitingList'), array('hspace' => '6')).''.get_lang('WaitingList').'
  • '; } $links .= '
  • '.Display::return_icon('invitation_friend.png', get_lang('InviteFriends'), array('hspace' => '6')).''.get_lang('InviteFriends').'
  • '; if (GroupPortalManager::canLeave($group_info)) { $links .= '
  • '.Display::return_icon('group_leave.png', get_lang('LeaveGroup'), array('hspace' => '6')).'
  • '; } break; case GROUP_USER_PERMISSION_HRM: $relation_group_title = get_lang('IAmAHRM'); $links .= '
  • '.Display::return_icon('compose_message.png', get_lang('NewTopic'), array('hspace' => '6')).'
  • '; $links .= '
  • '.Display::return_icon('message_list.png', get_lang('MessageList'), array('hspace' => '6')).''.get_lang('MessageList').'
  • '; $links .= '
  • '.Display::return_icon('invitation_friend.png', get_lang('InviteFriends'), array('hspace' => '6')).''.get_lang('InviteFriends').'
  • '; $links .= '
  • '.Display::return_icon('member_list.png', get_lang('MemberList'), array('hspace' => '6')).''.get_lang('MemberList').'
  • '; $links .= '
  • '.Display::return_icon('delete_data.gif', get_lang('LeaveGroup'), array('hspace' => '6')).'
  • '; break; default: //$links .= '
  • '.Display::return_icon('addd.gif', get_lang('JoinGroup'), array('hspace'=>'6')).'
  • '; break; } if (!empty($links)) { $html .= ''; } return $html; } /** * @param int $group_id * @param int $topic_id */ function delete_topic($group_id, $topic_id) { $table_message = Database::get_main_table(TABLE_MESSAGE); $topic_id = intval($topic_id); $group_id = intval($group_id); $sql = "UPDATE $table_message SET msg_status=3 WHERE group_id = $group_id AND (id = '$topic_id' OR parent_id = $topic_id) "; Database::query($sql); } /** * @param int $user_id * @param int $relation_type * @param bool $with_image * @return int */ public static function get_groups_by_user_count($user_id = null, $relation_type = GROUP_USER_PERMISSION_READER, $with_image = false) { $table_group_rel_user = Database::get_main_table(TABLE_MAIN_USER_REL_GROUP); $tbl_group = Database::get_main_table(TABLE_MAIN_GROUP); $user_id = intval($user_id); if ($relation_type == 0) { $where_relation_condition = ''; } else { $relation_type = intval($relation_type); $where_relation_condition = "AND gu.relation_type = $relation_type "; } $sql = "SELECT count(g.id) as count FROM $tbl_group g INNER JOIN $table_group_rel_user gu ON gu.group_id = g.id WHERE gu.user_id = $user_id $where_relation_condition "; $result = Database::query($sql); if (Database::num_rows($result) > 0) { $row = Database::fetch_array($result, 'ASSOC'); return $row['count']; } return 0; } /** * @param FormValidator $form * @param array * * @return FormValidator */ public static function setGroupForm($form, $groupData = array()) { // Name $form->addElement('text', 'name', get_lang('Name'), array('maxlength'=>120)); $form->applyFilter('name', 'html_filter'); $form->applyFilter('name', 'trim'); $form->addRule('name', get_lang('ThisFieldIsRequired'), 'required'); // Description $form->addElement( 'textarea', 'description', get_lang('Description'), array( 'cols' => 58, 'onKeyDown' => "textarea_maxlength()", 'onKeyUp' => "textarea_maxlength()", ) ); $form->applyFilter('description', 'html_filter'); $form->applyFilter('description', 'trim'); $form->addRule('name', '', 'maxlength', 255); // Url $form->addElement('text', 'url', 'URL'); $form->applyFilter('url', 'html_filter'); $form->applyFilter('url', 'trim'); // Picture $form->addElement('file', 'picture', get_lang('AddPicture')); $allowed_picture_types = array ('jpg', 'jpeg', 'png', 'gif'); $form->addRule('picture', get_lang('OnlyImagesAllowed').' ('.implode(',', $allowed_picture_types).')', 'filetype', $allowed_picture_types); if (!empty($groupData)) { if (isset($groupData['picture_uri']) && strlen($groupData['picture_uri']) > 0) { $form->addElement('checkbox', 'delete_picture', '', get_lang('DelImage')); } } // Status $status = array(); $status[GROUP_PERMISSION_OPEN] = get_lang('Open'); $status[GROUP_PERMISSION_CLOSED] = get_lang('Closed'); $form->addElement('select', 'visibility', get_lang('GroupPermissions'), $status, array()); if (!empty($groupData)) { if (self::canLeaveFeatureEnabled($groupData)) { $form->addElement('checkbox', 'allow_members_leave_group', '', get_lang('AllowMemberLeaveGroup')); } // Set default values $form->setDefaults($groupData); } return $form; } /** * Check if the can leave feature exists. * @param array $groupData * @return bool */ public static function canLeaveFeatureEnabled($groupData) { if (isset($groupData['allow_members_leave_group'])) { return true; } return false; } /** * @param array $groupData * @return bool */ public static function canLeave($groupData) { if (self::canLeaveFeatureEnabled($groupData)) { return $groupData['allow_members_leave_group'] == 1 ? true : false; } return true; } /** * Get the group member list by a user and his group role * @param int $userId The user ID * @param int $relationType Optional. The relation type. GROUP_USER_PERMISSION_ADMIN by default * @param boolean $includeSubgroupsUsers Optional. Whether include the users from subgroups * @return array */ public static function getGroupUsersByUser( $userId, $relationType = GROUP_USER_PERMISSION_ADMIN, $includeSubgroupsUsers = true ) { $userId = intval($userId); $groups = GroupPortalManager::get_groups_by_user($userId, $relationType); $groupsId = array_keys($groups); $subgroupsId = []; $userIdList = []; if ($includeSubgroupsUsers) { foreach ($groupsId as $groupId) { $subgroupsId = array_merge($subgroupsId, GroupPortalManager::getGroupsByDepthLevel($groupId)); } $groupsId = array_merge($groupsId, $subgroupsId); } $groupsId = array_unique($groupsId); if (empty($groupsId)) { return []; } foreach ($groupsId as $groupId) { $groupUsers = GroupPortalManager::get_users_by_group($groupId); if (empty($groupUsers)) { continue; } foreach ($groupUsers as $member) { if ($member['user_id'] == $userId) { continue; } $userIdList[] = intval($member['user_id']); } } return array_unique($userIdList); } }