Internal: Add GroupCategoryRepository, use resources to get groups

pull/3513/head
Julio Montoya 5 years ago
parent dbcd95abda
commit 2e50fd64e4
  1. 21
      public/main/group/group.php
  2. 9
      public/main/group/group_category.php
  3. 7
      public/main/group/group_creation.php
  4. 1
      public/main/group/group_space.php
  5. 6
      public/main/group/member_settings.php
  6. 2
      public/main/inc/lib/course.lib.php
  7. 457
      public/main/inc/lib/groupmanager.lib.php
  8. 10
      src/CoreBundle/EventListener/CourseListener.php
  9. 9
      src/CoreBundle/Framework/Container.php
  10. 89
      src/CourseBundle/Entity/CGroup.php
  11. 98
      src/CourseBundle/Entity/CGroupCategory.php
  12. 11
      src/CourseBundle/Repository/CGroupCategoryRepository.php

@ -224,22 +224,21 @@ if (api_is_allowed_to_edit(false, true)) {
$actionsRight = GroupManager::getSearchForm(); $actionsRight = GroupManager::getSearchForm();
$toolbar = Display::toolbarAction('toolbar-groups', [$actionsLeft, $actionsRight]); $toolbar = Display::toolbarAction('toolbar-groups', [$actionsLeft, $actionsRight]);
$group_cats = GroupManager::get_categories(api_get_course_id()); $categories = GroupManager::get_categories();
echo $toolbar; echo $toolbar;
echo UserManager::getUserSubscriptionTab(3); echo UserManager::getUserSubscriptionTab(3);
/* List all categories */ /* List all categories */
if ('true' === api_get_setting('allow_group_categories')) { if ('true' === api_get_setting('allow_group_categories')) {
$defaultCategory = [ $defaultCategory = [
'id' => 0, 'iid' => null,
'iid' => 0,
'description' => '', 'description' => '',
'title' => get_lang('Default groups'), 'title' => get_lang('Default groups'),
]; ];
$group_cats = array_merge([$defaultCategory], $group_cats); $categories = array_merge([$defaultCategory], $categories);
foreach ($group_cats as $index => $category) { foreach ($categories as $index => $category) {
$categoryId = $category['id']; $categoryId = $category['iid'];
$group_list = GroupManager::get_group_list($categoryId); $group_list = GroupManager::get_group_list($categoryId);
$groupToShow = GroupManager::process_groups($group_list, $categoryId); $groupToShow = GroupManager::process_groups($group_list, $categoryId);
@ -268,11 +267,13 @@ if ('true' === api_get_setting('allow_group_categories')) {
); );
// Move // Move
if (0 != $index) { if (0 != $index) {
$actions .= ' <a href="group.php?'.api_get_cidreq().'&action=swap_cat_order&id1='.$categoryId.'&id2='.$group_cats[$index - 1]['id'].'">'. $actions .= ' <a
href="group.php?'.api_get_cidreq().'&action=swap_cat_order&id1='.$categoryId.'&id2='.$categories[$index - 1]['iid'].'">'.
Display::return_icon('up.png', '&nbsp;', '', ICON_SIZE_SMALL).'</a>'; Display::return_icon('up.png', '&nbsp;', '', ICON_SIZE_SMALL).'</a>';
} }
if ($index != count($group_cats) - 1) { if ($index != count($categories) - 1) {
$actions .= ' <a href="group.php?'.api_get_cidreq().'&action=swap_cat_order&id1='.$categoryId.'&id2='.$group_cats[$index + 1]['id'].'">'. $actions .= ' <a
href="group.php?'.api_get_cidreq().'&action=swap_cat_order&id1='.$categoryId.'&id2='.$categories[$index + 1]['iid'].'">'.
Display::return_icon('down.png', '&nbsp;', '', ICON_SIZE_SMALL).'</a>'; Display::return_icon('down.png', '&nbsp;', '', ICON_SIZE_SMALL).'</a>';
} }
} }
@ -291,7 +292,7 @@ if ('true' === api_get_setting('allow_group_categories')) {
echo GroupManager::process_groups(GroupManager::get_group_list()); echo GroupManager::process_groups(GroupManager::get_group_list());
} }
if (!isset($_GET['origin']) || 'learnpath' != $_GET['origin']) { if (!isset($_GET['origin']) || 'learnpath' !== $_GET['origin']) {
Display::display_footer(); Display::display_footer();
} }

@ -97,17 +97,10 @@ if (isset($_GET['id'])) {
$form = new FormValidator( $form = new FormValidator(
'group_category', 'group_category',
'post', 'post',
api_get_self().'?id='.$category['id'].'&'.api_get_cidreq() api_get_self().'?id='.$category['iid'].'&'.api_get_cidreq()
); );
$form->addElement('hidden', 'id'); $form->addElement('hidden', 'id');
} else { } else {
// Checks if the field was created in the table Category. It creates it if is neccesary
$table_category = Database::get_course_table(TABLE_GROUP_CATEGORY);
if (!Database::query("SELECT wiki_state FROM $table_category WHERE c_id = $course_id")) {
$sql = "ALTER TABLE $table_category ADD wiki_state tinyint(3) UNSIGNED NOT NULL default '1'
WHERE c_id = $course_id";
Database::query($sql);
}
// Create a new category // Create a new category
$action = 'add_category'; $action = 'add_category';
$form = new FormValidator('group_category'); $form = new FormValidator('group_category');

@ -135,7 +135,7 @@ if (isset($_POST['number_of_groups'])) {
$group_id = GroupManager::get_number_of_groups() + 1; $group_id = GroupManager::get_number_of_groups() + 1;
$cat_options = []; $cat_options = [];
foreach ($group_categories as $index => $category) { foreach ($group_categories as $index => $category) {
$cat_options[$category['id']] = $category['title']; $cat_options[$category['iid']] = $category['title'];
} }
$form = new FormValidator('create_groups_step2', 'POST', api_get_self().'?'.api_get_cidreq()); $form = new FormValidator('create_groups_step2', 'POST', api_get_self().'?'.api_get_cidreq());
@ -257,9 +257,10 @@ EOT;
if (!empty($groups)) { if (!empty($groups)) {
$base_group_options = []; $base_group_options = [];
foreach ($groups as $index => $group) { foreach ($groups as $index => $group) {
$number_of_students = GroupManager::number_of_students($group['id']); $groupId = $group['iid'];
$number_of_students = GroupManager::number_of_students($groupId);
if ($number_of_students > 0) { if ($number_of_students > 0) {
$base_group_options[$group['id']] = $base_group_options[$groupId] =
$group['name'].' ('.$number_of_students.' '.get_lang('Users').')'; $group['name'].' ('.$number_of_students.' '.get_lang('Users').')';
} }
} }

@ -17,6 +17,7 @@ require_once api_get_path(SYS_CODE_PATH).'forum/forumfunction.inc.php';
$group_id = api_get_group_id(); $group_id = api_get_group_id();
$user_id = api_get_user_id(); $user_id = api_get_user_id();
$current_group = GroupManager::get_group_properties($group_id); $current_group = GroupManager::get_group_properties($group_id);
$group_id = $current_group['iid']; $group_id = $current_group['iid'];
if (empty($current_group)) { if (empty($current_group)) {

@ -192,6 +192,10 @@ if ($form->validate()) {
// Returning to the group area (note: this is inconsistent with the rest of chamilo) // Returning to the group area (note: this is inconsistent with the rest of chamilo)
$cat = GroupManager::get_category_from_group($current_group['iid']); $cat = GroupManager::get_category_from_group($current_group['iid']);
$categoryId = 0;
if ($cat) {
$categoryId = $cat['iid'];
}
$max_member = $current_group['max_student']; $max_member = $current_group['max_student'];
if (isset($_POST['group_members']) && if (isset($_POST['group_members']) &&
@ -202,7 +206,7 @@ if ($form->validate()) {
header('Location: group.php?'.api_get_cidreq(true, false)); header('Location: group.php?'.api_get_cidreq(true, false));
} else { } else {
Display::addFlash(Display::return_message(get_lang('Group settings modified'), 'success')); Display::addFlash(Display::return_message(get_lang('Group settings modified'), 'success'));
header('Location: group.php?'.api_get_cidreq(true, false).'&category='.$cat['id']); header('Location: group.php?'.api_get_cidreq(true, false).'&category='.$categoryId);
} }
exit; exit;
} }

@ -2567,7 +2567,7 @@ class CourseManager
self::create_database_dump($code); self::create_database_dump($code);
// Cleaning group categories // Cleaning group categories
$groupCategories = GroupManager::get_categories($course['code']); $groupCategories = GroupManager::get_categories($courseEntity);
if (!empty($groupCategories)) { if (!empty($groupCategories)) {
foreach ($groupCategories as $category) { foreach ($groupCategories as $category) {
GroupManager::delete_category($category['iid'], $course['code']); GroupManager::delete_category($category['iid'], $course['code']);

@ -1,10 +1,11 @@
<?php <?php
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Entity\ResourceLink;
use Chamilo\CoreBundle\Framework\Container; use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CourseBundle\Entity\CGroup; use Chamilo\CourseBundle\Entity\CGroup;
use Chamilo\CourseBundle\Entity\CGroupRelUser; use Chamilo\CourseBundle\Entity\CGroupCategory;
/** /**
* This library contains some functions for group-management. * This library contains some functions for group-management.
@ -102,11 +103,38 @@ class GroupManager
$getCount = false $getCount = false
) { ) {
$course_info = empty($course_info) ? api_get_course_info() : $course_info; $course_info = empty($course_info) ? api_get_course_info() : $course_info;
if (empty($course_info)) { if (empty($course_info)) {
return []; return [];
} }
$sessionId = empty($sessionId) ? api_get_session_id() : (int) $sessionId; $sessionId = empty($sessionId) ? api_get_session_id() : (int) $sessionId;
$course_id = $course_info['real_id']; $course_id = $course_info['real_id'];
$repo = Container::getGroupRepository();
$course = api_get_course_entity($course_id);
$session = api_get_session_entity($sessionId);
$group = api_get_group_entity(api_get_group_id());
$qb = $repo->getResourcesByCourse($course, $session, $group);
if (null === $categoryId) {
$qb
->andWhere('resource.category is NULL');
} else {
$qb
->andWhere('resource.category = :category')
->setParameter('category', $categoryId);
}
if ($getCount) {
$qb->select('count(resource)');
return $qb->getQuery()->getSingleScalarResult();
}
return $qb->getQuery()->getArrayResult();
$table_group = Database::get_course_table(TABLE_GROUP); $table_group = Database::get_course_table(TABLE_GROUP);
$select = ' g.iid, $select = ' g.iid,
@ -117,7 +145,6 @@ class GroupManager
g.secret_directory, g.secret_directory,
g.self_registration_allowed, g.self_registration_allowed,
g.self_unregistration_allowed, g.self_unregistration_allowed,
g.session_id,
g.status'; g.status';
if ($getCount) { if ($getCount) {
$select = ' DISTINCT count(g.iid) as count '; $select = ' DISTINCT count(g.iid) as count ';
@ -132,17 +159,19 @@ class GroupManager
$sql .= " AND g.category_id = '".intval($categoryId)."' "; $sql .= " AND g.category_id = '".intval($categoryId)."' ";
$session_condition = api_get_session_condition($sessionId); $session_condition = api_get_session_condition($sessionId);
if (!empty($session_condition)) { if (!empty($session_condition)) {
$sql .= $session_condition; //$sql .= $session_condition;
} }
} else { } else {
$session_condition = api_get_session_condition($sessionId, true); $session_condition = api_get_session_condition($sessionId, true);
} }
$session_condition = '';
if (!is_null($status)) { if (!is_null($status)) {
$sql .= " AND g.status = '".intval($status)."' "; $sql .= " AND g.status = '".intval($status)."' ";
} }
$sql .= " AND g.c_id = $course_id "; //$sql .= " AND g.c_id = $course_id ";
if (!empty($session_condition)) { if (!empty($session_condition)) {
$sql .= $session_condition; $sql .= $session_condition;
@ -225,16 +254,18 @@ class GroupManager
$documentAccess = isset($category['document_access']) ? $category['document_access'] : 0; $documentAccess = isset($category['document_access']) ? $category['document_access'] : 0;
} }
$table_group = Database::get_course_table(TABLE_GROUP);
$user = api_get_user_entity(api_get_user_id());
$course = api_get_course_entity($course_id); $course = api_get_course_entity($course_id);
$session = api_get_session_entity($session_id); $session = api_get_session_entity($session_id);
$category = null;
if (!empty($category_id)) {
$category = Container::getGroupCategoryRepository()->find($category_id);
}
$group = new CGroup(); $group = new CGroup();
$group $group
->setName($name) ->setName($name)
->setCourse($course) ->setCategory($category)
->setCategoryId($category_id)
->setMaxStudent($places) ->setMaxStudent($places)
->setDocState($docState) ->setDocState($docState)
->setCalendarState($calendarState) ->setCalendarState($calendarState)
@ -245,15 +276,16 @@ class GroupManager
->setChatState($chatState) ->setChatState($chatState)
->setSelfRegistrationAllowed($selfRegAllowed) ->setSelfRegistrationAllowed($selfRegAllowed)
->setSelfUnregistrationAllowed($selfUnregAllwoed) ->setSelfUnregistrationAllowed($selfUnregAllwoed)
->setSessionId($session_id)
->setDocumentAccess($documentAccess) ->setDocumentAccess($documentAccess)
->setParent($course) ->setParent($course)
->addCourseLink($course, $session) ->addCourseLink($course, $session)
; ;
$repo = Container::getGroupRepository(); $repo = Container::getGroupRepository();
$repo->getEntityManager()->persist($group);
$repo->getEntityManager()->flush(); $repo->getEntityManager()->flush();
$lastId = $group->getIid(); $lastId = $group->getIid();
if ($lastId) { if ($lastId) {
/*$desired_dir_name = '/'.api_replace_dangerous_char($name).'_groupdocs'; /*$desired_dir_name = '/'.api_replace_dangerous_char($name).'_groupdocs';
@ -348,7 +380,7 @@ class GroupManager
$users = self::get_users($group_id); $users = self::get_users($group_id);
$group_ids = []; $group_ids = [];
for ($group_nr = 1; $group_nr <= $number_of_groups; $group_nr++) { for ($group_nr = 1; $group_nr <= $number_of_groups; ++$group_nr) {
$group_ids[] = self::create_group( $group_ids[] = self::create_group(
get_lang('Subgroup').' '.$group_nr, get_lang('Subgroup').' '.$group_nr,
$category_id, $category_id,
@ -365,7 +397,7 @@ class GroupManager
$user_id, $user_id,
$groupInfo $groupInfo
); );
$members[$group_ids[$groupId]]++; ++$members[$group_ids[$groupId]];
} }
foreach ($members as $group_id => $places) { foreach ($members as $group_id => $places) {
@ -441,6 +473,7 @@ class GroupManager
self::unsubscribe_all_tutors($groupInfo); self::unsubscribe_all_tutors($groupInfo);
if (!empty($groupInfo['secret_directory'])) { if (!empty($groupInfo['secret_directory'])) {
/*
$directory = $groupInfo['secret_directory']; $directory = $groupInfo['secret_directory'];
// move group-documents to garbage // move group-documents to garbage
$source_directory = api_get_path(SYS_COURSE_PATH).$course_info['path']."/document".$directory; $source_directory = api_get_path(SYS_COURSE_PATH).$course_info['path']."/document".$directory;
@ -461,14 +494,14 @@ class GroupManager
// Rename // Rename
rename($source_directory, $destination_dir); rename($source_directory, $destination_dir);
} }
} }*/
} }
$em $em
->createQuery( ->createQuery(
'DELETE FROM ChamiloCourseBundle:CForumForum f WHERE f.cId = :course AND f.forumOfGroup = :group' 'DELETE FROM ChamiloCourseBundle:CForumForum f WHERE f.forumOfGroup = :group'
) )
->execute(['course' => $course_id, 'group' => $groupId]); ->execute(['group' => $groupId]);
// Delete item properties of this group. // Delete item properties of this group.
// to_group_id is related to c_group_info.iid // to_group_id is related to c_group_info.iid
@ -531,16 +564,14 @@ class GroupManager
/** /**
* Get group properties. * Get group properties.
* *
* @param int $group_id the group from which properties are requested * @param int $group_id the group from which properties are requested
* @param bool $useIid
* *
* @return array All properties. Array-keys are: * @return array All properties. Array-keys are:
* name, tutor_id, description, maximum_number_of_students, * name, tutor_id, description, maximum_number_of_students,
* directory and visibility of tools * directory and visibility of tools
*/ */
public static function get_group_properties($group_id, $useIid = false) public static function get_group_properties($group_id)
{ {
$course_id = api_get_course_int_id();
$group_id = (int) $group_id; $group_id = (int) $group_id;
if (empty($group_id)) { if (empty($group_id)) {
@ -548,19 +579,16 @@ class GroupManager
} }
$table_group = Database::get_course_table(TABLE_GROUP); $table_group = Database::get_course_table(TABLE_GROUP);
$sql = "SELECT * FROM $table_group $sql = "SELECT * FROM $table_group
WHERE c_id = $course_id AND id = ".$group_id; WHERE iid = ".$group_id;
if ($useIid) {
$sql = "SELECT * FROM $table_group
WHERE c_id = $course_id AND iid = ".$group_id;
}
$db_result = Database::query($sql); $db_result = Database::query($sql);
$db_object = Database::fetch_object($db_result); $db_object = Database::fetch_object($db_result);
$result = []; $result = [];
if ($db_object) { if ($db_object) {
$result['id'] = $db_object->id; $result['id'] = $db_object->iid;
$result['iid'] = $db_object->iid; $result['iid'] = $db_object->iid;
$result['name'] = $db_object->name; $result['name'] = $db_object->name;
$result['status'] = $db_object->status; $result['status'] = $db_object->status;
@ -651,7 +679,7 @@ class GroupManager
if (!empty($categoryId)) { if (!empty($categoryId)) {
$sql .= " AND category_id = $categoryId"; $sql .= " AND category_id = $categoryId";
} }
$sql .= " ORDER BY name"; $sql .= ' ORDER BY name';
$result = Database::query($sql); $result = Database::query($sql);
return Database::store_result($result, 'ASSOC'); return Database::store_result($result, 'ASSOC');
@ -683,14 +711,14 @@ class GroupManager
$group_id, $group_id,
$name, $name,
$description, $description,
$maximum_number_of_students, $maxStudent,
$doc_state, $docState,
$work_state, $workState,
$calendar_state, $calendarState,
$announcements_state, $anonuncementState,
$forum_state, $forumState,
$wiki_state, $wikiState,
$chat_state, $chatState,
$selfRegistrationAllowed, $selfRegistrationAllowed,
$selfUnRegistrationAllowed, $selfUnRegistrationAllowed,
$categoryId = null, $categoryId = null,
@ -700,48 +728,50 @@ class GroupManager
$table_forum = Database::get_course_table(TABLE_FORUM); $table_forum = Database::get_course_table(TABLE_FORUM);
$categoryId = (int) $categoryId; $categoryId = (int) $categoryId;
$group_id = (int) $group_id; $group_id = (int) $group_id;
$courseId = api_get_course_int_id(); $repo = Container::getGroupRepository();
$allowDocumentAccess = api_get_configuration_value('group_document_access'); /** @var CGroup $group */
$documentCondition = ''; $group = $repo->find($group_id);
if ($allowDocumentAccess) {
$documentAccess = (int) $documentAccess; $category = null;
$documentCondition = " document_access = $documentAccess, "; if (!empty($categoryId)) {
$category = Container::getGroupCategoryRepository()->find($categoryId);
} }
$sql = "UPDATE ".$table_group." SET $group
name='".Database::escape_string(trim($name))."', ->setName($name)
doc_state = '".Database::escape_string($doc_state)."', ->setCategory($category)
work_state = '".Database::escape_string($work_state)."', ->setMaxStudent($maxStudent)
calendar_state = '".Database::escape_string($calendar_state)."', ->setDocState($docState)
announcements_state = '".Database::escape_string($announcements_state)."', ->setCalendarState($calendarState)
forum_state = '".Database::escape_string($forum_state)."', ->setWorkState($workState)
wiki_state = '".Database::escape_string($wiki_state)."', ->setForumState($forumState)
chat_state = '".Database::escape_string($chat_state)."', ->setWikiState($wikiState)
description ='".Database::escape_string(trim($description))."', ->setAnnouncementsState($anonuncementState)
max_student = '".Database::escape_string($maximum_number_of_students)."', ->setChatState($chatState)
self_registration_allowed = '".Database::escape_string($selfRegistrationAllowed)."', ->setSelfRegistrationAllowed($selfRegistrationAllowed)
self_unregistration_allowed = '".Database::escape_string($selfUnRegistrationAllowed)."', ->setSelfUnregistrationAllowed($selfUnRegistrationAllowed)
$documentCondition ->setDocumentAccess($documentAccess)
category_id = ".$categoryId." ;
WHERE c_id = $courseId AND id=".$group_id;
$result = Database::query($sql); $repo->getEntityManager()->persist($group);
$repo->getEntityManager()->flush();
/* Here we are updating a field in the table forum_forum that perhaps /* Here we are updating a field in the table forum_forum that perhaps
duplicates the table group_info.forum_state cvargas*/ duplicates the table group_info.forum_state cvargas*/
$forum_state = (int) $forum_state; $forumState = (int) $forumState;
$sql2 = "UPDATE ".$table_forum." SET "; $sql2 = "UPDATE $table_forum SET ";
if (1 === $forum_state) { if (1 === $forumState) {
$sql2 .= " forum_group_public_private='public' "; $sql2 .= " forum_group_public_private='public' ";
} elseif (2 === $forum_state) { } elseif (2 === $forumState) {
$sql2 .= " forum_group_public_private='private' "; $sql2 .= " forum_group_public_private='private' ";
} elseif (0 === $forum_state) { } elseif (0 === $forumState) {
$sql2 .= " forum_group_public_private='unavailable' "; $sql2 .= " forum_group_public_private='unavailable' ";
} }
$sql2 .= " WHERE c_id = $courseId AND forum_of_group=".$group_id; $sql2 .= ' WHERE forum_of_group='.$group_id;
Database::query($sql2); Database::query($sql2);
return $result; return true;
} }
/** /**
@ -751,6 +781,17 @@ class GroupManager
*/ */
public static function get_number_of_groups() public static function get_number_of_groups()
{ {
$repo = Container::getGroupRepository();
$course = api_get_course_entity(api_get_course_int_id());
$session = api_get_session_entity(api_get_session_id());
$group = api_get_group_entity(api_get_group_id());
$qb = $repo->getResourcesByCourse($course, $session, $group);
$qb->select('count(resource)');
return $qb->getQuery()->getSingleScalarResult();
$courseId = api_get_course_int_id(); $courseId = api_get_course_int_id();
$table = Database::get_course_table(TABLE_GROUP); $table = Database::get_course_table(TABLE_GROUP);
$sql = "SELECT COUNT(id) AS number_of_groups $sql = "SELECT COUNT(id) AS number_of_groups
@ -764,13 +805,22 @@ class GroupManager
/** /**
* Get all categories. * Get all categories.
*
* @param string $course_code The course (default = current course)
*
* @return array
*/ */
public static function get_categories($course_code = null) public static function get_categories(Course $course = null): array
{ {
$repo = Container::getGroupCategoryRepository();
if (null === $course) {
$course = api_get_course_entity(api_get_course_int_id());
}
$session = api_get_session_entity(api_get_session_id());
$group = api_get_group_entity(api_get_group_id());
$qb = $repo->getResourcesByCourse($course, $session, $group);
return $qb->getQuery()->getArrayResult();
$course_info = api_get_course_info($course_code); $course_info = api_get_course_info($course_code);
$courseId = $course_info['real_id']; $courseId = $course_info['real_id'];
$table = Database::get_course_table(TABLE_GROUP_CATEGORY); $table = Database::get_course_table(TABLE_GROUP_CATEGORY);
@ -805,7 +855,7 @@ class GroupManager
$id = intval($id); $id = intval($id);
$table = Database::get_course_table(TABLE_GROUP_CATEGORY); $table = Database::get_course_table(TABLE_GROUP_CATEGORY);
$sql = "SELECT * FROM $table $sql = "SELECT * FROM $table
WHERE c_id = $courseId AND id = $id WHERE iid = $id
LIMIT 1"; LIMIT 1";
$res = Database::query($sql); $res = Database::query($sql);
@ -871,11 +921,10 @@ class GroupManager
} }
$courseId = $course_info['real_id']; $courseId = $course_info['real_id'];
$sql = "SELECT gc.* FROM $table_group_cat gc, $table_group g $sql = "SELECT gc.* FROM $table_group_cat gc
INNER JOIN $table_group g
ON (gc.iid = g.category_id)
WHERE WHERE
gc.c_id = $courseId AND
g.c_id = $courseId AND
gc.id = g.category_id AND
g.iid = $group_id g.iid = $group_id
LIMIT 1"; LIMIT 1";
$res = Database::query($sql); $res = Database::query($sql);
@ -951,63 +1000,59 @@ class GroupManager
public static function create_category( public static function create_category(
$title, $title,
$description, $description,
$doc_state, $docState,
$work_state, $workState,
$calendar_state, $calendarState,
$announcements_state, $anonuncementState,
$forum_state, $forumState,
$wiki_state, $wikiState,
$chat_state = 1, $chatState = 1,
$selfRegistrationAllowed = 0, $selfRegistrationAllowed = 0,
$selfUnRegistrationAllowed = 0, $selfUnRegistrationAllowed = 0,
$maximum_number_of_students = 8, $maxStudent = 8,
$groups_per_user = 0, $groupsPerUser = 0,
$documentAccess = 0 $documentAccess = 0
) { ) {
if (empty($title)) { if (empty($title)) {
return false; return false;
} }
$table = Database::get_course_table(TABLE_GROUP_CATEGORY); /*$sql = "SELECT MAX(display_order)+1 as new_order
$course_id = api_get_course_int_id();
$sql = "SELECT MAX(display_order)+1 as new_order
FROM $table FROM $table
WHERE c_id = $course_id "; WHERE c_id = $course_id ";
$res = Database::query($sql); $res = Database::query($sql);
$obj = Database::fetch_object($res); $obj = Database::fetch_object($res);
if (!isset($obj->new_order)) { if (!isset($obj->new_order)) {
$obj->new_order = 1; $obj->new_order = 1;
} }*/
$params = [ $course = api_get_course_entity(api_get_course_int_id());
'c_id' => $course_id, $session = api_get_session_entity(api_get_session_id());
'title' => $title,
'display_order' => $obj->new_order,
'description' => $description,
'doc_state' => $doc_state,
'work_state' => $work_state,
'calendar_state' => $calendar_state,
'announcements_state' => $announcements_state,
'forum_state' => $forum_state,
'wiki_state' => $wiki_state,
'chat_state' => $chat_state,
'groups_per_user' => $groups_per_user,
'self_reg_allowed' => $selfRegistrationAllowed,
'self_unreg_allowed' => $selfUnRegistrationAllowed,
'max_student' => $maximum_number_of_students,
];
$allowDocumentAccess = api_get_configuration_value('group_category_document_access'); $category = new CGroupCategory();
if ($allowDocumentAccess) { $category
$params['document_access'] = $documentAccess; ->setTitle($title)
} ->setDescription($description)
->setMaxStudent($maxStudent)
->setDocState($docState)
->setCalendarState($calendarState)
->setWorkState($workState)
->setForumState($forumState)
->setWikiState($wikiState)
->setAnnouncementsState($anonuncementState)
->setChatState($chatState)
->setSelfRegAllowed($selfRegistrationAllowed)
->setSelfUnregAllowed($selfUnRegistrationAllowed)
->setDocumentAccess($documentAccess)
->setGroupsPerUser($groupsPerUser)
->setParent($course)
->addCourseLink($course, $session)
;
$categoryId = Database::insert($table, $params); $repo = Container::getGroupCategoryRepository();
if ($categoryId) { $repo->getEntityManager()->persist($category);
return $categoryId; $repo->getEntityManager()->flush();
}
return false; return $category->getIid();
} }
/** /**
@ -1058,7 +1103,7 @@ class GroupManager
$documentCondition = " document_access = $documentAccess, "; $documentCondition = " document_access = $documentAccess, ";
} }
$sql = "UPDATE ".$table." SET $sql = 'UPDATE '.$table." SET
title='".Database::escape_string($title)."', title='".Database::escape_string($title)."',
description='".Database::escape_string($description)."', description='".Database::escape_string($description)."',
doc_state = '".Database::escape_string($doc_state)."', doc_state = '".Database::escape_string($doc_state)."',
@ -1073,7 +1118,7 @@ class GroupManager
self_unreg_allowed = '".Database::escape_string($selfUnRegistrationAllowed)."', self_unreg_allowed = '".Database::escape_string($selfUnRegistrationAllowed)."',
$documentCondition $documentCondition
max_student = ".intval($maximum_number_of_students)." max_student = ".intval($maximum_number_of_students)."
WHERE c_id = $courseId AND id = $id"; WHERE iid = $id";
Database::query($sql); Database::query($sql);
@ -1083,7 +1128,7 @@ class GroupManager
if (!empty($groups)) { if (!empty($groups)) {
foreach ($groups as $group) { foreach ($groups as $group) {
self::set_group_properties( self::set_group_properties(
$group['id'], $group['iid'],
$group['name'], $group['name'],
$group['description'], $group['description'],
$maximum_number_of_students, $maximum_number_of_students,
@ -1107,27 +1152,32 @@ class GroupManager
* Returns the number of groups of the user with the greatest number of * Returns the number of groups of the user with the greatest number of
* subscriptions in the given category. * subscriptions in the given category.
*/ */
public static function get_current_max_groups_per_user( public static function get_current_max_groups_per_user($category_id = null, $course_code = null)
$category_id = null, {
$course_code = null
) {
$course_info = api_get_course_info($course_code); $course_info = api_get_course_info($course_code);
$group_table = Database::get_course_table(TABLE_GROUP); $group_table = Database::get_course_table(TABLE_GROUP);
$group_user_table = Database::get_course_table(TABLE_GROUP_USER); $group_user_table = Database::get_course_table(TABLE_GROUP_USER);
$sql = 'SELECT COUNT(gu.group_id) AS current_max $sql = "SELECT COUNT(gu.group_id) AS current_max
FROM '.$group_user_table.' gu, '.$group_table.' g FROM $group_user_table gu
WHERE g.c_id = '.$course_info['real_id'].' INNER JOIN $group_table g
AND gu.c_id = g.c_id ON (gu.group_id = g.iid)
AND gu.group_id = g.iid '; WHERE 1= 1 ";
if (null != $category_id) { if (null != $category_id) {
$category_id = intval($category_id); $category_id = intval($category_id);
$sql .= ' AND g.category_id = '.$category_id; $sql .= ' AND g.category_id = '.$category_id;
} }
$sql .= ' GROUP BY gu.user_id ORDER BY current_max DESC LIMIT 1'; $sql .= ' GROUP BY gu.user_id
ORDER BY current_max DESC LIMIT 1';
$res = Database::query($sql); $res = Database::query($sql);
$obj = Database::fetch_object($res); $obj = Database::fetch_object($res);
return $obj->current_max; if ($obj) {
return $obj->current_max;
}
return 0;
} }
/** /**
@ -1194,9 +1244,9 @@ class GroupManager
$courseId = intval($courseId); $courseId = intval($courseId);
} }
$select = " SELECT u.id, firstname, lastname "; $select = ' SELECT u.id, firstname, lastname ';
if ($getCount) { if ($getCount) {
$select = " SELECT count(u.id) count"; $select = ' SELECT count(u.id) count';
} }
$sql = "$select $sql = "$select
FROM $group_user_table gu FROM $group_user_table gu
@ -1248,12 +1298,13 @@ class GroupManager
$groupTable = Database::get_course_table(TABLE_GROUP); $groupTable = Database::get_course_table(TABLE_GROUP);
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$group_id = intval($group_id); $group_id = (int) $group_id;
$sql = "SELECT user_id $sql = "SELECT user_id
FROM $group_user_table gu FROM $group_user_table gu
INNER JOIN $groupTable g INNER JOIN $groupTable g
ON (gu.group_id = g.iid and g.c_id = gu.c_id) ON (gu.group_id = g.iid)
WHERE gu.c_id = $course_id AND g.id = $group_id"; WHERE g.iid = $group_id";
$res = Database::query($sql); $res = Database::query($sql);
$users = []; $users = [];
@ -1264,8 +1315,8 @@ class GroupManager
$sql = "SELECT user_id $sql = "SELECT user_id
FROM $tutor_user_table gu FROM $tutor_user_table gu
INNER JOIN $groupTable g INNER JOIN $groupTable g
ON (gu.group_id = g.id and g.c_id = gu.c_id) ON (gu.group_id = g.iid)
WHERE gu.c_id = $course_id AND g.id = $group_id"; WHERE g.iid = $group_id";
$res = Database::query($sql); $res = Database::query($sql);
while ($obj = Database::fetch_object($res)) { while ($obj = Database::fetch_object($res)) {
$users[] = api_get_user_info($obj->user_id); $users[] = api_get_user_info($obj->user_id);
@ -1286,13 +1337,13 @@ class GroupManager
$groupTable = Database::get_course_table(TABLE_GROUP); $groupTable = Database::get_course_table(TABLE_GROUP);
$tutor_user_table = Database::get_course_table(TABLE_GROUP_TUTOR); $tutor_user_table = Database::get_course_table(TABLE_GROUP_TUTOR);
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$group_id = intval($groupInfo['iid']); $group_id = (int) $groupInfo['iid'];
$sql = "SELECT user_id $sql = "SELECT user_id
FROM $tutor_user_table gu FROM $tutor_user_table gu
INNER JOIN $groupTable g INNER JOIN $groupTable g
ON (gu.group_id = g.id and g.c_id = gu.c_id) ON (gu.group_id = g.iid)
WHERE gu.c_id = $course_id AND g.iid = $group_id"; WHERE g.iid = $group_id";
$res = Database::query($sql); $res = Database::query($sql);
$users = []; $users = [];
@ -1311,8 +1362,10 @@ class GroupManager
* *
* @return array * @return array
*/ */
public static function getStudents($group_id, $filterOnlyActive = false) public static function getStudents($groupId, $filterOnlyActive = false)
{ {
$groupId = (int) $groupId;
$activeCondition = $filterOnlyActive ? 'AND u.active = 1' : ''; $activeCondition = $filterOnlyActive ? 'AND u.active = 1' : '';
$em = Database::getManager(); $em = Database::getManager();
@ -1322,18 +1375,17 @@ class GroupManager
INNER JOIN ChamiloCourseBundle:CGroupRelUser gu INNER JOIN ChamiloCourseBundle:CGroupRelUser gu
WITH u.id = gu.userId WITH u.id = gu.userId
INNER JOIN ChamiloCourseBundle:CGroup g INNER JOIN ChamiloCourseBundle:CGroup g
WITH gu.groupId = g.id AND g.cId = gu.cId WITH gu.groupId = g.id
WHERE gu.cId = :course AND g.id = :group WHERE g.iid = :group
$activeCondition $activeCondition
") ")
->setParameters([ ->setParameters([
'course' => api_get_course_int_id(), 'course' => api_get_course_int_id(),
'group' => intval($group_id), 'group' => $groupId,
]) ])
->getResult(); ->getResult();
$users = []; $users = [];
/** @var CGroupRelUser $subscription */
foreach ($subscriptions as $subscription) { foreach ($subscriptions as $subscription) {
$users[] = api_get_user_info($subscription['id']); $users[] = api_get_user_info($subscription['id']);
} }
@ -1359,7 +1411,7 @@ class GroupManager
$groups = implode(', ', $groups); $groups = implode(', ', $groups);
$sql = "SELECT DISTINCT user_id $sql = "SELECT DISTINCT user_id
FROM $table gu FROM $table gu
WHERE c_id = $course_id AND gu.group_id IN ($groups)"; WHERE gu.group_id IN ($groups)";
$rs = Database::query($sql); $rs = Database::query($sql);
while ($row = Database::fetch_array($rs)) { while ($row = Database::fetch_array($rs)) {
$result[] = $row['user_id']; $result[] = $row['user_id'];
@ -1482,7 +1534,7 @@ class GroupManager
$group_id = (int) $group_id; $group_id = (int) $group_id;
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$sql = "SELECT max_student FROM $table $sql = "SELECT max_student FROM $table
WHERE c_id = $course_id AND iid = $group_id"; WHERE iid = $group_id";
$db_result = Database::query($sql); $db_result = Database::query($sql);
$db_object = Database::fetch_object($db_result); $db_object = Database::fetch_object($db_result);
if (0 == $db_object->max_student) { if (0 == $db_object->max_student) {
@ -1516,10 +1568,8 @@ class GroupManager
$sql = "SELECT COUNT(*) AS number_of_groups $sql = "SELECT COUNT(*) AS number_of_groups
FROM $table_group_user gu FROM $table_group_user gu
INNER JOIN $table_group g INNER JOIN $table_group g
ON (g.iid = gu.group_id AND gu.c_id = g.c_id) ON (g.iid = gu.group_id)
WHERE WHERE
gu.c_id = $course_id AND
g.c_id = $course_id AND
gu.user_id = $user_id gu.user_id = $user_id
$cat_condition"; $cat_condition";
@ -1549,7 +1599,7 @@ class GroupManager
if (isset($groupIid)) { if (isset($groupIid)) {
$sql = "SELECT status, self_registration_allowed $sql = "SELECT status, self_registration_allowed
FROM $table FROM $table
WHERE c_id = $course_id AND iid = $groupIid"; WHERE iid = $groupIid";
$result = Database::query($sql); $result = Database::query($sql);
$group = Database::fetch_object($result); $group = Database::fetch_object($result);
@ -1558,9 +1608,9 @@ class GroupManager
} }
return self::canUserSubscribe($user_id, $groupInfo); return self::canUserSubscribe($user_id, $groupInfo);
} else {
return false;
} }
return false;
} }
/** /**
@ -1582,7 +1632,7 @@ class GroupManager
$sql = "SELECT status, self_unregistration_allowed $sql = "SELECT status, self_unregistration_allowed
FROM $table FROM $table
WHERE c_id = $course_id AND iid = $groupIid"; WHERE iid = $groupIid";
$result = Database::query($sql); $result = Database::query($sql);
$group = Database::fetch_object($result); $group = Database::fetch_object($result);
@ -1608,12 +1658,11 @@ class GroupManager
return false; return false;
} }
$table = Database::get_course_table(TABLE_GROUP_USER); $table = Database::get_course_table(TABLE_GROUP_USER);
$group_id = intval($groupInfo['id']); $group_id = intval($groupInfo['iid']);
$user_id = intval($user_id); $user_id = intval($user_id);
$sql = "SELECT 1 FROM $table $sql = "SELECT 1 FROM $table
WHERE WHERE
c_id = $course_id AND
group_id = $group_id AND group_id = $group_id AND
user_id = $user_id user_id = $user_id
"; ";
@ -1644,7 +1693,7 @@ class GroupManager
if (self::GROUP_PER_MEMBER_NO_LIMIT == $category['groups_per_user']) { if (self::GROUP_PER_MEMBER_NO_LIMIT == $category['groups_per_user']) {
$category['groups_per_user'] = self::INFINITE; $category['groups_per_user'] = self::INFINITE;
} }
$result = self::user_in_number_of_groups($user_id, $category['id']) < $category['groups_per_user']; $result = self::user_in_number_of_groups($user_id, $category['iid']) < $category['groups_per_user'];
if (false == $result) { if (false == $result) {
return false; return false;
} }
@ -1703,16 +1752,16 @@ class GroupManager
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$sql = "SELECT $sql = "SELECT
ug.id, ug.iid,
u.user_id, u.id as user_id,
u.lastname, u.lastname,
u.firstname, u.firstname,
u.email, u.email,
u.username u.username
FROM $table_user u FROM $table_user u
INNER JOIN $table_group_user ug INNER JOIN $table_group_user ug
ON (ug.user_id = u.user_id) ON (ug.user_id = u.id)
WHERE ug.c_id = $course_id AND WHERE
ug.group_id = $group_id ug.group_id = $group_id
$order_clause"; $order_clause";
@ -1758,25 +1807,25 @@ class GroupManager
$group_id = (int) $groupInfo['iid']; $group_id = (int) $groupInfo['iid'];
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$sql = "SELECT tg.id, u.user_id, u.lastname, u.firstname, u.email $sql = "SELECT u.id, u.lastname, u.firstname, u.email
FROM $table_user u, $table_group_tutor tg FROM $table_user u
INNER JOIN $table_group_tutor tg
ON (tg.user_id = u.id)
WHERE WHERE
tg.c_id = $course_id AND tg.group_id = $group_id
tg.group_id = $group_id AND $order_clause
tg.user_id = u.user_id
$order_clause
"; ";
$db_result = Database::query($sql); $db_result = Database::query($sql);
$users = []; $users = [];
while ($user = Database::fetch_object($db_result)) { while ($user = Database::fetch_object($db_result)) {
if (!$id_only) { if (!$id_only) {
$member['user_id'] = $user->user_id; $member['user_id'] = $user->id;
$member['firstname'] = $user->firstname; $member['firstname'] = $user->firstname;
$member['lastname'] = $user->lastname; $member['lastname'] = $user->lastname;
$member['email'] = $user->email; $member['email'] = $user->email;
$users[] = $member; $users[] = $member;
} else { } else {
$users[] = $user->user_id; $users[] = $user->id;
} }
} }
@ -1837,7 +1886,7 @@ class GroupManager
foreach ($user_ids as $user_id) { foreach ($user_ids as $user_id) {
$user_id = intval($user_id); $user_id = intval($user_id);
if (self::canUserSubscribe($user_id, $groupInfo, false)) { if (self::canUserSubscribe($user_id, $groupInfo, false)) {
$sql = "INSERT INTO ".$table_group_tutor." (c_id, user_id, group_id) $sql = 'INSERT INTO '.$table_group_tutor." (c_id, user_id, group_id)
VALUES ('$course_id', '".$user_id."', '".$groupId."')"; VALUES ('$course_id', '".$user_id."', '".$groupId."')";
$result = Database::query($sql); $result = Database::query($sql);
} }
@ -1862,7 +1911,6 @@ class GroupManager
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$sql = 'DELETE FROM '.$table_group_user.' $sql = 'DELETE FROM '.$table_group_user.'
WHERE WHERE
c_id = '.$course_id.' AND
group_id = '.$group_id.' AND group_id = '.$group_id.' AND
user_id IN ('.implode(',', $user_ids).') user_id IN ('.implode(',', $user_ids).')
'; ';
@ -1887,11 +1935,9 @@ class GroupManager
$table_group_user = Database::get_course_table(TABLE_GROUP_USER); $table_group_user = Database::get_course_table(TABLE_GROUP_USER);
$sql = "DELETE FROM $table_group_user $sql = "DELETE FROM $table_group_user
WHERE WHERE
group_id = $groupId AND group_id = $groupId ";
c_id = $course_id";
$result = Database::query($sql);
return $result; return Database::query($sql);
} }
/** /**
@ -1917,7 +1963,7 @@ class GroupManager
if (!empty($groupId)) { if (!empty($groupId)) {
$table_group_tutor = Database::get_course_table(TABLE_GROUP_TUTOR); $table_group_tutor = Database::get_course_table(TABLE_GROUP_TUTOR);
$sql = "DELETE FROM $table_group_tutor $sql = "DELETE FROM $table_group_tutor
WHERE group_id = $groupId AND c_id = $courseId"; WHERE group_id = $groupId ";
$result = Database::query($sql); $result = Database::query($sql);
return $result; return $result;
@ -1957,7 +2003,6 @@ class GroupManager
$sql = "SELECT * FROM $table $sql = "SELECT * FROM $table
WHERE WHERE
c_id = $courseId AND
user_id = $user_id AND user_id = $user_id AND
group_id = $group_id"; group_id = $group_id";
$result = Database::query($sql); $result = Database::query($sql);
@ -2017,7 +2062,7 @@ class GroupManager
$course_id = intval($course_id); $course_id = intval($course_id);
$sql = "SELECT group_id FROM $tbl_group $sql = "SELECT group_id FROM $tbl_group
WHERE c_id = $course_id AND user_id = '$user_id'"; WHERE user_id = '$user_id'";
$result = Database::query($sql); $result = Database::query($sql);
if ($result) { if ($result) {
@ -2028,7 +2073,7 @@ class GroupManager
//Also loading if i'm the tutor //Also loading if i'm the tutor
$sql = "SELECT group_id FROM $tbl_group_tutor $sql = "SELECT group_id FROM $tbl_group_tutor
WHERE c_id = $course_id AND user_id = '$user_id'"; WHERE user_id = '$user_id'";
$result = Database::query($sql); $result = Database::query($sql);
if ($result) { if ($result) {
while ($row = Database::fetch_array($result)) { while ($row = Database::fetch_array($result)) {
@ -2211,8 +2256,6 @@ class GroupManager
INNER JOIN $table_group_user gu INNER JOIN $table_group_user gu
ON (gu.group_id = g.iid) ON (gu.group_id = g.iid)
WHERE WHERE
gu.c_id= $course_id AND
g.c_id= $course_id AND
gu.user_id = $user_id"; gu.user_id = $user_id";
$res = Database::query($sql); $res = Database::query($sql);
$groups = []; $groups = [];
@ -2285,8 +2328,10 @@ class GroupManager
$url = api_get_path(WEB_CODE_PATH).'group/'; $url = api_get_path(WEB_CODE_PATH).'group/';
foreach ($group_list as $this_group) { foreach ($group_list as $this_group) {
$groupId = $this_group['iid'];
// Validation when belongs to a session // Validation when belongs to a session
$session_img = api_get_session_image($this_group['session_id'], $user_info['status']); $session_img = '';
//$session_img = api_get_session_image($this_group['session_id'], $user_info['status']);
// All the tutors of this group // All the tutors of this group
$tutors = self::get_subscribed_tutors($this_group, true); $tutors = self::get_subscribed_tutors($this_group, true);
@ -2306,13 +2351,15 @@ class GroupManager
$groupNameClass = 'muted'; $groupNameClass = 'muted';
} }
$group_name = '<a class="'.$groupNameClass.'" href="group_space.php?'.api_get_cidreq(true, false).'&gid='.$this_group['id'].'">'. $group_name = '<a
class="'.$groupNameClass.'"
href="group_space.php?'.api_get_cidreq(true, false).'&gid='.$groupId.'">'.
Security::remove_XSS($this_group['name']).'</a> '; Security::remove_XSS($this_group['name']).'</a> ';
$group_name2 = ''; $group_name2 = '';
if (api_get_configuration_value('extra')) { if (api_get_configuration_value('extra')) {
$group_name2 = '<a href="group_space_tracking.php?cid='.api_get_course_int_id().'&gid=' $group_name2 = '<a href="group_space_tracking.php?cid='.api_get_course_int_id().'&gid='
.$this_group['id'].'">'.get_lang('suivi_de').''.stripslashes($this_group['name']).'</a>'; .$groupId.'">'.get_lang('suivi_de').''.stripslashes($this_group['name']).'</a>';
} }
if (!empty($user_id) && !empty($this_group['id_tutor']) && $user_id == $this_group['id_tutor']) { if (!empty($user_id) && !empty($this_group['id_tutor']) && $user_id == $this_group['id_tutor']) {
@ -2380,17 +2427,17 @@ class GroupManager
$row[] = $tutor_info; $row[] = $tutor_info;
// Max number of members in group // Max number of members in group
$max_members = self::MEMBER_PER_GROUP_NO_LIMIT == $this_group['maximum_number_of_members'] ? ' ' : ' / '.$this_group['maximum_number_of_members']; $max_members = self::MEMBER_PER_GROUP_NO_LIMIT == $this_group['maxStudent'] ? ' ' : ' / '.$this_group['maxStudent'];
// Number of members in group // Number of members in group
$row[] = $this_group['number_of_members'].$max_members; $row[] = $this_group['maxStudent'].$max_members;
// Self-registration / unregistration // Self-registration / unregistration
if (!api_is_allowed_to_edit(false, true)) { if (!api_is_allowed_to_edit(false, true)) {
if (self::is_self_registration_allowed($user_id, $this_group)) { if (self::is_self_registration_allowed($user_id, $this_group)) {
$row[] = '<a class = "btn btn-default" href="group.php?'.api_get_cidreq().'&category='.$category_id.'&action=self_reg&group_id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('Please confirm your choice'), ENT_QUOTES, $charset))."'".')) return false;">'.get_lang('register').'</a>'; $row[] = '<a class = "btn btn-default" href="group.php?'.api_get_cidreq().'&category='.$category_id.'&action=self_reg&group_id='.$groupId.'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('Please confirm your choice'), ENT_QUOTES, $charset))."'".')) return false;">'.get_lang('register').'</a>';
} elseif (self::is_self_unregistration_allowed($user_id, $this_group)) { } elseif (self::is_self_unregistration_allowed($user_id, $this_group)) {
$row[] = '<a class = "btn btn-default" href="group.php?'.api_get_cidreq().'&category='.$category_id.'&action=self_unreg&group_id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('Please confirm your choice'), ENT_QUOTES, $charset))."'".')) return false;">'.get_lang('unregister').'</a>'; $row[] = '<a class = "btn btn-default" href="group.php?'.api_get_cidreq().'&category='.$category_id.'&action=self_unreg&group_id='.$groupId.'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang('Please confirm your choice'), ENT_QUOTES, $charset))."'".')) return false;">'.get_lang('unregister').'</a>';
} else { } else {
$row[] = '-'; $row[] = '-';
} }
@ -2400,34 +2447,34 @@ class GroupManager
if (api_is_allowed_to_edit(false, true) && if (api_is_allowed_to_edit(false, true) &&
!(api_is_session_general_coach() && intval($this_group['session_id']) != $session_id) !(api_is_session_general_coach() && intval($this_group['session_id']) != $session_id)
) { ) {
$edit_actions = '<a href="'.$url.'settings.php?'.api_get_cidreq(true, false).'&gid='.$this_group['id'].'" title="'.get_lang('Edit').'">'. $edit_actions = '<a href="'.$url.'settings.php?'.api_get_cidreq(true, false).'&gid='.$groupId.'" title="'.get_lang('Edit').'">'.
Display::return_icon('edit.png', get_lang('Edit this group'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('edit.png', get_lang('Edit this group'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
if (1 == $this_group['status']) { if (1 == $this_group['status']) {
$edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=set_invisible&id='.$this_group['id'].'" title="'.get_lang('Hide').'">'. $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=set_invisible&id='.$groupId.'" title="'.get_lang('Hide').'">'.
Display::return_icon('visible.png', get_lang('Hide'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('visible.png', get_lang('Hide'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
} else { } else {
$edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=set_visible&id='.$this_group['id'].'" title="'.get_lang('Show').'">'. $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=set_visible&id='.$groupId.'" title="'.get_lang('Show').'">'.
Display::return_icon('invisible.png', get_lang('Show'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('invisible.png', get_lang('Show'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
} }
$edit_actions .= '<a href="'.$url.'member_settings.php?'.api_get_cidreq(true, false).'&gid='.$this_group['id'].'" title="'.get_lang('Group members').'">'. $edit_actions .= '<a href="'.$url.'member_settings.php?'.api_get_cidreq(true, false).'&gid='.$groupId.'" title="'.get_lang('Group members').'">'.
Display::return_icon('user.png', get_lang('Group members'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('user.png', get_lang('Group members'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
$edit_actions .= '<a href="'.$url.'group_overview.php?action=export&type=xls&'.api_get_cidreq(true, false).'&id='.$this_group['id'].'" title="'.get_lang('Export users list').'">'. $edit_actions .= '<a href="'.$url.'group_overview.php?action=export&type=xls&'.api_get_cidreq(true, false).'&id='.$groupId.'" title="'.get_lang('Export users list').'">'.
Display::return_icon('export_excel.png', get_lang('Export'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('export_excel.png', get_lang('Export'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
if ($surveyGroupExists) { if ($surveyGroupExists) {
$edit_actions .= Display::url( $edit_actions .= Display::url(
Display::return_icon('survey.png', get_lang('ExportSurveyResults'), '', ICON_SIZE_SMALL), Display::return_icon('survey.png', get_lang('ExportSurveyResults'), '', ICON_SIZE_SMALL),
$url.'group_overview.php?action=export_surveys&'.api_get_cidreq(true, false).'&id='.$this_group['id'] $url.'group_overview.php?action=export_surveys&'.api_get_cidreq(true, false).'&id='.$groupId
).'&nbsp;'; ).'&nbsp;';
} }
$edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=fill_one&id='.$this_group['id'].'" $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=fill_one&id='.$groupId.'"
onclick="javascript: if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('FillGroup').'">'. onclick="javascript: if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('FillGroup').'">'.
Display::return_icon('fill.png', get_lang('FillGroup'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('fill.png', get_lang('FillGroup'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
$edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=delete_one&id='.$this_group['id'].'" $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq(true, false).'&category='.$category_id.'&action=delete_one&id='.$groupId.'"
onclick="javascript: if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('Delete').'">'. onclick="javascript: if(!confirm('."'".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('Delete').'">'.
Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).'</a>&nbsp;';
@ -2487,10 +2534,8 @@ class GroupManager
* *
* @return array * @return array
*/ */
public static function importCategoriesAndGroupsFromArray( public static function importCategoriesAndGroupsFromArray($groupData, $deleteNotInArray = false)
$groupData, {
$deleteNotInArray = false
) {
$result = []; $result = [];
$elementsFound = [ $elementsFound = [
'categories' => [], 'categories' => [],
@ -2529,7 +2574,8 @@ class GroupManager
$data['self_reg_allowed'], $data['self_reg_allowed'],
$data['self_unreg_allowed'], $data['self_unreg_allowed'],
$data['max_student'], $data['max_student'],
$data['groups_per_user'] $data['groups_per_user'],
$data['document_access']
); );
$data['category_id'] = $categoryId; $data['category_id'] = $categoryId;
$result['updated']['category'][] = $data; $result['updated']['category'][] = $data;
@ -2778,7 +2824,7 @@ class GroupManager
$categoryInfo['self_unreg_allowed'], $categoryInfo['self_unreg_allowed'],
$categoryInfo['groups_per_user'], $categoryInfo['groups_per_user'],
]; ];
$count++; ++$count;
} }
} }
@ -2843,7 +2889,7 @@ class GroupManager
break; break;
} }
} }
$count++; ++$count;
} }
return $data; return $data;
@ -2931,7 +2977,7 @@ class GroupManager
$users = self::getTutors($group); $users = self::getTutors($group);
if (!empty($users)) { if (!empty($users)) {
$content .= '<ul>'; $content .= '<ul>';
$content .= "<li>".Display::tag('h4', get_lang('Coaches'))."</li><ul>"; $content .= '<li>'.Display::tag('h4', get_lang('Coaches')).'</li><ul>';
foreach ($users as $user) { foreach ($users as $user) {
$user_info = api_get_user_info($user['user_id']); $user_info = api_get_user_info($user['user_id']);
$content .= '<li title="'.$user_info['username'].'">'. $content .= '<li title="'.$user_info['username'].'">'.
@ -2945,7 +2991,7 @@ class GroupManager
$users = self::getStudents($group['id']); $users = self::getStudents($group['id']);
if (!empty($users)) { if (!empty($users)) {
$content .= '<ul>'; $content .= '<ul>';
$content .= "<li>".Display::tag('h4', get_lang('Learners'))."</li><ul>"; $content .= '<li>'.Display::tag('h4', get_lang('Learners')).'</li><ul>';
foreach ($users as $user) { foreach ($users as $user) {
$user_info = api_get_user_info($user['user_id']); $user_info = api_get_user_info($user['user_id']);
$content .= '<li title="'.$user_info['username'].'">'. $content .= '<li title="'.$user_info['username'].'">'.
@ -3106,7 +3152,8 @@ class GroupManager
$authorId = isset($documentInfoToBeCheck['insert_user_id']) ? $documentInfoToBeCheck['insert_user_id'] : 0; $authorId = isset($documentInfoToBeCheck['insert_user_id']) ? $documentInfoToBeCheck['insert_user_id'] : 0;
// If "insert_user_id" is not set, check the author id from c_item_property // If "insert_user_id" is not set, check the author id from c_item_property
if (empty($authorId) && isset($documentInfoToBeCheck['id'])) { if (empty($authorId) && isset($documentInfoToBeCheck['id'])) {
$documentInfo = api_get_item_property_info( // @todo use resources
/*$documentInfo = api_get_item_property_info(
$courseId, $courseId,
'document', 'document',
$documentInfoToBeCheck['id'], $documentInfoToBeCheck['id'],
@ -3124,7 +3171,7 @@ class GroupManager
if (!empty($documentInfo) && isset($documentInfo['insert_user_id'])) { if (!empty($documentInfo) && isset($documentInfo['insert_user_id'])) {
$authorId = $documentInfo['insert_user_id']; $authorId = $documentInfo['insert_user_id'];
} }*/
} }
if ($authorId == $userId) { if ($authorId == $userId) {

@ -167,7 +167,13 @@ class CourseListener
throw new NotFoundHttpException($translator->trans('Group not found')); throw new NotFoundHttpException($translator->trans('Group not found'));
} }
if ($course->hasGroup($group)) { if (false === $checker->isGranted(GroupVoter::VIEW, $group)) {
throw new AccessDeniedException($translator->trans('Unauthorised access to group'));
}
$sessionHandler->set('gid', $groupId);
// @todo check if course has group
/*if ($course->hasGroup($group)) {
// Check if user is allowed to this course-group // Check if user is allowed to this course-group
// See GroupVoter.php // See GroupVoter.php
if (false === $checker->isGranted(GroupVoter::VIEW, $group)) { if (false === $checker->isGranted(GroupVoter::VIEW, $group)) {
@ -176,7 +182,7 @@ class CourseListener
$sessionHandler->set('gid', $groupId); $sessionHandler->set('gid', $groupId);
} else { } else {
throw new AccessDeniedException($translator->trans('Group does not exist in course')); throw new AccessDeniedException($translator->trans('Group does not exist in course'));
} }*/
} }
$origin = $request->get('origin'); $origin = $request->get('origin');

@ -27,6 +27,7 @@ use Chamilo\CourseBundle\Repository\CForumCategoryRepository;
use Chamilo\CourseBundle\Repository\CForumForumRepository; use Chamilo\CourseBundle\Repository\CForumForumRepository;
use Chamilo\CourseBundle\Repository\CForumPostRepository; use Chamilo\CourseBundle\Repository\CForumPostRepository;
use Chamilo\CourseBundle\Repository\CForumThreadRepository; use Chamilo\CourseBundle\Repository\CForumThreadRepository;
use Chamilo\CourseBundle\Repository\CGroupCategoryRepository;
use Chamilo\CourseBundle\Repository\CGroupRepository; use Chamilo\CourseBundle\Repository\CGroupRepository;
use Chamilo\CourseBundle\Repository\CLinkCategoryRepository; use Chamilo\CourseBundle\Repository\CLinkCategoryRepository;
use Chamilo\CourseBundle\Repository\CLinkRepository; use Chamilo\CourseBundle\Repository\CLinkRepository;
@ -434,6 +435,14 @@ class Container
return self::$container->get(CGroupRepository::class); return self::$container->get(CGroupRepository::class);
} }
/**
* @return CGroupCategoryRepository
*/
public static function getGroupCategoryRepository()
{
return self::$container->get(CGroupCategoryRepository::class);
}
/** /**
* @return CQuizQuestionRepository * @return CQuizQuestionRepository
*/ */

@ -6,10 +6,8 @@ namespace Chamilo\CourseBundle\Entity;
use ApiPlatform\Core\Annotation\ApiResource; use ApiPlatform\Core\Annotation\ApiResource;
use Chamilo\CoreBundle\Entity\AbstractResource; use Chamilo\CoreBundle\Entity\AbstractResource;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\ResourceInterface; use Chamilo\CoreBundle\Entity\ResourceInterface;
use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\User;
use Chamilo\CoreBundle\Traits\CourseTrait;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Criteria; use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
@ -19,8 +17,6 @@ use Symfony\Component\Validator\Constraints as Assert;
* @ORM\Table( * @ORM\Table(
* name="c_group_info", * name="c_group_info",
* indexes={ * indexes={
* @ORM\Index(name="course", columns={"c_id"}),
* @ORM\Index(name="session_id", columns={"session_id"})
* } * }
* ) * )
* *
@ -29,8 +25,6 @@ use Symfony\Component\Validator\Constraints as Assert;
*/ */
class CGroup extends AbstractResource implements ResourceInterface class CGroup extends AbstractResource implements ResourceInterface
{ {
use CourseTrait;
/** /**
* @var int * @var int
* *
@ -55,11 +49,12 @@ class CGroup extends AbstractResource implements ResourceInterface
protected $status; protected $status;
/** /**
* @var int * @var CGroupCategory
* *
* @ORM\Column(name="category_id", type="integer", nullable=true) * @ORM\ManyToOne(targetEntity="CGroupCategory", cascade={"persist"})
* @ORM\JoinColumn(name="category_id", referencedColumnName="iid", onDelete="CASCADE")
*/ */
protected $categoryId; protected $category;
/** /**
* @var string * @var string
@ -145,13 +140,6 @@ class CGroup extends AbstractResource implements ResourceInterface
*/ */
protected $selfUnregistrationAllowed; protected $selfUnregistrationAllowed;
/**
* @var int
*
* @ORM\Column(name="session_id", type="integer", nullable=false)
*/
protected $sessionId;
/** /**
* @var int * @var int
* *
@ -159,14 +147,6 @@ class CGroup extends AbstractResource implements ResourceInterface
*/ */
protected $documentAccess; protected $documentAccess;
/**
* @var Course
*
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Course", inversedBy="groups", cascade={"persist"})
* @ORM\JoinColumn(name="c_id", referencedColumnName="id", nullable=false)
*/
protected $course;
/** /**
* @var ArrayCollection|CGroupRelUser[] * @var ArrayCollection|CGroupRelUser[]
* *
@ -249,30 +229,6 @@ class CGroup extends AbstractResource implements ResourceInterface
return $this->status; return $this->status;
} }
/**
* Set categoryId.
*
* @param int $categoryId
*
* @return CGroup
*/
public function setCategoryId($categoryId)
{
$this->categoryId = $categoryId;
return $this;
}
/**
* Get categoryId.
*
* @return int
*/
public function getCategoryId()
{
return $this->categoryId;
}
/** /**
* Set description. * Set description.
* *
@ -528,28 +484,6 @@ class CGroup extends AbstractResource implements ResourceInterface
return $this->selfUnregistrationAllowed; return $this->selfUnregistrationAllowed;
} }
/**
* Set sessionId.
*
* @param int $sessionId
*/
public function setSessionId($sessionId): self
{
$this->sessionId = $sessionId;
return $this;
}
/**
* Get sessionId.
*
* @return int
*/
public function getSessionId()
{
return $this->sessionId;
}
public function getDocumentAccess(): int public function getDocumentAccess(): int
{ {
return $this->documentAccess; return $this->documentAccess;
@ -609,9 +543,18 @@ class CGroup extends AbstractResource implements ResourceInterface
return $relation->count() > 0; return $relation->count() > 0;
} }
/** public function getCategory(): CGroupCategory
* Resource identifier. {
*/ return $this->category;
}
public function setCategory(CGroupCategory $category = null): CGroup
{
$this->category = $category;
return $this;
}
public function getResourceIdentifier(): int public function getResourceIdentifier(): int
{ {
return $this->iid; return $this->iid;

@ -4,6 +4,8 @@
namespace Chamilo\CourseBundle\Entity; namespace Chamilo\CourseBundle\Entity;
use Chamilo\CoreBundle\Entity\AbstractResource;
use Chamilo\CoreBundle\Entity\ResourceInterface;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
@ -13,12 +15,11 @@ use Symfony\Component\Validator\Constraints as Assert;
* @ORM\Table( * @ORM\Table(
* name="c_group_category", * name="c_group_category",
* indexes={ * indexes={
* @ORM\Index(name="course", columns={"c_id"})
* } * }
* ) * )
* @ORM\Entity * @ORM\Entity
*/ */
class CGroupCategory class CGroupCategory extends AbstractResource implements ResourceInterface
{ {
/** /**
* @var int * @var int
@ -29,16 +30,11 @@ class CGroupCategory
*/ */
protected $iid; protected $iid;
/**
* @var int
*
* @ORM\Column(name="c_id", type="integer")
*/
protected $cId;
/** /**
* @var string * @var string
*
* @Assert\NotBlank() * @Assert\NotBlank()
*
* @ORM\Column(name="title", type="string", length=255, nullable=false) * @ORM\Column(name="title", type="string", length=255, nullable=false)
*/ */
protected $title; protected $title;
@ -127,13 +123,6 @@ class CGroupCategory
*/ */
protected $groupsPerUser; protected $groupsPerUser;
/**
* @var int
*
* @ORM\Column(name="display_order", type="integer", nullable=false)
*/
protected $displayOrder;
/** /**
* @var int * @var int
* *
@ -141,6 +130,20 @@ class CGroupCategory
*/ */
protected $documentAccess; protected $documentAccess;
public function __construct()
{
}
public function getIid(): int
{
return $this->iid;
}
public function __toString(): string
{
return $this->getTitle();
}
/** /**
* Set title. * Set title.
* *
@ -157,22 +160,18 @@ class CGroupCategory
/** /**
* Get title. * Get title.
*
* @return string
*/ */
public function getTitle() public function getTitle(): string
{ {
return $this->title; return (string) $this->title;
} }
/** /**
* Set description. * Set description.
* *
* @param string $description * @param string $description
*
* @return CGroupCategory
*/ */
public function setDescription($description) public function setDescription($description): self
{ {
$this->description = $description; $this->description = $description;
@ -453,63 +452,30 @@ class CGroupCategory
return $this->groupsPerUser; return $this->groupsPerUser;
} }
/** public function getDocumentAccess(): int
* Set displayOrder.
*
* @param int $displayOrder
*
* @return CGroupCategory
*/
public function setDisplayOrder($displayOrder)
{
$this->displayOrder = $displayOrder;
return $this;
}
/**
* Get displayOrder.
*
* @return int
*/
public function getDisplayOrder()
{ {
return $this->displayOrder; return $this->documentAccess;
} }
/** public function setDocumentAccess(int $documentAccess): self
* Set cId.
*
* @param int $cId
*
* @return CGroupCategory
*/
public function setCId($cId)
{ {
$this->cId = $cId; $this->documentAccess = $documentAccess;
return $this; return $this;
} }
/** public function getResourceIdentifier(): int
* Get cId.
*
* @return int
*/
public function getCId()
{ {
return $this->cId; return $this->iid;
} }
public function getDocumentAccess(): int public function getResourceName(): string
{ {
return $this->documentAccess; return $this->getTitle();
} }
public function setDocumentAccess(int $documentAccess): self public function setResourceName(string $name): self
{ {
$this->documentAccess = $documentAccess; return $this->setTitle($name);
return $this;
} }
} }

@ -0,0 +1,11 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CourseBundle\Repository;
use Chamilo\CoreBundle\Repository\ResourceRepository;
final class CGroupCategoryRepository extends ResourceRepository
{
}
Loading…
Cancel
Save