/** * Check module updates since a given time. * This function checks for updates in the module config, file areas, completion, grades, comments and ratings. * * @param cm_info $cm course module data * @param int $from the time to check * @param array $fileareas additional file ares to check * @param array $filter if we need to filter and return only selected updates * @return stdClass object with the different updates * @since Moodle 3.2 */ function course_check_module_updates_since($cm, $from, $fileareas = array(), $filter = array()) { global $DB, $CFG, $USER; $context = $cm->context; $mod = $DB->get_record($cm->modname, array('id' => $cm->instance), '*', MUST_EXIST); $updates = new stdClass(); $course = get_course($cm->course); $component = 'mod_' . $cm->modname; // Check changes in the module configuration. if (isset($mod->timemodified) and (empty($filter) or in_array('configuration', $filter))) { $updates->configuration = (object) array('updated' => false); if ($updates->configuration->updated = $mod->timemodified > $from) { $updates->configuration->timeupdated = $mod->timemodified; } } // Check for updates in files. if (plugin_supports('mod', $cm->modname, FEATURE_MOD_INTRO)) { $fileareas[] = 'intro'; } if (!empty($fileareas) and (empty($filter) or in_array('fileareas', $filter))) { $fs = get_file_storage(); $files = $fs->get_area_files($context->id, $component, $fileareas, false, "filearea, timemodified DESC", false, $from); foreach ($fileareas as $filearea) { $updates->{$filearea . 'files'} = (object) array('updated' => false); } foreach ($files as $file) { $updates->{$file->get_filearea() . 'files'}->updated = true; $updates->{$file->get_filearea() . 'files'}->itemids[] = $file->get_id(); } } // Check completion. $supportcompletion = plugin_supports('mod', $cm->modname, FEATURE_COMPLETION_HAS_RULES); $supportcompletion = $supportcompletion or plugin_supports('mod', $cm->modname, FEATURE_COMPLETION_TRACKS_VIEWS); if ($supportcompletion and (empty($filter) or in_array('completion', $filter))) { $updates->completion = (object) array('updated' => false); $completion = new completion_info($course); // Use wholecourse to cache all the modules the first time. $completiondata = $completion->get_data($cm, true); if ($updates->completion->updated = !empty($completiondata->timemodified) && $completiondata->timemodified > $from) { $updates->completion->timemodified = $completiondata->timemodified; } } // Check grades. $supportgrades = plugin_supports('mod', $cm->modname, FEATURE_GRADE_HAS_GRADE); $supportgrades = $supportgrades or plugin_supports('mod', $cm->modname, FEATURE_GRADE_OUTCOMES); if ($supportgrades and (empty($filter) or (in_array('gradeitems', $filter) or in_array('outcomes', $filter)))) { require_once $CFG->libdir . '/gradelib.php'; $grades = grade_get_grades($course->id, 'mod', $cm->modname, $mod->id, $USER->id); if (empty($filter) or in_array('gradeitems', $filter)) { $updates->gradeitems = (object) array('updated' => false); foreach ($grades->items as $gradeitem) { foreach ($gradeitem->grades as $grade) { if ($grade->datesubmitted > $from or $grade->dategraded > $from) { $updates->gradeitems->updated = true; $updates->gradeitems->itemids[] = $gradeitem->id; } } } } if (empty($filter) or in_array('outcomes', $filter)) { $updates->outcomes = (object) array('updated' => false); foreach ($grades->outcomes as $outcome) { foreach ($outcome->grades as $grade) { if ($grade->datesubmitted > $from or $grade->dategraded > $from) { $updates->outcomes->updated = true; $updates->outcomes->itemids[] = $outcome->id; } } } } } // Check comments. if (plugin_supports('mod', $cm->modname, FEATURE_COMMENT) and (empty($filter) or in_array('comments', $filter))) { $updates->comments = (object) array('updated' => false); require_once $CFG->dirroot . '/comment/lib.php'; require_once $CFG->dirroot . '/comment/locallib.php'; $manager = new comment_manager(); $comments = $manager->get_component_comments_since($course, $context, $component, $from, $cm); if (!empty($comments)) { $updates->comments->updated = true; $updates->comments->itemids = array_keys($comments); } } // Check ratings. if (plugin_supports('mod', $cm->modname, FEATURE_RATE) and (empty($filter) or in_array('ratings', $filter))) { $updates->ratings = (object) array('updated' => false); require_once $CFG->dirroot . '/rating/lib.php'; $manager = new rating_manager(); $ratings = $manager->get_component_ratings_since($context, $component, $from); if (!empty($ratings)) { $updates->ratings->updated = true; $updates->ratings->itemids = array_keys($ratings); } } return $updates; }