/** * Run synchronization process * * @param progress_trace $trace * @param int|null $courseid or null for all courses * @return void */ function local_metagroups_sync(progress_trace $trace, $courseid = null) { global $DB; if ($courseid !== null) { $courseids = array($courseid); } else { $courseids = local_metagroups_parent_courses(); } foreach (array_unique($courseids) as $courseid) { $parent = get_course($courseid); // If parent course doesn't use groups, we can skip synchronization. if (groups_get_course_groupmode($parent) == NOGROUPS) { continue; } $trace->output($parent->fullname, 1); $children = local_metagroups_child_courses($parent->id); foreach ($children as $childid) { $child = get_course($childid); $trace->output($child->fullname, 2); $groups = groups_get_all_groups($child->id); foreach ($groups as $group) { if (!($metagroup = $DB->get_record('groups', array('courseid' => $parent->id, 'idnumber' => $group->id)))) { $metagroup = new stdClass(); $metagroup->courseid = $parent->id; $metagroup->idnumber = $group->id; $metagroup->name = $group->name; $metagroup->id = groups_create_group($metagroup, false, false); } $trace->output($metagroup->name, 3); $users = groups_get_members($group->id); foreach ($users as $user) { groups_add_member($metagroup->id, $user->id, 'local_metagroups', $group->id); } } } } }
/** * Group member removed * * @param \core\event\group_member_removed $event * @return void */ public static function group_member_removed(\core\event\group_member_removed $event) { global $DB; $group = $event->get_record_snapshot('groups', $event->objectid); $user = \core_user::get_user($event->relateduserid, '*', MUST_EXIST); $courseids = local_metagroups_parent_courses($group->courseid); foreach ($courseids as $courseid) { $course = get_course($courseid); if ($metagroup = $DB->get_record('groups', array('courseid' => $course->id, 'idnumber' => $group->id))) { groups_remove_member($metagroup, $user); } } }