/** * Convert BB export course file to JLMS export course file and upload it to database * @param String Name of form field with bb filename * @return Array ['lmsfile'] - Name of JLMS export course file (file placed in \media) (null if error) ['msg'] - Message */ function processBBfile($course_id = 0, $def_course_name = 'BB course', $do_lms_archive = true, $upload_to_db = true) { global $JLMS_DB, $JLMS_CONFIG, $my; if (!$this->is_prepared) { return array('lmsfile' => null, 'msg' => "Error! Invalid parameters passed"); } if (!$do_lms_archive && !$upload_to_db || !$this->bb_file_media_name && !$this->bb_file_tmp_name) { return array('lmsfile' => null, 'msg' => "Error! Invalid parameters passed"); } require_once $JLMS_CONFIG->get('absolute_path') . "/components/com_joomla_lms/includes/jlms_dir_operation.php"; require_once $JLMS_CONFIG->get('absolute_path') . "/components/com_joomla_lms/includes/jlms_zip_operation.php"; // for function "JLMS_parse_XML_elements()" require_once $JLMS_CONFIG->get('absolute_path') . "/components/com_joomla_lms/includes/jlms_course_import.php"; @set_time_limit('3000'); // Check that the zlib is available if (!extension_loaded('zlib')) { return array('lmsfile' => null, 'msg' => "Error! zlib library unavailable"); } if (!$this->bb_file_media_name && !$this->bb_file_tmp_name) { return array('lmsfile' => null, 'msg' => _JLMS_EM_SELECT_FILE); } $config =& JFactory::getConfig(); $extract_dir = $config->get('tmp_path') . DS . "bb_course_export_" . uniqid(rand()) . DS; if ($this->bb_file_tmp_name) { $archive = $this->bb_file_tmp_name; } else { $archive = $JLMS_CONFIG->get('absolute_path') . "/media/" . $this->bb_file_media_name; } //exstract archive in uniqfolder media extractBackupArchive($archive, $extract_dir); $xmlFile = $extract_dir . "imsmanifest.xml"; if ($fp1 = fopen($xmlFile, "r")) { $fline = fgets($fp1); $match = array(); preg_match('/encoding="([0-9a-zA-Z-]*)"/i', $fline, $match); //find quoted encoding if (isset($match[1]) && $match[1] != "ISO-8859-1") { $this->charset_lang = $match[1]; } fclose($fp1); } $xmlDoc =& JLMSFactory::getXMLParser(); if (!$xmlDoc->loadFile($xmlFile)) { return array('lmsfile' => null, 'msg' => 'Error during reading xml file'); } $root =& $xmlDoc->document; if ($root->name() != 'manifest') { return array('lmsfile' => null, 'msg' => 'Not a Course installation file'); } // **************************************************************************************************** //get config values $query = "SELECT * FROM `#__lms_config`"; $JLMS_DB->SetQuery($query); $lms_cfg = $JLMS_DB->LoadObjectList(); $lms_cfg_doc_folder = ''; $lms_cfg_scorm = ''; $lms_cfg_backup_folder = ''; $lms_cfg_quiz_enabled = 0; foreach ($lms_cfg as $lcf) { if ($lcf->lms_config_var == 'plugin_quiz') { $lms_cfg_quiz_enabled = $lcf->lms_config_value; } elseif ($lcf->lms_config_var == 'jlms_doc_folder') { $lms_cfg_doc_folder = $lcf->lms_config_value; } elseif ($lcf->lms_config_var == 'scorm_folder') { $lms_cfg_scorm = $lcf->lms_config_value; } elseif ($lcf->lms_config_var == 'jlms_backup_folder') { $lms_cfg_backup_folder = $lcf->lms_config_value; } } // *************************************************************************************************** $course = new stdClass(); $course->course_name = $def_course_name; $course->course_description = ''; $course->metadesc = ''; $course->metakeys = ''; $course->self_reg = ''; $course->paid = 0; $course->add_forum = 0; $course->add_chat = 0; $course->owner_id = $my->id; $course->published = 0; $course->publish_start = 0; $course->publish_end = 0; $course->start_date = '0000-00-00'; $course->end_date = '0000-00-00'; $course->spec_reg = 0; $course->cat_id = 0; // 02.03.2007 1.0.1 support $course->params = ''; $course->gid = 0; $course->language = 0; //get resources $element =& $root->getElementByPath('resources'); $resources = JLMS_parse_XML_elements($element->children(), array('identifier', 'type'), array()); foreach ($resources as $resource) { if ($resource->type == 'course/x-bb-coursesetting') { $resourceFile = $extract_dir . $resource->identifier . ".dat"; $resourceXmlDoc =& JLMSFactory::getXMLParser(); ////$resourceXmlDoc->resolveErrors( true ); if ($resourceXmlDoc->loadFile($resourceFile)) { $resourceRoot =& $resourceXmlDoc->document; $resourceElement =& $resourceRoot->getElementByPath('title'); $course->course_name = $this->attributes($resourceElement, 'value'); if ($def_course_name != 'BB course') { $course->course_name = $def_course_name; } $resourceElement =& $resourceRoot->getElementByPath('description'); $course->course_description = $this->data($resourceElement); } } } //save course if ($upload_to_db) { if (!$course_id) { $JLMS_DB->insertObject("#__lms_courses", $course, "id"); //get new Course_id $course_id = $JLMS_DB->insertid(); // create teacher for imported course $default_teacher_role = 0; $query = "SELECT id FROM #__lms_usertypes WHERE roletype_id = 2 AND default_role = 1 LIMIT 0,1"; $JLMS_DB->setQuery($query); $default_teacher_role = intval($JLMS_DB->LoadResult()); if (!$default_teacher_role) { $query = "SELECT id FROM #__lms_usertypes WHERE roletype_id = 2 LIMIT 0,1"; $JLMS_DB->setQuery($query); $default_teacher_role = intval($JLMS_DB->LoadResult()); if (!$default_teacher_role) { $default_teacher_role = 1; } } $query = "INSERT INTO `#__lms_user_courses` (user_id, course_id, role_id) VALUES ('" . $my->id . "','" . $course_id . "','" . $default_teacher_role . "')"; $JLMS_DB->setQuery($query); $JLMS_DB->query(); } } // ****************************************************************************************************************** // process resourses $i = 0; //get data from resource files while ($i < count($resources)) { //$resources[$i]->identifier .= ".dat"; $resourceFile = $extract_dir . $resources[$i]->identifier . ".dat"; //echo $resourceFile.'<br />'; $resourceXmlDoc =& JLMSFactory::getXMLParser(); //$resourceXmlDoc->resolveErrors( true ); if ($resourceXmlDoc->loadFile($resourceFile)) { $resourceRoot =& $resourceXmlDoc->document; //file, folder, link or content $resources[$i]->resource_type = ''; if ($resources[$i]->type == 'resource/x-bb-document') { $resourceElement =& $resourceRoot->getElementByPath('contenthandler'); // resource/x-bb-document - content may be with file // resource/x-bb-folder - foder // resource/x-bb-externallink - link $resources[$i]->resource_type = $this->attributes($resourceElement, 'value'); if ($resources[$i]->resource_type == 'resource/x-bb-document' || $resources[$i]->resource_type == 'resource/x-bb-folder' || $resources[$i]->resource_type == 'resource/x-bb-externallink') { //save files $resourceElement =& $resourceRoot->getElementByPath('files'); $files = JLMS_parse_XML_elements($resourceElement->children(), array('id'), array('name')); if (count($files) > 0) { $resources[$i]->files = $files; } //$resourceElement = &$resourceRoot->getElementByPath('CONTENT', 1); $resources[$i]->id = $this->attributes($resourceRoot, 'id'); //save URLs $resourceElement =& $resourceRoot->getElementByPath('url'); if ($this->attributes($resourceElement, 'value')) { $resources[$i]->url = $this->attributes($resourceElement, 'value'); } //save name and description $resourceElement =& $resourceRoot->getElementByPath('title'); if ($this->attributes($resourceElement, 'value')) { $resources[$i]->title = $this->attributes($resourceElement, 'value'); } else { $resources[$i]->title = ''; } $resourceElement =& $resourceRoot->getElementByPath('body'); $text =& $resourceElement->getElementByPath('text'); if ($text) { $resources[$i]->text = $this->data($text); } else { $resources[$i]->text = ''; } //save START and END date $resourceElement =& $resourceRoot->getElementByPath('dates'); $tmp = $resourceElement->getElementByPath('start'); if ($this->attributes($tmp, 'value')) { $resources[$i]->start = $this->attributes($tmp, 'value'); } $tmp = $resourceElement->getElementByPath('end'); if ($this->attributes($tmp, 'value')) { $resources[$i]->end = $this->attributes($tmp, 'value'); } } } elseif ($resources[$i]->type == 'resource/x-bb-announcement') { //save name and description $resourceElement =& $resourceRoot->getElementByPath('title'); if ($this->attributes($resourceElement, 'value')) { $resources[$i]->title = $this->attributes($resourceElement, 'value'); } $resourceElement =& $resourceRoot->getElementByPath('description'); $text =& $resourceElement->getElementByPath('text'); if ($text) { $resources[$i]->text = $this->data($text); } else { $resources[$i]->text = ''; } //save START and END date $resourceElement =& $resourceRoot->getElementByPath('dates'); $tmp = $resourceElement->getElementByPath('RESTRICTSTART'); if ($this->attributes($tmp, 'value')) { $resources[$i]->restrictstart = $this->attributes($tmp, 'value'); } $tmp = $resourceElement->getElementByPath('RESTRICTEND'); if ($this->attributes($tmp, 'value')) { $resources[$i]->restrictend = $this->attributes($tmp, 'value'); } } elseif ($resources[$i]->type == 'resource/x-bb-task') { //save name and description $resourceElement =& $resourceRoot->getElementByPath('title'); if ($this->attributes($resourceElement, 'value')) { $resources[$i]->title = $this->attributes($resourceElement, 'value'); } $resourceElement =& $resourceRoot->getElementByPath('description'); $text =& $resourceElement->getElementByPath('text'); if ($text) { $resources[$i]->text = $this->data($text); } else { $resources[$i]->text = ''; } //save DUE date $resourceElement =& $resourceRoot->getElementByPath('dates'); $tmp = $resourceElement->getElementByPath('due'); if ($this->attributes($tmp, 'value')) { $resources[$i]->due = $this->attributes($tmp, 'value'); } } elseif ($resources[$i]->type == 'assessment/x-bb-qti-test' || $resources[$i]->type == 'assessment/x-bb-qti-pool' || $resources[$i]->type == 'assessment/x-bb-qti-survey') { //save name and description $resourceElement =& $resourceRoot->getElementByPath('assessment'); $resourceElement =& $resourceElement->getElementByPath('section'); $resourceElement =& $resourceElement->getElementByPath('sectionmetadata'); $resourceElement =& $resourceElement->getElementByPath('bbmd_assessmenttype'); $assess_type = $this->data($resourceElement); $resources[$i]->assess_type = $assess_type; if ($assess_type != 'Survey') { $resourceElement =& $resourceRoot->getElementByPath('assessment'); if ($this->attributes($resourceElement, 'title')) { $resources[$i]->title = $this->attributes($resourceElement, 'title'); } $resourceElement =& $resourceElement->getElementByPath('presentation_material'); $resourceElement =& $resourceElement->getElementByPath('flow_mat'); $resourceElement =& $resourceElement->getElementByPath('material'); $resourceElement =& $resourceElement->getElementByPath('mat_extension'); $resourceElement =& $resourceElement->getElementByPath('mat_formattedtext'); $resources[$i]->text = $this->data($resourceElement); //save max score $resourceElement =& $resourceRoot->getElementByPath('assessment'); $resourceElement =& $resourceElement->getElementByPath('section'); $resourceElement =& $resourceElement->getElementByPath('sectionmetadata'); $tmp =& $resourceElement->getElementByPath('bbmd_asi_object_id'); $resources[$i]->q_id = $this->data($tmp); $resourceElement =& $resourceElement->getElementByPath('qmd_absolutescore_max'); $resources[$i]->score_max = $this->data($resourceElement); //save questions $resourceElement =& $resourceRoot->getElementByPath('assessment'); $resourceElement =& $resourceElement->getElementByPath('section'); $resources[$i]->questions = $this->getQuestions($resourceElement->children(), $resources[$i]->q_id, $resources[$i]->identifier); $resources[$i]->answers = $this->getAnswers($resourceElement->children(), $resources[$i]->q_id); } } elseif ($resources[$i]->type == 'course/x-bb-gradebook') { //get name and descriptoin $resourceElement =& $resourceRoot->getElementByPath('outcomedefinitions'); $gb = array(); foreach ($resourceElement->children() as $item) { $title = $item->getElementByPath('title'); $description = $item->getElementByPath('description'); if ($this->attributes($title, 'value') == 'OutcomeDefinition.Total.title' || $this->attributes($title, 'value') == 'OutcomeDefinition.WeightedTotal.title') { continue; } $identifier = $item->getElementByPath('asidataid'); $identifier = $this->attributes($identifier, 'value'); if (!$identifier) { $insert = new stdClass(); $insert->title = $this->attributes($title, 'value'); $insert->description = $this->data($description); $gb[] = $insert; } } $resources[$i]->gradebook = $gb; } elseif ($resources[$i]->type == 'course/x-bb-coursesetting') { $resourceElement =& $resourceRoot->getElementByPath('title'); $course->course_name = $this->attributes($resourceElement, 'value'); $resourceElement =& $resourceRoot->getElementByPath('description'); $course->course_description = $this->data($resourceElement); } ##elseif ( $resources[$i]->type == 'course/x-bb-coursesetting' ) .... } ## if ($resourceXmlDoc->loadXML( $resourceFile, false, true )) .... $i++; } ## while( $i < count($resources) ) .... // ******************************************************************************************************************* $i = 0; $announcements = array(); $homeworks = array(); $links = array(); $files = array(); $gradebook = array(); $quizzes_no = array(); $quizzes = array(); $questions = array(); $answers = array(); //prepare data to save while ($i < count($resources)) { if (($resources[$i]->type == 'assessment/x-bb-qti-test' || $resources[$i]->type == 'assessment/x-bb-qti-pool' || $resources[$i]->type == 'assessment/x-bb-qti-survey') && $resources[$i]->assess_type != 'Survey') { $insert = new stdClass(); $insert->_c_id = $resources[$i]->q_id; $insert->c_category_id = null; $insert->c_user_id = $my->id; $insert->c_full_score = abs($resources[$i]->score_max); // 17.12.2007 (DEN) - negative values bug - needed another solution - BB courses have negative points values ! $insert->c_title = $resources[$i]->title; $insert->c_description = $resources[$i]->text; $insert->c_time_limit = 5; $insert->c_min_after = 5; $insert->c_passing_score = 1; $insert->c_created_time = date('Y-m-d'); $insert->published = 0; $insert->c_right_message = 'correct'; $insert->c_wrong_message = 'incorrect'; $insert->c_pass_message = 'pass'; $insert->c_unpass_message = 'fail'; $insert->c_enable_review = null; $insert->c_email_to = 0; $insert->c_enable_print = null; $insert->c_enable_sertif = null; $insert->c_skin = 3; $insert->c_random = 0; $insert->c_guest = 0; $insert->c_slide = 1; $insert->c_language = 1; $insert->c_certificate = 0; $insert->c_gradebook = 1; $insert->course_id = $course_id; $quizzes[] = $insert; $quizzes_no[] = $i; $questions[] = $resources[$i]->questions; $answers[] = $resources[$i]->answers; } if (isset($resources[$i]->url)) { $insert = new stdClass(); $insert->course_id = $course_id; $insert->owner_id = $my->id; $insert->link_name = $resources[$i]->title; $insert->link_href = $resources[$i]->url; $insert->link_description = $resources[$i]->text; $insert->link_type = 0; $insert->ordering = 0; $insert->published = 0; $insert->_id = $resources[$i]->id; $links[] = $insert; } if ($resources[$i]->type == 'resource/x-bb-announcement') { $insert = new stdClass(); $insert->course_id = $course_id; $insert->owner_id = $my->id; $insert->title = $resources[$i]->title; $insert->content = $resources[$i]->text; $insert->start_date = $resources[$i]->restrictstart; $insert->end_date = isset($resources[$i]->restrictend) ? $resources[$i]->restrictend : $resources[$i]->restrictstart; $announcements[] = $insert; } if ($resources[$i]->type == 'resource/x-bb-task') { $insert = new stdClass(); $insert->course_id = $course_id; $insert->hw_name = $resources[$i]->title; $insert->hw_description = $resources[$i]->text; $insert->hw_shortdescription = $resources[$i]->text; $insert->post_date = date("Y-m-d"); $insert->end_date = $resources[$i]->due; $homeworks[] = $insert; } if ($resources[$i]->type == 'course/x-bb-gradebook') { foreach ($resources[$i]->gradebook as $item) { $insert = new stdClass(); $insert->course_id = $course_id; $insert->gbc_id = 0; $insert->gbi_name = $item->title; $insert->gbi_description = $item->description; $insert->gbi_points = 0; $insert->gbi_option = 0; $insert->ordering = 0; $gradebook[] = $insert; } } if (isset($resources[$i]->files)) { $file = $resources[$i]->files[0]; if ($this->charset_lang != 'ISO-8859-1') { $file->name = htmlentities($file->name, ENT_QUOTES, $this->charset_lang); $file->name = str_replace('<', '<', $file->name); $file->name = str_replace('>', '>', $file->name); $file->name = str_replace('&', '&', $file->name); } $fromDir = $extract_dir . $resources[$i]->identifier . "/"; $toDir = $lms_cfg_doc_folder . "/"; $insert_file = new stdClass(); $insert_file->_fromDir = $extract_dir . $resources[$i]->identifier . "/"; $insert_file->_toDir = $lms_cfg_doc_folder . "/"; $insert_file->file_name = $file->name; $file_unique_name = str_pad($course_id, 4, '0', STR_PAD_LEFT) . '_' . md5(uniqid(rand(), true)) . '.' . substr($file->name, -3); $insert_file->file_srv_name = $file_unique_name; $insert_file->owner_id = $my->id; if (!file_exists($insert_file->_fromDir . $insert_file->file_name)) { $res_dir = opendir($insert_file->_fromDir); while (false !== ($res_file = readdir($res_dir))) { if ($res_file != "." && $res_file != "..") { rename($insert_file->_fromDir . $res_file, $insert_file->_fromDir . $insert_file->file_srv_name); break; } } closedir($res_dir); } else { rename($insert_file->_fromDir . $insert_file->file_name, $insert_file->_fromDir . $insert_file->file_srv_name); } $insert_file->_id = $file->id; $file->file_srv_name = $insert_file->file_srv_name; $resources[$i]->files[0] = $file; $files[] = $insert_file; } $i++; } $element =& $root->getElementByPath('organizations'); $element = $element->getElementByPath('organization'); //$items = JLMS_parse_XML_elements($element->children(), array('identifierref'), array()); $i = 0; $documents1 = array(); while ($i < count($element->children())) { $nodes = $element->children(); $node = $nodes[$i]; $title = $node->getElementByPath('title'); $title = substr($this->data($title), 15); $title = substr($title, 0, strpos($title, ".")); foreach ($node->children() as $item) { if ($item->name() == 'item') { $this->Process_Item($item, $documents1, $resources); } } $i++; } $documents1 = array_reverse($documents1); // insert data to database if ($upload_to_db) { if (in_array('links', $this->options)) { for ($i = 0, $n = count($links); $i < $n; $i++) { $JLMS_DB->insertObject("#__lms_links", $links[$i], "id"); $links[$i]->_id = $JLMS_DB->insertid(); } } if (in_array('announcements', $this->options)) { for ($i = 0, $n = count($announcements); $i < $n; $i++) { $JLMS_DB->insertObject("#__lms_agenda", $announcements[$i], "id"); } } if (in_array('homework', $this->options)) { for ($i = 0, $n = count($homeworks); $i < $n; $i++) { $JLMS_DB->insertObject("#__lms_homework", $homeworks[$i], "id"); } } if (in_array('gradebook_items', $this->options)) { for ($i = 0, $n = count($gradebook); $i < $n; $i++) { $JLMS_DB->insertObject("#__lms_gradebook_items", $gradebook[$i], "id"); } } if (in_array('documents', $this->options)) { for ($i = 0, $n = count($files); $i < $n; $i++) { $JLMS_DB->insertObject("#__lms_files", $files[$i], "id"); $files[$i]->new_file_id = $JLMS_DB->insertid(); } } if (in_array('quizzes', $this->options)) { $i = 0; while ($i < count($quizzes)) { $JLMS_DB->insertObject("#__lms_quiz_t_quiz", $quizzes[$i], "c_id"); $new_quiz_id = $JLMS_DB->insertid(); $quizzes[$i]->new_quiz_id = $new_quiz_id; $quizzes[$i]->_c_id = $new_quiz_id; //questions processing $j = 0; while ($j < count($questions[$i])) { $questions[$i][$j]->course_id = $course_id; $questions[$i][$j]->c_quiz_id = $new_quiz_id; $JLMS_DB->insertObject("#__lms_quiz_t_question", $questions[$i][$j], "c_id"); $questions[$i][$j]->new_id = $JLMS_DB->insertid(); $j++; } //choices processing $j = 0; while ($j < count($answers[$i]['choice_data'])) { for ($k = 0; $k < count($questions[$i]); $k++) { if ($questions[$i][$k]->_c_id == $answers[$i]['choice_data'][$j]->c_question_id) { $answers[$i]['choice_data'][$j]->c_question_id = isset($questions[$i][$k]->new_id) ? $questions[$i][$k]->new_id : 0; break; } } if ($answers[$i]['choice_data'][$j]->c_question_id > 0) { $JLMS_DB->insertObject("#__lms_quiz_t_choice", $answers[$i]['choice_data'][$j], "c_id"); } $j++; } //matching processing $j = 0; while ($j < count($answers[$i]['match_data'])) { for ($k = 0; $k < count($questions[$i]); $k++) { if ($questions[$i][$k]->_c_id == $answers[$i]['match_data'][$j]->c_question_id) { $answers[$i]['match_data'][$j]->c_question_id = isset($questions[$i][$k]->new_id) ? $questions[$i][$k]->new_id : 0; break; } } if ($answers[$i]['match_data'][$j]->c_question_id > 0) { $JLMS_DB->insertObject("#__lms_quiz_t_matching", $answers[$i]['match_data'][$j], "c_id"); } $j++; } //hotspot processing $j = 0; while ($j < count($answers[$i]['hotspot_data'])) { for ($k = 0; $k < count($questions[$i]); $k++) { if ($questions[$i][$k]->_c_id == $answers[$i]['hotspot_data'][$j]->c_question_id) { $answers[$i]['hotspot_data'][$j]->c_question_id = isset($questions[$i][$k]->new_id) ? $questions[$i][$k]->new_id : 0; break; } } if ($answers[$i]['hotspot_data'][$j]->c_question_id > 0) { $JLMS_DB->insertObject("#__lms_quiz_t_hotspot", $answers[$i]['hotspot_data'][$j], "c_id"); } $j++; } //blank quests processing $j = 0; while ($j < count($answers[$i]['blank_data'])) { for ($k = 0; $k < count($questions[$i]); $k++) { if ($questions[$i][$k]->_c_id == $answers[$i]['blank_data'][$j]['obj']->c_question_id) { $answers[$i]['blank_data'][$j]['obj']->c_question_id = isset($questions[$i][$k]->new_id) ? $questions[$i][$k]->new_id : 0; break; } } if ($answers[$i]['blank_data'][$j]['obj']->c_question_id > 0) { $JLMS_DB->insertObject("#__lms_quiz_t_blank", $answers[$i]['blank_data'][$j]['obj'], "c_id"); $new_blank_id = $JLMS_DB->insertid(); foreach ($answers[$i]['blank_data'][$j]['ans'] as $ans) { $q_blank_text = new stdClass(); $q_blank_text->c_blank_id = $new_blank_id; $q_blank_text->c_text = $ans; $q_blank_text->ordering = 0; if ($q_blank_text->c_blank_id > 0) { $JLMS_DB->insertObject("#__lms_quiz_t_text", $q_blank_text, "c_id"); } } } $j++; } $i++; } } if (in_array('documents', $this->options)) { $i = 0; while ($i < count($documents1)) { $insert = new stdClass(); $insert->course_id = $course_id; $insert->owner_id = $my->id; $insert->file_id = 0; if ($documents1[$i]->file_id) { // search $files for new file_id for ($j = 0; $j < count($files); $j++) { if ($files[$j]->_id == $documents1[$i]->file_id) { $insert->file_id = $files[$j]->new_file_id; break; } } } $insert->folder_flag = $documents1[$i]->folder_flag; $insert->doc_name = $documents1[$i]->doc_name; $insert->doc_description = $documents1[$i]->doc_description; $insert->ordering = $documents1[$i]->ordering; $insert->published = $documents1[$i]->published; $insert->publish_start = $documents1[$i]->publish_start; $insert->start_date = $documents1[$i]->start_date; $insert->publish_end = $documents1[$i]->publish_end; $insert->end_date = $documents1[$i]->end_date; // search processed $documents for parent_id $parent = $documents1[$i]->parent_id; if ($parent) { $a = 0; while ($a < $i) { if ($documents1[$a]->id == $parent) { $parent = $documents1[$a]->new_doc_id; break; } $a++; } } $insert->parent_id = $parent; $JLMS_DB->insertObject("#__lms_documents", $insert, "id"); $documents1[$i]->new_doc_id = $JLMS_DB->insertid(); $i++; } } if (in_array('quizzes', $this->options)) { $toDir = $JLMS_CONFIG->get('absolute_path') . "/images/joomlaquiz/images/"; foreach ($questions as $question) { foreach ($question as $quest) { if (isset($quest->_c_image)) { $filename = $extract_dir . $quest->_identifier . "/" . $quest->_c_image; //$pz->add($filename,'quiz_images', $extract_dir.$quest->identifier."/".substr($quest->_c_image, 0, strpos($quest->_c_image, '\\'))."/"); @copy($filename, $toDir . $quest->c_image); } } } } if (in_array('documents', $this->options)) { $toDir = $lms_cfg_doc_folder . "/"; foreach ($files as $file) { $filename = $file->_fromDir . $file->file_srv_name; //$pz->add($filename,'files', $file->_fromDir); copy($filename, $toDir . $file->file_srv_name); } } } if ($do_lms_archive) { $export_xml = ""; $export_xml .= "<?xml version=\"1.0\" ?>\r\n"; $export_xml .= "\t<course_backup lms_version=\"1.0.0\">\r\n"; $export_xml .= "\t\t<name><![CDATA[" . $course->course_name . "]]></name>\r\n"; $export_xml .= "\t\t<description><![CDATA[" . $course->course_description . "]]></description>\r\n"; $export_xml .= "\t\t<course_category><![CDATA[]]></course_category>\r\n"; $export_xml .= "\t\t<metadesc><![CDATA[" . $course->metadesc . "]]></metadesc>\r\n"; $export_xml .= "\t\t<metakeys><![CDATA[" . $course->metakeys . "]]></metakeys>\r\n"; $export_xml .= "\t\t<language_name><![CDATA[english]]></language_name>\r\n"; $export_xml .= "\t\t<course_paid><![CDATA[" . $course->paid . "]]></course_paid>\r\n"; $export_xml .= "\t\t<self_registration>" . $course->self_reg . "</self_registration>\r\n"; $export_xml .= "\t\t<forum_enabled>" . $course->add_forum . "</forum_enabled>\r\n"; $export_xml .= "\t\t<chat_enabled>" . $course->add_chat . "</chat_enabled>\r\n"; $export_xml .= "\t\t<publish_start>" . $course->publish_start . "</publish_start>\r\n"; $export_xml .= "\t\t<publish_start_date><![CDATA[" . $course->start_date . "]]></publish_start_date>\r\n"; $export_xml .= "\t\t<publish_end>" . $course->publish_end . "</publish_end>\r\n"; $export_xml .= "\t\t<publish_end_date><![CDATA[" . $course->end_date . "]]></publish_end_date>\r\n"; $export_xml .= "\t\t<spec_reg>" . $course->spec_reg . "</spec_reg>\r\n"; $export_xml .= "\t\t<course_question><![CDATA[]]></course_question>\r\n"; $export_xml .= "\t\t<course_params><![CDATA[" . $course->params . "]]></course_params>\r\n"; $export_xml .= "\t\t<hidden_menu_items></hidden_menu_items>\n"; $export_xml .= "\t\t<certificates></certificates>\n"; $export_xml .= "\t\t<scorms></scorms>\n"; $export_xml .= "\t\t<zipped_documents></zipped_documents>\n"; $export_xml .= "\t\t<learn_paths></learn_paths>\n"; $export_xml .= "\t\t<gradebook_scale></gradebook_scale>\n"; //GradeBook Items: $export_xml .= "\t\t<gradebook_items>\n"; if (in_array('gradebook_items', $this->options)) { foreach ($gradebook as $gb_item) { $export_xml .= "\t\t\t<gb_item gbi_option=\"" . $gb_item->gbi_option . "\" ordering=\"" . $gb_item->ordering . "\" >\n"; $export_xml .= "\t\t\t\t<gbi_name><![CDATA[" . $gb_item->gbi_name . "]]></gbi_name>\r\n"; $export_xml .= "\t\t\t\t<gbi_description><![CDATA[" . $gb_item->gbi_description . "]]></gbi_description>\r\n"; $export_xml .= "\t\t\t\t<gb_category><![CDATA[]]></gb_category>\r\n"; $export_xml .= "\t\t\t</gb_item>\n"; } } $export_xml .= "\t\t</gradebook_items>\n"; //links section $export_xml .= "\t\t<links>\n"; if (in_array('links', $this->options)) { foreach ($links as $link) { $export_xml .= "\t\t\t<link id=\"" . $link->_id . "\" link_type=\"" . $link->link_type . "\" ordering=\"" . $link->ordering . "\" published=\"" . $link->published . "\">\n"; $export_xml .= "\t\t\t\t<linkname><![CDATA[" . $link->link_name . "]]></linkname>\r\n"; $export_xml .= "\t\t\t\t<linkhref><![CDATA[" . $link->link_href . "]]></linkhref>\r\n"; $export_xml .= "\t\t\t\t<description><![CDATA[" . $link->link_description . "]]></description>\r\n"; $export_xml .= "\t\t\t</link>\n"; } } $export_xml .= "\t\t</links>\n"; //files section $export_xml .= "\t\t<files>\n"; if (in_array('documents', $this->options)) { foreach ($files as $ff) { $export_xml .= "\t\t\t<file id=\"" . $ff->_id . "\">\n"; $export_xml .= "\t\t\t\t<filename><![CDATA[" . $ff->file_name . "]]></filename>\r\n"; $export_xml .= "\t\t\t\t<servername><![CDATA[" . $ff->file_srv_name . "]]></servername>\r\n"; $export_xml .= "\t\t\t</file>\n"; } } $export_xml .= "\t\t</files>\n"; //documents section $export_xml .= "\t\t<documents>\n"; if (in_array('documents', $this->options)) { foreach ($documents1 as $document) { $export_xml .= "\t\t\t<document id=\"" . $document->id . "\" file_id=\"" . $document->file_id . "\" folder_flag=\"" . $document->folder_flag . "\" parent_id=\"" . $document->parent_id . "\" ordering=\"" . $document->ordering . "\" published=\"" . $document->published . "\" publish_start=\"" . $document->publish_start . "\" start_date=\"" . $document->start_date . "\" publish_end=\"" . $document->publish_end . "\" end_date=\"" . $document->end_date . "\" >\r\n"; $export_xml .= "\t\t\t\t<doc_name><![CDATA[" . $document->doc_name . "]]></doc_name>\n"; $export_xml .= "\t\t\t\t<doc_description><![CDATA[" . $document->doc_description . "]]></doc_description>\n"; $export_xml .= "\t\t\t</document>\n"; } } $export_xml .= "\t\t</documents>\n"; $export_xml .= "\t\t<quizzes>\n"; if (in_array('quizzes', $this->options)) { for ($i = 0, $n = count($quizzes); $i < $n; $i++) { $quiz = $quizzes[$i]; $question = $questions[$i]; $answer = $answers[$i]; $export_xml .= "\t\t\t<quiz c_id=\"" . $quiz->_c_id . "\" published=\"" . $quiz->published . "\" >\r\n"; $export_xml .= "\t\t\t\t<quiz_title><![CDATA[" . $quiz->c_title . "]]></quiz_title>\r\n"; $export_xml .= "\t\t\t\t<quiz_description><![CDATA[" . $quiz->c_description . "]]></quiz_description>\r\n"; $export_xml .= "\t\t\t\t<quiz_category><![CDATA[" . $quiz->c_category_id . "]]></quiz_category>\r\n"; $export_xml .= "\t\t\t\t<quiz_full_score><![CDATA[" . $quiz->c_full_score . "]]></quiz_full_score>\r\n"; $export_xml .= "\t\t\t\t<quiz_time_limit><![CDATA[" . $quiz->c_time_limit . "]]></quiz_time_limit>\r\n"; $export_xml .= "\t\t\t\t<quiz_min_after><![CDATA[" . $quiz->c_min_after . "]]></quiz_min_after>\r\n"; $export_xml .= "\t\t\t\t<quiz_passing_score><![CDATA[" . $quiz->c_passing_score . "]]></quiz_passing_score>\r\n"; $export_xml .= "\t\t\t\t<quiz_right_message><![CDATA[" . $quiz->c_right_message . "]]></quiz_right_message>\r\n"; $export_xml .= "\t\t\t\t<quiz_wrong_message><![CDATA[" . $quiz->c_wrong_message . "]]></quiz_wrong_message>\r\n"; $export_xml .= "\t\t\t\t<quiz_pass_message><![CDATA[" . $quiz->c_pass_message . "]]></quiz_pass_message>\r\n"; $export_xml .= "\t\t\t\t<quiz_unpass_message><![CDATA[" . $quiz->c_unpass_message . "]]></quiz_unpass_message>\r\n"; $export_xml .= "\t\t\t\t<quiz_review>" . $quiz->c_enable_review . "</quiz_review>\r\n"; $export_xml .= "\t\t\t\t<quiz_email>" . $quiz->c_email_to . "</quiz_email>\r\n"; $export_xml .= "\t\t\t\t<quiz_print>" . $quiz->c_enable_print . "</quiz_print>\r\n"; $export_xml .= "\t\t\t\t<quiz_certif>" . $quiz->c_enable_sertif . "</quiz_certif>\r\n"; $export_xml .= "\t\t\t\t<quiz_skin>" . $quiz->c_skin . "</quiz_skin>\r\n"; $export_xml .= "\t\t\t\t<quiz_random>" . $quiz->c_random . "</quiz_random>\r\n"; $export_xml .= "\t\t\t\t<quiz_guest>" . $quiz->c_guest . "</quiz_guest>\r\n"; $export_xml .= "\t\t\t\t<quiz_slide>" . $quiz->c_slide . "</quiz_slide>\r\n"; $export_xml .= "\t\t\t\t<quiz_language>" . $quiz->c_language . "</quiz_language>\r\n"; $export_xml .= "\t\t\t\t<quiz_certificate>" . $quiz->c_certificate . "</quiz_certificate>\r\n"; $export_xml .= "\t\t\t\t<quiz_gradebook>" . $quiz->c_gradebook . "</quiz_gradebook>\r\n"; $export_xml .= "\t\t\t\t<quiz_questions>\n"; if (count($question)) { foreach ($question as $quest) { $export_xml .= "\t\t\t\t\t<quiz_question c_id=\"" . $quest->_c_id . "\" c_point=\"" . $quest->c_point . "\" c_attempts=\"" . $quest->c_attempts . "\" c_type=\"" . $quest->c_type . "\" ordering=\"" . $quest->ordering . "\">\n"; $export_xml .= "\t\t\t\t\t\t<question_text><![CDATA[" . $quest->c_question . "]]></question_text>\r\n"; $export_xml .= "\t\t\t\t\t\t<question_image><![CDATA[" . $quest->c_image . "]]></question_image>\r\n"; $export_xml .= "\t\t\t\t\t</quiz_question>\n"; } } $export_xml .= "\t\t\t\t</quiz_questions>\n"; $export_xml .= "\t\t\t\t<choice_data>\n"; if (count($answer['choice_data'])) { foreach ($answer['choice_data'] as $qc_one) { $export_xml .= "\t\t\t\t\t<quest_choice c_question_id=\"" . $qc_one->c_question_id . "\" c_right=\"" . $qc_one->c_right . "\" ordering=\"" . $qc_one->ordering . "\">\r\n"; $export_xml .= "\t\t\t\t\t\t<choice_text><![CDATA[" . $qc_one->c_choice . "]]></choice_text>\r\n"; $export_xml .= "\t\t\t\t\t</quest_choice>\n"; } } $export_xml .= "\t\t\t\t</choice_data>\n"; $export_xml .= "\t\t\t\t<match_data>\n"; if (count($answer['match_data'])) { foreach ($answer['match_data'] as $qm_one) { $export_xml .= "\t\t\t\t\t<quest_match c_question_id=\"" . $qm_one->c_question_id . "\" ordering=\"" . $qm_one->ordering . "\">\r\n"; $export_xml .= "\t\t\t\t\t\t<match_text_left><![CDATA[" . $qm_one->c_left_text . "]]></match_text_left>\r\n"; $export_xml .= "\t\t\t\t\t\t<match_text_right><![CDATA[" . $qm_one->c_right_text . "]]></match_text_right>\r\n"; $export_xml .= "\t\t\t\t\t</quest_match>\n"; } } $export_xml .= "\t\t\t\t</match_data>\n"; $export_xml .= "\t\t\t\t<blank_data>\n"; if (count($answer['blank_data'])) { foreach ($answer['blank_data'] as $qb_one) { $export_xml .= "\t\t\t\t\t<quest_blank c_question_id=\"" . $qb_one['obj']->c_question_id . "\" ordering=\"" . $qb_one['obj']->_ordering . "\">\r\n"; foreach ($qb_one['ans'] as $ans) { $export_xml .= "\t\t\t\t\t\t<blank_text><![CDATA[" . $ans . "]]></blank_text>\r\n"; } $export_xml .= "\t\t\t\t\t</quest_blank>\n"; } } $export_xml .= "\t\t\t\t</blank_data>\n"; $export_xml .= "\t\t\t\t<hotspot_data>\n"; if (count($answer['hotspot_data'])) { foreach ($answer['hotspot_data'] as $qh_one) { $export_xml .= "\t\t\t\t\t<quest_hotspot c_question_id=\"" . $qh_one->c_question_id . "\">\r\n"; $export_xml .= "\t\t\t\t\t\t<hs_start_x><![CDATA[" . $qh_one->c_start_x . "]]></hs_start_x>\r\n"; $export_xml .= "\t\t\t\t\t\t\t<hs_start_y><![CDATA[" . $qh_one->c_start_y . "]]></hs_start_y>\r\n"; $export_xml .= "\t\t\t\t\t\t<hs_width><![CDATA[" . $qh_one->c_width . "]]></hs_width>\r\n"; $export_xml .= "\t\t\t\t\t\t<hs_height><![CDATA[" . $qh_one->c_height . "]]></hs_height>\r\n"; $export_xml .= "\t\t\t\t\t</quest_hotspot>\n"; } } $export_xml .= "\t\t\t\t</hotspot_data>\n"; $export_xml .= "\t\t\t</quiz>\n"; } } $export_xml .= "\t\t</quizzes>\n"; //end of course backup $export_xml .= "\t</course_backup>"; //end xml file $filename_xml = $JLMS_CONFIG->get('absolute_path') . '/media/export.xml'; $handle = fopen($filename_xml, 'w'); // try to write in XML file our xml-contents. if (fwrite($handle, $export_xml) === FALSE) { return array('lmsfile' => null, 'msg' => "Could not create writable XML file"); } fclose($handle); $uniq = mktime(); $dir = $lms_cfg_backup_folder . "/"; //chmod($dir, '777'); $backup_zip = $dir . 'course_backup_' . $course_id . '_' . $uniq . '.zip'; $pz = new PclZip($backup_zip); //add _lms_course_files_ catalog $pz->create($filename_xml, '', $filename_xml = $JLMS_CONFIG->get('absolute_path') . '/media/'); if (in_array('documents', $this->options)) { foreach ($files as $file) { $filename = $file->_fromDir . $file->file_srv_name; $pz->add($filename, 'files', $file->_fromDir); } } if (in_array('quizzes', $this->options)) { foreach ($questions as $question) { foreach ($question as $quest) { if (isset($quest->_c_image)) { $filename = $extract_dir . $quest->_identifier . "/" . $quest->_c_image; $pz->add($filename, 'quiz_images', $extract_dir . $quest->_identifier . "/" . substr($quest->_c_image, 0, strpos($quest->_c_image, '\\')) . "/"); } } } } } // delete temporary files deldir($extract_dir); @unlink($archive); if (!$do_lms_archive) { return array('lmsfile' => 'none', 'msg' => _JLMS_COURSE_IMPORT_SUCCESS); } return array('lmsfile' => 'course_backup_' . $course_id . '_' . $uniq . '.zip', 'msg' => _JLMS_COURSE_IMPORT_SUCCESS); }
function JLMS_parse_XML_elements(&$elements, $arr_attrib, $arr_paths, $is_recurse = false, $rname = array(), $arr_attribr = array(), $arr_pathsr = array()) { $ret_array = array(); if (!empty($elements) && is_array($elements)) { foreach ($elements as $element) { $tmp = new StdClass(); foreach ($arr_attrib as $attrib) { $tmp->{$attrib} = $element->attributes($attrib); } foreach ($arr_paths as $path) { $test =& $element->getElementByPath($path); if ($test === null) { $tmp->{$path} = ''; //if course was exported on the old version and some fields doesn't exists } else { $tmp->{$path} = $test->data(); } } if ($is_recurse) { $ii = 0; foreach ($rname as $rn) { $rn_elements =& $element->getElementByPath($rn); #$rn_childs = & $rn_elements->children(); $tmp->{$rn} = JLMS_parse_XML_elements($rn_elements->children(), $arr_attribr[$ii], $arr_pathsr[$ii]); $ii++; } } $ret_array[] = $tmp; } } return $ret_array; }