/** * Updates an instance of the grouptool in the database * * Given an object containing all the necessary data, * (defined by the form in mod_form.php) this function * will update an existing instance with new data. * * @param stdClass $grouptool An object from the form in mod_form.php * @param mod_grouptool_mod_form $mform * @return boolean Success/Fail */ function grouptool_update_instance(stdClass $grouptool, mod_grouptool_mod_form $mform = null) { global $DB, $CFG; $grouptool->timemodified = time(); $grouptool->id = $grouptool->instance; $cmid = $grouptool->coursemodule; if (!isset($grouptool->use_size)) { $grouptool->use_size = 0; } if (!isset($grouptool->use_individual)) { $grouptool->use_individual = 0; } if (!isset($grouptool->use_queue)) { $queues = $DB->count_records_sql("SELECT COUNT(DISTINCT queues.id)\n FROM {grouptool_agrps} agrps\n LEFT JOIN {grouptool_queued} queues ON queues.agrpid = agrps.id\n WHERE agrps.grouptoolid = ?", array($grouptool->instance)); if (!empty($queues)) { $grouptool->use_queue = 1; } else { $grouptool->use_queue = 0; } } if (!isset($grouptool->allow_multiple)) { $grouptool->allow_multiple = 0; } $grouptool->grpsize = clean_param($grouptool->grpsize, PARAM_INT); $grouptool->choose_min = clean_param($grouptool->choose_min, PARAM_INT); $grouptool->choose_max = clean_param($grouptool->choose_max, PARAM_INT); // Register students if immediate registration has been turned on! if ($grouptool->immediate_reg) { require_once $CFG->dirroot . '/mod/grouptool/locallib.php'; $instance = new mod_grouptool($grouptool->coursemodule, $grouptool); $instance->push_registrations(); } require_once $CFG->dirroot . '/calendar/lib.php'; $event = new stdClass(); if ($grouptool->allow_reg) { $event->name = get_string('registration_period_start', 'grouptool') . ' ' . $grouptool->name; } else { $event->name = $grouptool->name . ' ' . get_string('availabledate', 'grouptool'); } $event->description = format_module_intro('grouptool', $grouptool, $grouptool->coursemodule); if (!empty($grouptool->timeavailable)) { $event->timestart = $grouptool->timeavailable; } else { $grouptool->timecreated = $DB->get_field('grouptool', 'timecreated', array('id' => $grouptool->id)); $event->timestart = $grouptool->timecreated; } $event->visible = instance_is_visible('grouptool', $grouptool); $event->timeduration = 0; if ($event->id = $DB->get_field('event', 'id', array('modulename' => 'grouptool', 'instance' => $grouptool->id, 'eventtype' => 'availablefrom'))) { $calendarevent = calendar_event::load($event->id); $calendarevent->update($event, false); } else { $event->courseid = $grouptool->course; $event->groupid = 0; $event->userid = 0; $event->modulename = 'grouptool'; $event->instance = $grouptool->id; /* * For activity module's events, this can be used to set the alternative text of the * event icon. Set it to 'pluginname' unless you have a better string. */ $event->eventtype = 'availablefrom'; calendar_event::create($event); } if ($grouptool->timedue != 0) { unset($event->id); unset($calendarevent); if ($grouptool->allow_reg) { $event->name = get_string('registration_period_end', 'grouptool') . ' ' . $grouptool->name; } else { $event->name = $grouptool->name . ' ' . get_string('duedate', 'grouptool'); } $event->timestart = $grouptool->timedue; $event->eventtype = 'deadline'; /* * For activity module's events, this can be used to set the alternative text of the * event icon. Set it to 'pluginname' unless you have a better string. */ if ($event->id = $DB->get_field('event', 'id', array('modulename' => 'grouptool', 'instance' => $grouptool->id, 'eventtype' => 'due'))) { $calendarevent = calendar_event::load($event->id); $calendarevent->update($event, false); } else { unset($event->id); $event->courseid = $grouptool->course; // We've got some permission issues with calendar_event::create() so we work around that! $calev = new calendar_event($event); $calev->update($event, false); } } else { if ($event->id = $DB->get_field('event', 'id', array('modulename' => 'grouptool', 'instance' => $grouptool->id, 'eventtype' => 'due'))) { $calendarevent = calendar_event::load($event->id); $calendarevent->delete(true); } } $coursegroups = $DB->get_fieldset_select('groups', 'id', 'courseid = ?', array($grouptool->course)); foreach ($coursegroups as $groupid) { if (!$DB->record_exists('grouptool_agrps', array('grouptoolid' => $grouptool->instance, 'groupid' => $groupid))) { $record = new stdClass(); $record->grouptoolid = $grouptool->instance; $record->groupid = $groupid; $record->sort_order = 9999999; $record->grpsize = $grouptool->grpsize; $record->active = 0; $DB->insert_record('grouptool_agrps', $record); } } // We have to override the functions fetching of data, because it's not updated yet! grouptool_update_queues($grouptool); return $DB->update_record('grouptool', $grouptool); }
/** * group_deleted * * @param \core\event\group_deleted $event Event object containing useful data * @return bool true if success */ public static function group_deleted(\core\event\group_deleted $event) { global $CFG, $DB; $data = $event->get_record_snapshot('groups', $event->objectid); $course = $DB->get_record('course', array('id' => $data->courseid), '*', MUST_EXIST); if (!($grouptools = get_all_instances_in_course('grouptool', $course))) { return true; } $grouprecreated = false; $agrpids = array(); foreach ($grouptools as $grouptool) { $cmid = $grouptool->coursemodule; switch ($grouptool->ifgroupdeleted) { default: case GROUPTOOL_RECREATE_GROUP: if (!$grouprecreated) { $newid = $DB->insert_record('groups', $data, true); if ($newid !== false) { // Delete auto-inserted agrp. if ($DB->record_exists('grouptool_agrps', array('groupid' => $newid))) { $DB->delete_records('grouptool_agrps', array('groupid' => $newid)); } // Update reference. if ($DB->record_exists('grouptool_agrps', array('groupid' => $data->id))) { $DB->set_field('grouptool_agrps', 'groupid', $newid, array('groupid' => $data->id)); } // Trigger event! $logdata = array('cmid' => $cmid, 'groupid' => $data->id, 'newid' => $newid, 'courseid' => $data->courseid); \mod_grouptool\event\group_recreated::create_from_object($logdata)->trigger(); if ($grouptool->immediate_reg) { require_once $CFG->dirroot . '/mod/grouptool/locallib.php'; $instance = new mod_grouptool($cmid, $grouptool); $instance->push_registrations(); } $grouprecreated = true; } else { print_error('error', 'moodle'); return false; } } else { if ($grouptool->immediate_reg) { require_once $CFG->dirroot . '/mod/grouptool/locallib.php'; $instance = new mod_grouptool($cmid, $grouptool); $instance->push_registrations(); } } break; case GROUPTOOL_DELETE_REF: if ($agrpid = $DB->get_field('grouptool_agrps', 'id', array('groupid' => $data->id, 'grouptoolid' => $grouptool->id))) { $agrpids[] = $agrpid; } break; } } if (count($agrpids) > 0) { $agrps = $DB->get_records_list('grouptool_agrps', 'id', $agrpids); $cms = array(); $regs = $DB->get_records_list('grouptool_registered', 'agrpid', $agrpids); $DB->delete_records_list('grouptool_registered', 'agrpid', $agrpids); foreach ($regs as $cur) { if (empty($cms[$agrps[$cur->agrpid]->grouptoolid])) { $cms[$agrps[$cur->agrpid]->grouptoolid] = get_coursemodule_from_instance('grouptool', $agrps[$cur->agrpid]->grouptoolid); } $cur->groupid = $agrps[$cur->agrpid]->groupid; \mod_grouptool\event\registration_deleted::create_via_eventhandler($cms[$agrps[$cur->agrpid]->grouptoolid], $cur); } $queues = $DB->get_records_list('grouptool_queued', 'agrpid', $agrpids); $DB->delete_records_list('grouptool_queued', 'agrpid', $agrpids); foreach ($queues as $cur) { if (empty($cms[$agrps[$cur->agrpid]->grouptoolid])) { $cms[$agrps[$cur->agrpid]->grouptoolid] = get_coursemodule_from_instance('grouptool', $agrps[$cur->agrpid]->grouptoolid); } // Trigger event! $cur->groupid = $agrps[$cur->agrpid]->groupid; \mod_grouptool\event\queue_entry_deleted::create_via_eventhandler($cms[$agrps[$cur->agrpid]->grouptoolid], $cur); } $DB->delete_records_list('grouptool_agrps', 'id', $agrpids); foreach ($agrps as $cur) { if (empty($cms[$cur->grouptoolid])) { $cms[$cur->grouptoolid] = get_coursemodule_from_instance('grouptool', $cur->grouptoolid); } // Trigger event! $logdata = new stdClass(); $logdata->id = $cur->id; $logdata->cmid = $cms[$cur->grouptoolid]->id; $logdata->groupid = $cur->groupid; $logdata->agrpid = $cur->id; $logdata->courseid = $data->courseid; \mod_grouptool\event\agrp_deleted::create_from_object($logdata); } } return true; }