public static function get_restore_content_dir($backupfile = null, $shortname = null, &$errors = array()) {
        global $CFG, $DB, $USER;

        $cachekey = null;
        if (!empty($backupfile)) {
            $backupfile = realpath($backupfile);
            if (empty($backupfile) || !is_readable($backupfile)) {
                $errors['cannotreadbackupfile'] = new lang_string('cannotreadbackupfile', 'tool_uploadcourse');
                return false;
            }
            $cachekey = 'backup_path:' . $backupfile;
        } else if (!empty($shortname) || is_numeric($shortname)) {
            $cachekey = 'backup_sn:' . $shortname;
        }

        if (empty($cachekey)) {
            return false;
        }

        // If $CFG->keeptempdirectoriesonbackup is not set to true, any restore happening would
        // automatically delete the backup directory... causing the cache to return an unexisting directory.
        $usecache = !empty($CFG->keeptempdirectoriesonbackup);
        if ($usecache) {
            $cache = cache::make('tool_uploadcourse', 'helper');
        }

        // If we don't use the cache, or if we do and not set, or the directory doesn't exist any more.
        if (!$usecache || (($backupid = $cache->get($cachekey)) === false || !is_dir(get_backup_temp_directory($backupid)))) {

            // Use null instead of false because it would consider that the cache key has not been set.
            $backupid = null;

            if (!empty($backupfile)) {
                // Extracting the backup file.
                $packer = get_file_packer('application/vnd.moodle.backup');
                $backupid = restore_controller::get_tempdir_name(SITEID, $USER->id);
                $path = make_backup_temp_directory($backupid, false);
                $result = $packer->extract_to_pathname($backupfile, $path);
                if (!$result) {
                    $errors['invalidbackupfile'] = new lang_string('invalidbackupfile', 'tool_uploadcourse');
                }
            } else if (!empty($shortname) || is_numeric($shortname)) {
                // Creating restore from an existing course.
                $courseid = $DB->get_field('course', 'id', array('shortname' => $shortname), IGNORE_MISSING);
                if (!empty($courseid)) {
                    $bc = new backup_controller(backup::TYPE_1COURSE, $courseid, backup::FORMAT_MOODLE,
                        backup::INTERACTIVE_NO, backup::MODE_IMPORT, $USER->id);
                    $bc->execute_plan();
                    $backupid = $bc->get_backupid();
                    $bc->destroy();
                } else {
                    $errors['coursetorestorefromdoesnotexist'] =
                        new lang_string('coursetorestorefromdoesnotexist', 'tool_uploadcourse');
                }
            }

            if ($usecache) {
                $cache->set($cachekey, $backupid);
            }
        }

        if ($backupid === null) {
            $backupid = false;
        }
        return $backupid;
    }
public static function get_restore_content_dir($backupfile = null, $shortname = null, &$errors = array()) {
        global $CFG, $DB, $USER;

        $cachekey = null;
        if (!empty($backupfile)) {
            $backupfile = realpath($backupfile);
            if (empty($backupfile) || !is_readable($backupfile)) {
                $errors['cannotreadbackupfile'] = new lang_string('cannotreadbackupfile', 'tool_uploadcourse');
                return false;
            }
            $cachekey = 'backup_path:' . $backupfile;
        } else if (!empty($shortname) || is_numeric($shortname)) {
            $cachekey = 'backup_sn:' . $shortname;
        }

        if (empty($cachekey)) {
            return false;
        }

        // If $CFG->keeptempdirectoriesonbackup is not set to true, any restore happening would
        // automatically delete the backup directory... causing the cache to return an unexisting directory.
        $usecache = !empty($CFG->keeptempdirectoriesonbackup);
        if ($usecache) {
            $cache = cache::make('tool_uploadcourse', 'helper');
        }

        // If we don't use the cache, or if we do and not set, or the directory doesn't exist any more.
        if (!$usecache || (($backupid = $cache->get($cachekey)) === false || !is_dir(get_backup_temp_directory($backupid)))) {

            // Use null instead of false because it would consider that the cache key has not been set.
            $backupid = null;

            if (!empty($backupfile)) {
                // Extracting the backup file.
                $packer = get_file_packer('application/vnd.moodle.backup');
                $backupid = restore_controller::get_tempdir_name(SITEID, $USER->id);
                $path = make_backup_temp_directory($backupid, false);
                $result = $packer->extract_to_pathname($backupfile, $path);
                if (!$result) {
                    $errors['invalidbackupfile'] = new lang_string('invalidbackupfile', 'tool_uploadcourse');
                }
            } else if (!empty($shortname) || is_numeric($shortname)) {
                // Creating restore from an existing course.
                $courseid = $DB->get_field('course', 'id', array('shortname' => $shortname), IGNORE_MISSING);
                if (!empty($courseid)) {
                    $bc = new backup_controller(backup::TYPE_1COURSE, $courseid, backup::FORMAT_MOODLE,
                        backup::INTERACTIVE_NO, backup::MODE_IMPORT, $USER->id);
                    $bc->execute_plan();
                    $backupid = $bc->get_backupid();
                    $bc->destroy();
                } else {
                    $errors['coursetorestorefromdoesnotexist'] =
                        new lang_string('coursetorestorefromdoesnotexist', 'tool_uploadcourse');
                }
            }

            if ($usecache) {
                $cache->set($cachekey, $backupid);
            }
        }

        if ($backupid === null) {
            $backupid = false;
        }
        return $backupid;
    }
public static function get_restore_content_dir ( $ backupfile = null , $ shortname = null , & $ errors = array ( ) ) { global $ CFG , $ DB , $ USER ; $ cachekey = null ; if ( ! empty ( $ backupfile ) ) { $ backupfile = realpath ( $ backupfile ) ; if ( empty ( $ backupfile ) || ! is_readable ( $ backupfile ) ) { $ errors [ 'cannotreadbackupfile' ] = new lang_string ( 'cannotreadbackupfile' , 'tool_uploadcourse' ) ; return false ; } $ cachekey = 'backup_path:' . $ backupfile ; } else if ( ! empty ( $ shortname ) || is_numeric ( $ shortname ) ) { $ cachekey = 'backup_sn:' . $ shortname ; } if ( empty ( $ cachekey ) ) { return false ; } // If $CFG->keeptempdirectoriesonbackup is not set to true, any restore happening would // automatically delete the backup directory... causing the cache to return an unexisting directory. $ usecache = ! empty ( $ CFG -> keeptempdirectoriesonbackup ) ; if ( $ usecache ) { $ cache = cache :: make ( 'tool_uploadcourse' , 'helper' ) ; } // If we don't use the cache, or if we do and not set, or the directory doesn't exist any more. if ( ! $ usecache || ( ( $ backupid = $ cache -> get ( $ cachekey ) ) === false || ! is_dir ( get_backup_temp_directory ( $ backupid ) ) ) ) { // Use null instead of false because it would consider that the cache key has not been set. $ backupid = null ; if ( ! empty ( $ backupfile ) ) { // Extracting the backup file. $ packer = get_file_packer ( 'application/vnd.moodle.backup' ) ; $ backupid = restore_controller :: get_tempdir_name ( SITEID , $ USER -> id ) ; $ path = make_backup_temp_directory ( $ backupid , false ) ; $ result = $ packer -> extract_to_pathname ( $ backupfile , $ path ) ; if ( ! $ result ) { $ errors [ 'invalidbackupfile' ] = new lang_string ( 'invalidbackupfile' , 'tool_uploadcourse' ) ; } } else if ( ! empty ( $ shortname ) || is_numeric ( $ shortname ) ) { // Creating restore from an existing course. $ courseid = $ DB -> get_field ( 'course' , 'id' , array ( 'shortname' => $ shortname ) , IGNORE_MISSING ) ; if ( ! empty ( $ courseid ) ) { $ bc = new backup_controller ( backup :: TYPE_1COURSE , $ courseid , backup :: FORMAT_MOODLE , backup :: INTERACTIVE_NO , backup :: MODE_IMPORT , $ USER -> id ) ; $ bc -> execute_plan ( ) ; $ backupid = $ bc -> get_backupid ( ) ; $ bc -> destroy ( ) ; } else { $ errors [ 'coursetorestorefromdoesnotexist' ] = new lang_string ( 'coursetorestorefromdoesnotexist' , 'tool_uploadcourse' ) ; } } if ( $ usecache ) { $ cache -> set ( $ cachekey , $ backupid ) ; } } if ( $ backupid === null ) { $ backupid = false ; } return $ backupid ; }
Get the restore content tempdir.

The tempdir is the sub directory in which the backup has been extracted.

This caches the result for better performance, but $CFG->keeptempdirectoriesonbackup
needs to be enabled, otherwise the cache is ignored.

@param string $backupfile path to a backup file.
@param string $shortname shortname of a course.
@param array $errors will be populated with errors found.
@return string|false false when the backup couldn't retrieved.
Get the restore content tempdir .