Ejemplo n.º 1
0
/**
 * Unzip the module package
 * @param string $packageFileName
 * @return string module path
 * @todo use this function in get_and_unzip_uploaded_package()
 * @todo remove the need of the Backlog and use Exceptions instead
 */
function unzip_package($packageFileName)
{
    $backlog_message = array();
    //1- Unzip folder in a new repository in claroline/module
    require_once dirname(__FILE__) . '/../thirdparty/pclzip/pclzip.lib.php';
    if (!function_exists('gzopen')) {
        $backlog_message[] = get_lang('Error : no zlib extension found');
        return claro_failure::set_failure($backlog_message);
    }
    //unzip files
    $moduleRepositorySys = get_path('rootSys') . 'module/';
    //create temp dir for upload
    claro_mkdir($moduleRepositorySys, CLARO_FILE_PERMISSIONS, true);
    $uploadDirFullPath = claro_mkdir_tmp($moduleRepositorySys);
    $uploadDir = str_replace($moduleRepositorySys, '', $uploadDirFullPath);
    $modulePath = $moduleRepositorySys . $uploadDir . '/';
    if (preg_match('/.zip$/i', $packageFileName) && treat_secure_file_unzip($packageFileName, $uploadDir, $moduleRepositorySys, get_conf('maxFilledSpaceForModule', 10000000), true)) {
        $backlog_message[] = get_lang('Files dezipped sucessfully in %path', array('%path' => $modulePath));
    } else {
        $backlog_message[] = get_lang('Impossible to unzip file');
        claro_delete_file($modulePath);
        return claro_failure::set_failure($backlog_message);
    }
    return $modulePath;
}
Ejemplo n.º 2
0
/**
 * Main function to import an exercise.
 *
 * @param string $file path of the file
 * @param array $backlog_message
 *
 * @return the id of the created exercise or false if the operation failed
 */
function import_exercise($file, &$backlog)
{
    global $exercise_info;
    global $element_pile;
    global $non_HTML_tag_to_avoid;
    global $record_item_body;
    // used to specify the question directory where files could be found in relation in any question
    global $questionTempDir;
    // get required table names
    $tbl_cdb_names = get_module_course_tbl(array('qwz_exercise', 'qwz_question'), claro_get_current_course_id());
    $tbl_quiz_exercise = $tbl_cdb_names['qwz_exercise'];
    $tbl_quiz_question = $tbl_cdb_names['qwz_question'];
    // paths
    $baseWorkDir = get_path('rootSys') . get_conf('tmpPathSys') . 'upload/';
    // create temp dir for upload
    if (!file_exists($baseWorkDir)) {
        claro_mkdir($baseWorkDir, CLARO_FILE_PERMISSIONS);
    }
    $uploadDir = claro_mkdir_tmp($baseWorkDir);
    // this function should return the dir name and not the full path ...
    $uploadPath = str_replace($baseWorkDir, '', $uploadDir);
    // set some default values for the new exercise
    $exercise_info = array();
    $exercise_info['name'] = preg_replace('/.zip$/i', '', $file);
    $exercise_info['description'] = '';
    $exercise_info['question'] = array();
    // create parser and array to retrieve info from manifest
    $element_pile = array();
    //pile to known the depth in which we are
    $module_info = array();
    //array to store the info we need
    // if file is not a .zip, then we cancel all
    if (!preg_match('/.zip$/i', $_FILES['uploadedExercise']['name'])) {
        $backlog->failure(get_lang('You must upload a zip file'));
        return false;
    }
    //unzip the uploaded file in a tmp directory
    if (!get_and_unzip_uploaded_exercise($baseWorkDir, $uploadPath)) {
        $backlog->failure(get_lang('Upload failed'));
        return false;
    }
    // find the different manifests for each question and parse them.
    $exerciseHandle = opendir($uploadDir);
    $question_number = 0;
    $file_found = false;
    // parse every subdirectory to search xml question files
    while (false !== ($file = readdir($exerciseHandle))) {
        if (is_dir($uploadDir . '/' . $file) && $file != "." && $file != "..") {
            //find each manifest for each question repository found
            $questionHandle = opendir($uploadDir . '/' . $file);
            while (false !== ($questionFile = readdir($questionHandle))) {
                if (preg_match('/.xml$/i', $questionFile)) {
                    list($parsingBacklog, $success) = parse_file($uploadDir, $file, $questionFile);
                    $backlog->append($parsingBacklog);
                    $file_found = true;
                }
            }
        } elseif (preg_match('/.xml$/i', $file)) {
            list($parsingBacklog, $success) = parse_file($uploadDir, '', $file);
            $backlog->append($parsingBacklog);
            $file_found = true;
        }
        // else ignore file
    }
    if (!$file_found) {
        $backlog->failure(get_lang('No XML file found in the zip'));
        return false;
    }
    //---------------------
    //add exercise in tool
    //---------------------
    //1.create exercise
    $exercise = new Exercise();
    $exercise->setTitle($exercise_info['name']);
    $exercise->setDescription($exercise_info['description']);
    if ($exercise->validate()) {
        $exercise_id = $exercise->save();
    } else {
        $backlog->failure(get_lang('There is an error in exercise data of imported file.'));
        return false;
    }
    ksort($exercise_info['question'], SORT_NUMERIC);
    //For each question found...
    foreach ($exercise_info['question'] as $key => $question_array) {
        //2.create question
        $question = new Qti2Question();
        $question->import($question_array);
        if ($question->validate()) {
            // I need to save the question after the answer because I need question id in answers
            $question_id = $question->save();
            //3.create answers
            $question->setAnswer();
            $question->answer->import($question_array);
            if ($question->answer->validate()) {
                $question->setGrade($question->answer->getGrade());
                $question->save();
                // save computed grade
                $question->answer->save();
                $exercise->addQuestion($question_id);
            } else {
                $backlog->failure(get_lang('Invalid answer') . ' : ' . $key);
            }
        } else {
            $backlog->failure(get_lang('Invalid question') . ' : ' . $key);
        }
    }
    // delete the temp dir where the exercise was unzipped
    claro_delete_file($uploadDir);
    return $exercise_id;
}