Created
December 7, 2012 03:19
-
-
Save danpoltawski/4230485 to your computer and use it in GitHub Desktop.
Allows bulk move of forum posts from one discussion to another
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
define('CLI_SCRIPT', true); | |
require_once('config.php'); | |
require_once($CFG->libdir.'/clilib.php'); | |
require_once($CFG->libdir.'/rsslib.php'); | |
require_once($CFG->dirroot.'/mod/forum/lib.php'); | |
require_once($CFG->dirroot.'/mod/forum/rsslib.php'); | |
list($options, $unrecognized) = cli_get_params( | |
array( | |
'sourceid' => 0, | |
'destinationid' => 0, | |
'titleprefix' => '' | |
)); | |
if (empty($options['sourceid']) || empty($options['destinationid'])) { | |
die("Error, you must specify all options --sourceid, --destinationid and --titleprefix\n"); | |
} | |
$oldforum = $DB->get_record('forum', array('id' => $options['sourceid']), '*', MUST_EXIST); | |
$newforum = $DB->get_record('forum', array('id' => $options['destinationid']), '*', MUST_EXIST); | |
if (!empty($options['titleprefix'])) { | |
$prefix = $options['titleprefix'] .': '; | |
}else{ | |
$prefix = ''; | |
} | |
if ($oldforum->course != $newforum->course) { | |
die("Forums specified are not not in the same course\n"); | |
} | |
$oldcm = get_coursemodule_from_instance('forum', $oldforum->id, $oldforum->course, false, MUST_EXIST); | |
$newcm = get_coursemodule_from_instance('forum', $newforum->id, $newforum->course, false, MUST_EXIST); | |
$oldctx = context_module::instance($oldcm->id, MUST_EXIST); | |
$newctx = context_module::instance($newcm->id, MUST_EXIST); | |
$prompt = "Are you sure you want to move discussions from '{$oldforum->name}' to '{$newforum->name}'? | |
Posts with be rewriten to be: '{$prefix}Original title' | |
Type YES to confirm:"; | |
$input = cli_input($prompt); | |
if ($input != 'YES') { | |
die("Aborting! as not confirmed \n"); | |
} | |
$rs = $DB->get_recordset('forum_discussions', array('forum'=> $oldforum->id)); | |
$transaction = $DB->start_delegated_transaction(); | |
mtrace('Iterating through dicussions:', ''); | |
foreach($rs as $discussion) { | |
// Move attachments with core function. | |
if (!forum_move_attachments($discussion, $oldforum->id, $newforum->id)) { | |
throw new moodle_exception("eek, attachment problem with {$discussion->id}"); | |
} | |
$newdiscussion = clone $discussion; | |
// Update discussion record. | |
$newdiscussion->name = $prefix . $discussion->name; | |
$newdiscussion->forum = $newforum->id; | |
$DB->update_record('forum_discussions', $newdiscussion); | |
// Update discussion title. | |
$params = array('newtitle'=> $newdiscussion->name, 'discussionid' => $discussion->id); | |
$sql = "UPDATE {forum_posts} SET subject = :newtitle WHERE discussion = :discussionid AND parent = 0"; | |
$DB->execute($sql, $params); | |
// Update any replies to threads.. | |
$params = array('newsubject'=> "Re: {$newdiscussion->name}", 'discussionid' => $discussion->id, 'oldsubject' => "Re: {$discussion->name}"); | |
$sql = "UPDATE {forum_posts} SET subject = :newsubject WHERE discussion = :discussionid AND parent != 0 AND subject = :oldsubject"; | |
$DB->execute($sql, $params); | |
// Update read tracking records. | |
$DB->set_field('forum_read', 'forumid', $newforum->id, array('discussionid' => $discussion->id)); | |
mtrace('.', ''); | |
} | |
// Update ratings. | |
$sql = 'UPDATE {rating} SET contextid = :newctx WHERE contextid = :oldctx'; | |
$DB->execute($sql, array('newctx' => $newctx->id, 'oldctx' => $oldctx->id)); | |
// Hack hack hack for forum_update_grades! | |
$newforum->cmidnumber = $newcm->idnumber; | |
$newforum->courseid = $newforum->course; | |
forum_update_grades($newforum); | |
mtrace(''); | |
mtrace('Done, allow commit.'); | |
$transaction->allow_commit(); | |
// Delete the RSS files for the 2 forums to force regeneration of the feeds | |
forum_rss_delete_file($oldforum); | |
forum_rss_delete_file($newforum); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment