/** * This function is used by the reset_course_userdata function in moodlelib. * This function will remove all posts from the specified forum * and clean up any related data. * * @global object * @global object * @param $data the data submitted from the reset course. * @return array status array */ function forum_reset_userdata($data) { global $CFG, $DB; require_once($CFG->dirroot.'/rating/lib.php'); $componentstr = get_string('modulenameplural', 'forum'); $status = array(); $params = array($data->courseid); $removeposts = false; $typesql = ""; if (!empty($data->reset_forum_all)) { $removeposts = true; $typesstr = get_string('resetforumsall', 'forum'); $types = array(); } else if (!empty($data->reset_forum_types)){ $removeposts = true; $typesql = ""; $types = array(); $forum_types_all = forum_get_forum_types_all(); foreach ($data->reset_forum_types as $type) { if (!array_key_exists($type, $forum_types_all)) { continue; } $typesql .= " AND f.type=?"; $types[] = $forum_types_all[$type]; $params[] = $type; } $typesstr = get_string('resetforums', 'forum').': '.implode(', ', $types); } $alldiscussionssql = "SELECT fd.id FROM {forum_discussions} fd, {forum} f WHERE f.course=? AND f.id=fd.forum"; $allforumssql = "SELECT f.id FROM {forum} f WHERE f.course=?"; $allpostssql = "SELECT fp.id FROM {forum_posts} fp, {forum_discussions} fd, {forum} f WHERE f.course=? AND f.id=fd.forum AND fd.id=fp.discussion"; $forumssql = $forums = $rm = null; if( $removeposts || !empty($data->reset_forum_ratings) ) { $forumssql = "$allforumssql $typesql"; $forums = $forums = $DB->get_records_sql($forumssql, $params); $rm = new rating_manager(); $ratingdeloptions = new stdClass; $ratingdeloptions->component = 'mod_forum'; $ratingdeloptions->ratingarea = 'post'; } if ($removeposts) { $discussionssql = "$alldiscussionssql $typesql"; $postssql = "$allpostssql $typesql"; // now get rid of all attachments $fs = get_file_storage(); if ($forums) { foreach ($forums as $forumid=>$unused) { if (!$cm = get_coursemodule_from_instance('forum', $forumid)) { continue; } $context = context_module::instance($cm->id); $fs->delete_area_files($context->id, 'mod_forum', 'attachment'); $fs->delete_area_files($context->id, 'mod_forum', 'post'); //remove ratings $ratingdeloptions->contextid = $context->id; $rm->delete_ratings($ratingdeloptions); } } // first delete all read flags $DB->delete_records_select('forum_read', "forumid IN ($forumssql)", $params); // remove tracking prefs $DB->delete_records_select('forum_track_prefs', "forumid IN ($forumssql)", $params); // remove posts from queue $DB->delete_records_select('forum_queue', "discussionid IN ($discussionssql)", $params); // all posts - initial posts must be kept in single simple discussion forums $DB->delete_records_select('forum_posts', "discussion IN ($discussionssql) AND parent <> 0", $params); // first all children $DB->delete_records_select('forum_posts', "discussion IN ($discussionssql AND f.type <> 'single') AND parent = 0", $params); // now the initial posts for non single simple // finally all discussions except single simple forums $DB->delete_records_select('forum_discussions', "forum IN ($forumssql AND f.type <> 'single')", $params); // remove all grades from gradebook if (empty($data->reset_gradebook_grades)) { if (empty($types)) { forum_reset_gradebook($data->courseid); } else { foreach ($types as $type) { forum_reset_gradebook($data->courseid, $type); } } } $status[] = array('component'=>$componentstr, 'item'=>$typesstr, 'error'=>false); } // remove all ratings in this course's forums if (!empty($data->reset_forum_ratings)) { if ($forums) { foreach ($forums as $forumid=>$unused) { if (!$cm = get_coursemodule_from_instance('forum', $forumid)) { continue; } $context = context_module::instance($cm->id); //remove ratings $ratingdeloptions->contextid = $context->id; $rm->delete_ratings($ratingdeloptions); } } // remove all grades from gradebook if (empty($data->reset_gradebook_grades)) { forum_reset_gradebook($data->courseid); } } // remove all subscriptions unconditionally - even for users still enrolled in course if (!empty($data->reset_forum_subscriptions)) { $DB->delete_records_select('forum_subscriptions', "forum IN ($allforumssql)", $params); $status[] = array('component'=>$componentstr, 'item'=>get_string('resetsubscriptions','forum'), 'error'=>false); } // remove all tracking prefs unconditionally - even for users still enrolled in course if (!empty($data->reset_forum_track_prefs)) { $DB->delete_records_select('forum_track_prefs', "forumid IN ($allforumssql)", $params); $status[] = array('component'=>$componentstr, 'item'=>get_string('resettrackprefs','forum'), 'error'=>false); } /// updating dates - shift may be negative too if ($data->timeshift) { shift_course_mod_dates('forum', array('assesstimestart', 'assesstimefinish'), $data->timeshift, $data->courseid); $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false); } return $status; }
/** * This function is used by the reset_course_userdata function in moodlelib. * This function will remove all posts from the specified forum * and clean up any related data. * @param $data the data submitted from the reset course. * @return array status array */ function forum_reset_userdata($data) { global $CFG; require_once $CFG->libdir . '/filelib.php'; $componentstr = get_string('modulenameplural', 'forum'); $status = array(); $removeposts = false; if (!empty($data->reset_forum_all)) { $removeposts = true; $typesql = ""; $typesstr = get_string('resetforumsall', 'forum'); $types = array(); } else { if (!empty($data->reset_forum_types)) { $removeposts = true; $typesql = ""; $types = array(); $forum_types_all = forum_get_forum_types_all(); foreach ($data->reset_forum_types as $type) { if (!array_key_exists($type, $forum_types_all)) { continue; } $typesql .= " AND f.type='{$type}'"; $types[] = $forum_types_all[$type]; } $typesstr = get_string('resetforums', 'forum') . ': ' . implode(', ', $types); } } $alldiscussionssql = "SELECT fd.id\n FROM {$CFG->prefix}forum_discussions fd, {$CFG->prefix}forum f\n WHERE f.course={$data->courseid} AND f.id=fd.forum"; $allforumssql = "SELECT f.id\n FROM {$CFG->prefix}forum f\n WHERE f.course={$data->courseid}"; $allpostssql = "SELECT fp.id\n FROM {$CFG->prefix}forum_posts fp, {$CFG->prefix}forum_discussions fd, {$CFG->prefix}forum f\n WHERE f.course={$data->courseid} AND f.id=fd.forum AND fd.id=fp.discussion"; if ($removeposts) { $discussionssql = "{$alldiscussionssql} {$typesql}"; $forumssql = "{$allforumssql} {$typesql}"; $postssql = "{$allpostssql} {$typesql}"; // first delete all read flags delete_records_select('forum_read', "forumid IN ({$forumssql})"); // remove tracking prefs delete_records_select('forum_track_prefs', "forumid IN ({$forumssql})"); // remove posts from queue delete_records_select('forum_queue', "discussionid IN ({$discussionssql})"); // remove ratings delete_records_select('forum_ratings', "post IN ({$postssql})"); // all posts delete_records_select('forum_posts', "discussion IN ({$discussionssql})"); // finally all discussions delete_records_select('forum_discussions', "forum IN ({$forumssql})"); // now get rid of all attachments if ($forums = get_records_sql($forumssql)) { foreach ($forums as $forumid => $unused) { fulldelete($CFG->dataroot . '/' . $data->courseid . '/moddata/forum/' . $forumid); } } // remove all grades from gradebook if (empty($data->reset_gradebook_grades)) { if (empty($types)) { forum_reset_gradebook($data->courseid); } else { foreach ($types as $type) { forum_reset_gradebook($data->courseid, $type); } } } $status[] = array('component' => $componentstr, 'item' => $typesstr, 'error' => false); } // remove all ratings if (!empty($data->reset_forum_ratings)) { delete_records_select('forum_ratings', "post IN ({$allpostssql})"); // remove all grades from gradebook if (empty($data->reset_gradebook_grades)) { forum_reset_gradebook($data->courseid); } } // remove all subscriptions unconditionally - even for users still enrolled in course if (!empty($data->reset_forum_subscriptions)) { delete_records_select('forum_subscriptions', "forum IN ({$allforumssql})"); $status[] = array('component' => $componentstr, 'item' => get_string('resetsubscriptions', 'forum'), 'error' => false); } // remove all tracking prefs unconditionally - even for users still enrolled in course if (!empty($data->reset_forum_track_prefs)) { delete_records_select('forum_track_prefs', "forumid IN ({$allforumssql})"); $status[] = array('component' => $componentstr, 'item' => get_string('resettrackprefs', 'forum'), 'error' => false); } /// updating dates - shift may be negative too if ($data->timeshift) { shift_course_mod_dates('forum', array('assesstimestart', 'assesstimefinish'), $data->timeshift, $data->courseid); $status[] = array('component' => $componentstr, 'item' => get_string('datechanged'), 'error' => false); } return $status; }