diff --git a/public/main/announcements/announcements.php b/public/main/announcements/announcements.php index d7c99971eb6..2a6138a3dd0 100644 --- a/public/main/announcements/announcements.php +++ b/public/main/announcements/announcements.php @@ -404,6 +404,21 @@ $to = []; if (empty($group_id)) { + if (!empty($sessionId)) { + $userGroups = Container::getUsergroupRepository()->findBySession($session); + $groupSelectTitle = get_lang('Classes of session').' '.$session->getTitle(); + } else { + $userGroups = Container::getUsergroupRepository()->findByCourse($course); + $groupSelectTitle = get_lang('Classes of course'); + } + + if (!empty($userGroups)) { + $groupSelect = ['' => get_lang('Select a class')]; + foreach ($userGroups as $group) { + $groupSelect[$group->getId()] = $group->getTitle(); + } + $form->addSelect('usergroup_id', $groupSelectTitle, $groupSelect, ['id' => 'usergroup_id']); + } if (isset($_GET['remind_inactive'])) { $email_ann = '1'; $content_to_modify = sprintf( @@ -508,41 +523,88 @@ } $ajaxUrl = api_get_path(WEB_AJAX_PATH).'announcement.ajax.php?'.api_get_cidreq().'&a=preview'; - + $ajaxUserGroupUrl = api_get_path(WEB_AJAX_PATH).'usergroup.ajax.php?'.api_get_cidreq(); $form->addHtml(" - + }); + "); if (isset($defaults['users'])) { @@ -671,8 +733,7 @@ $notificationPeriod = $data['notification_period'] ?? []; $reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : []; - - if (isset($id) && $id) { + if (!empty($id)) { // there is an Id => the announcement already exists => update mode $file_comment = $announcementAttachmentIsDisabled ? null : $_POST['file_comment']; $file = $announcementAttachmentIsDisabled ? [] : $_FILES['user_upload']; diff --git a/public/main/inc/ajax/usergroup.ajax.php b/public/main/inc/ajax/usergroup.ajax.php index 6ed36b7ccfe..5c3c0a85d17 100644 --- a/public/main/inc/ajax/usergroup.ajax.php +++ b/public/main/inc/ajax/usergroup.ajax.php @@ -5,12 +5,47 @@ /** * Responses to AJAX calls. */ + +use Chamilo\CoreBundle\Framework\Container; + require_once __DIR__.'/../global.inc.php'; $action = isset($_REQUEST['a']) ? $_REQUEST['a'] : ''; $isAllowedToEdit = api_is_allowed_to_edit(); switch ($action) { + case 'get_users_by_group_course': + $groupId = (int) $_POST['group_id']; + $sessionId = (int) $_POST['session_id']; + if ($groupId) { + $users = Container::getUsergroupRepository()->getUsersByGroup($groupId, true); + if (!empty($sessionId)) { + $filtered = []; + foreach ($users as $user) { + $filtered[] = [ + 'id' => $user['id'], + 'name' => api_get_person_name($user['firstname'], $user['lastname']), + ]; + } + } else { + $courseCode = $_POST['course_code']; + $courseUsers = CourseManager::get_user_list_from_course_code($courseCode, 0); + $courseUserIds = array_column($courseUsers, 'user_id'); + + $filtered = []; + foreach ($users as $user) { + if (in_array($user['id'], $courseUserIds)) { + $filtered[] = [ + 'id' => $user['id'], + 'name' => api_get_person_name($user['firstname'], $user['lastname']), + ]; + } + } + } + + echo json_encode($filtered); + } + exit; case 'get_class_by_keyword': $keyword = isset($_REQUEST['q']) ? $_REQUEST['q'] : ''; if (api_is_platform_admin() && !empty($keyword)) { diff --git a/src/CoreBundle/Repository/Node/UsergroupRepository.php b/src/CoreBundle/Repository/Node/UsergroupRepository.php index 3e43bd01f53..0be68a27c25 100644 --- a/src/CoreBundle/Repository/Node/UsergroupRepository.php +++ b/src/CoreBundle/Repository/Node/UsergroupRepository.php @@ -6,6 +6,8 @@ namespace Chamilo\CoreBundle\Repository\Node; +use Chamilo\CoreBundle\Entity\Course; +use Chamilo\CoreBundle\Entity\Session; use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Entity\Usergroup; use Chamilo\CoreBundle\Entity\UsergroupRelUser; @@ -24,6 +26,41 @@ public function __construct( parent::__construct($registry, Usergroup::class); } + public function findBySession(Session $session, bool $checkAccessUrl = false): array + { + $qb = $this->createQueryBuilder('ug') + ->innerJoin('ug.sessions', 'ugs') + ->where('ugs.session = :session') + ->setParameter('session', $session); + + if ($checkAccessUrl && $this->accessUrlHelper->isMultiple()) { + $accessUrl = $this->accessUrlHelper->getCurrent(); + $qb->innerJoin('ug.urls', 'url') + ->andWhere('url.url = :urlId') + ->setParameter('urlId', $accessUrl->getId()); + } + + return $qb->getQuery()->getResult(); + } + + public function findByCourse(Course $course, bool $checkAccessUrl = false): array + { + $qb = $this->createQueryBuilder('ug') + ->innerJoin('ug.courses', 'ugc') + ->where('ugc.course = :course') + ->setParameter('course', $course); + + if ($checkAccessUrl && $this->accessUrlHelper->isMultiple()) { + $accessUrl = $this->accessUrlHelper->getCurrent(); + + $qb->innerJoin('ug.urls', 'url') + ->andWhere('url.url = :urlId') + ->setParameter('urlId', $accessUrl->getId()); + } + + return $qb->getQuery()->getResult(); + } + /** * @param int|array $relationType */ @@ -156,21 +193,27 @@ public function searchGroups(string $searchTerm): array return $queryBuilder->getQuery()->getResult(); } - public function getUsersByGroup(int $groupID) + public function getUsersByGroup(int $groupID, bool $includeNormalClass = false): array { $qb = $this->createQueryBuilder('g') ->innerJoin('g.users', 'gu') ->innerJoin('gu.user', 'u') ->where('g.id = :groupID') - ->setParameter('groupID', $groupID) - ->andWhere('gu.relationType IN (:relationTypes)') - ->setParameter('relationTypes', [ - Usergroup::GROUP_USER_PERMISSION_ADMIN, - Usergroup::GROUP_USER_PERMISSION_READER, - Usergroup::GROUP_USER_PERMISSION_PENDING_INVITATION, - ]) - ->select('u.id, u.username, u.email, gu.relationType, u.pictureUri') - ; + ->setParameter('groupID', $groupID); + + $relationTypes = [ + Usergroup::GROUP_USER_PERMISSION_ADMIN, + Usergroup::GROUP_USER_PERMISSION_READER, + Usergroup::GROUP_USER_PERMISSION_PENDING_INVITATION, + ]; + + if ($includeNormalClass) { + $relationTypes[] = 0; + } + + $qb->andWhere('gu.relationType IN (:relationTypes)') + ->setParameter('relationTypes', $relationTypes) + ->select('u.id, u.username, u.email, gu.relationType, u.pictureUri, u.firstname, u.lastname'); $results = $qb->getQuery()->getResult();