Beispiel #1
0
     $custom_context_template = $context->info['custom_context_template'];
     if (!($tplcourse = $DB->get_record('course', array('idnumber' => $custom_context_template), '*', IGNORE_MULTIPLE))) {
         print_error('invalidtplcourse', 'local_ltiprovider');
     }
     require_once "{$CFG->dirroot}/course/lib.php";
     $newcourse = new stdClass();
     $newcourse->fullname = local_ltiprovider_get_new_course_info('fullname', $context);
     $newcourse->shortname = local_ltiprovider_get_new_course_info('shortname', $context);
     $newcourse->idnumber = local_ltiprovider_get_new_course_info('idnumber', $context);
     $categories = $DB->get_records('course_categories', null, '', 'id', 0, 1);
     $category = array_shift($categories);
     $newcourse->category = $category->id;
     $course = create_course($newcourse);
     $coursecontext = context_course::instance($course->id);
     // Create the tool that provide the full course.
     $tool = local_ltiprovider_create_tool($course->id, $coursecontext->id, $context);
     $username = local_ltiprovider_create_username($context->info['oauth_consumer_key'], $context->info['user_id']);
     $userrestoringid = $DB->get_field('user', 'id', array('username' => $username));
     // Duplicate course + users.
     $course = local_ltiprovider_duplicate_course($tplcourse->id, $course, 1, $options = array(array('name' => 'users', 'value' => 1)), $userrestoringid, $context);
     echo json_encode($course);
 } else {
     if ($service == 'duplicate_resource') {
         $idnumber = $context->info['custom_resource_link_copy_id'];
         $resource_link_id = $context->info['resource_link_id'];
         if (!$tool) {
             print_error('missingrequiredtool', 'local_ltiprovider');
         }
         if (!($context = $DB->get_record('context', array('id' => $tool->contextid)))) {
             print_error("invalidcontext");
         }
/**
 * Duplicates a Moodle module in an existing course
 * @param  int $cmid     Course module id
 * @param  int $courseid Course id
 * @return int           New course module id
 */
function local_ltiprovider_duplicate_module($cmid, $courseid, $newidnumber, $lticontext)
{
    global $CFG, $DB, $USER;
    require_once $CFG->dirroot . '/backup/util/includes/backup_includes.php';
    require_once $CFG->dirroot . '/backup/util/includes/restore_includes.php';
    require_once $CFG->libdir . '/filelib.php';
    if (empty($USER)) {
        // Emulate session.
        cron_setup_user();
    }
    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
    $cm = get_coursemodule_from_id('', $cmid, 0, true, MUST_EXIST);
    $cmcontext = context_module::instance($cm->id);
    $context = context_course::instance($course->id);
    if (!plugin_supports('mod', $cm->modname, FEATURE_BACKUP_MOODLE2)) {
        $url = course_get_url($course, $cm->sectionnum, array('sr' => $sectionreturn));
        print_error('duplicatenosupport', 'error', $url, $a);
    }
    // backup the activity
    $admin = get_admin();
    $bc = new backup_controller(backup::TYPE_1ACTIVITY, $cm->id, backup::FORMAT_MOODLE, backup::INTERACTIVE_NO, backup::MODE_IMPORT, $admin->id);
    $backupid = $bc->get_backupid();
    $backupbasepath = $bc->get_plan()->get_basepath();
    $bc->execute_plan();
    $bc->destroy();
    // restore the backup immediately
    $rc = new restore_controller($backupid, $courseid, backup::INTERACTIVE_NO, backup::MODE_IMPORT, $admin->id, backup::TARGET_CURRENT_ADDING);
    if (!$rc->execute_precheck()) {
        $precheckresults = $rc->get_precheck_results();
        if (is_array($precheckresults) && !empty($precheckresults['errors'])) {
            if (empty($CFG->keeptempdirectoriesonbackup)) {
                fulldelete($backupbasepath);
            }
            print_r($precheckresults);
            die;
        }
    }
    $rc->execute_plan();
    $newcmid = null;
    $tasks = $rc->get_plan()->get_tasks();
    foreach ($tasks as $task) {
        if (is_subclass_of($task, 'restore_activity_task')) {
            if ($task->get_old_contextid() == $cmcontext->id) {
                $newcmid = $task->get_moduleid();
                break;
            }
        }
    }
    $rc->destroy();
    if ($module = $DB->get_record('course_modules', array('id' => $newcmid))) {
        $module->idnumber = $newidnumber;
        $DB->update_record('course_modules', $module);
    }
    $newtoolid = 0;
    if ($tools = $DB->get_records('local_ltiprovider', array('contextid' => $cmcontext->id))) {
        $newcmcontext = context_module::instance($newcmid);
        foreach ($tools as $tool) {
            $tool->courseid = $course->id;
            $tool->contextid = $newcmcontext->id;
            $newtoolid = $DB->insert_record('local_ltiprovider', $tool);
        }
    }
    if (!$newtoolid) {
        $tool = local_ltiprovider_create_tool($course->id, $newcmcontext->id, $lticontext);
    }
    if (empty($CFG->keeptempdirectoriesonbackup)) {
        fulldelete($backupbasepath);
    }
    return $newcmid;
}