Skip to content

Instantly share code, notes, and snippets.

@danpoltawski
Created December 7, 2012 03:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danpoltawski/4230485 to your computer and use it in GitHub Desktop.
Save danpoltawski/4230485 to your computer and use it in GitHub Desktop.
Allows bulk move of forum posts from one discussion to another
<?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