/** * Function addUnit() * * This function is used to add a unit to the manifest file * <br/>Example: * <code> * $manifest = new EfrontManifest(32); //32 is a lesson id * $unit = new EfrontUnit(10); //10 is a content id * $manifest->addUnit($unit); * </code> * * @param EfrontUnit $unit The unit to be added * @since 1.0 * @access public */ public function addUnit($unit) { $this->units[$unit->offsetGet('id')] = $unit; }
/** * Copy simple unit * * This function copies a unit (NOT its children) into the current content tree * <br/>Example: * <code> * $currentContent = new EfrontContentTree(5); //Initialize content for lesson with id 5 * $sourceUnit = new EfrontUnit(20); //Get the unit with id = 20 * $currentContent -> copySimpleUnit($sourceUnit, false); //Copy the source unit into the content tree (at its end) * </code> * * @param EfrontUnit $sourceUnit The unit object to be copied * @param mixed $targetUnit The id of the parent unit (or the parent EfrontUnit)in which the new unit will be copied, or false (the unit will be appended at the end) * @param mixed $previousUnit The id of the previous unit (or the unit itself) of the new unit, or false (the unit will be put to the end of the units) * @param boolean $copyFiles whether to copy files as well. * @param boolean $copyQuestions Whether to copy questions as well * @return EfrontUnit The newly created unit object * @since 3.5.0 * @access public */ public function copySimpleUnit($sourceUnit, $targetUnit = false, $previousUnit = false, $copyFiles = true, $copyQuestions = true) { if (!$sourceUnit instanceof EfrontUnit) { $sourceUnit = new EfrontUnit($sourceUnit); } $newUnit['name'] = $sourceUnit->offsetGet('name'); $newUnit['ctg_type'] = $sourceUnit->offsetGet('ctg_type'); $newUnit['data'] = $sourceUnit->offsetGet('data'); $options = $sourceUnit->offsetGet('options'); $newOptions['complete_unit_setting'] = $options['complete_unit_setting']; $newOptions['hide_navigation'] = $options['hide_navigation']; $newOptions['maximize_viewport'] = $options['maximize_viewport']; $newOptions['object_ids'] = $options['object_ids']; $newUnit['options'] = serialize($newOptions); $newUnit['lessons_ID'] = $this->lessonId; if ($targetUnit) { if ($targetUnit instanceof EfrontUnit) { $newUnit['parent_content_ID'] = $targetUnit->offsetGet('id'); } else { if (eF_checkParameter($targetUnit, 'id')) { $newUnit['parent_content_ID'] = $targetUnit; } } if ($previousUnit instanceof EfrontUnit) { $newUnit['previous_content_ID'] = $previousUnit->offsetGet('id'); } else { if (eF_checkParameter($previousUnit, 'id')) { $newUnit['previous_content_ID'] = $previousUnit; } } $unit = $this->insertNode($newUnit); } else { $unit = $this->appendUnit($newUnit); } if ($copyFiles) { $files = $unit->getFiles(); $lesson = new EfrontLesson($this->lessonId); $data = $unit->offsetGet('data'); foreach ($files as $file) { try { $sourceFile = new EfrontFile($file); $sourceFileOffset = preg_replace("#" . G_LESSONSPATH . "#", "", $sourceFile['directory']); $position = strpos($sourceFileOffset, "/"); //check case that the file is in a subfolder of the lesson if ($position !== false) { $sourceLink = mb_substr($sourceFileOffset, $position + 1); mkdir($lesson->getDirectory() . $sourceLink . '/', 0755, true); $destinationPath = $lesson->getDirectory() . $sourceLink . '/' . basename($sourceFile['path']); $copiedFile = $sourceFile->copy($destinationPath, false); } else { $destinationPath = $lesson->getDirectory() . basename($sourceFile['path']); $copiedFile = $sourceFile->copy($destinationPath, false); } //@todo view_file.php?action=download&file=10410 //$data = str_replace("view_file.php?file=".$file, "view_file.php?file=".$copiedFile -> offsetGet('id'), $data); //$data = str_replace("&file=".$file, "&file=".$copiedFile -> offsetGet('id'), $data); //$data = str_replace("&file=".$file, "&file=".$copiedFile -> offsetGet('id'), $data); $data = preg_replace('#view_file\\.php(.*)file=' . $file . '#', 'view_file.php${1}file=' . $copiedFile->offsetGet('id'), $data); $folderId = $lesson->lesson['share_folder'] ? $lesson->lesson['share_folder'] : $lesson->lesson['id']; $data = preg_replace("#(" . G_SERVERNAME . ")*content/lessons/" . $sourceUnit['lessons_ID'] . "/(.*)#", "content/lessons/" . $folderId . '/${2}', $data); } catch (EfrontFileException $e) { if ($e->getCode() == EfrontFileException::FILE_ALREADY_EXISTS) { $copiedFile = new EfrontFile($destinationPath); //$data = str_replace("view_file.php?file=".$file, "view_file.php?file=".$copiedFile -> offsetGet('id'), $data); //$data = str_replace("&file=".$file, "&file=".$copiedFile -> offsetGet('id'), $data); //$data = str_replace("&file=".$file, "&file=".$copiedFile -> offsetGet('id'), $data); $data = preg_replace('#view_file\\.php(.*)file=' . $file . '#', 'view_file.php${1}file=' . $copiedFile->offsetGet('id'), $data); $folderId = $lesson->lesson['share_folder'] ? $lesson->lesson['share_folder'] : $lesson->lesson['id']; $data = preg_replace("#(" . G_SERVERNAME . ")*content/lessons/" . $sourceUnit['lessons_ID'] . "/(.*)#", "content/lessons/" . $folderId . '/${2}', $data, -1, $count); } } //this means that the file already exists } $unit->offsetSet('data', $data); if ($file && $unit['ctg_type'] == 'scorm' || $unit['ctg_type'] == 'scorm_test') { $d = new EfrontDirectory(dirname($file)); $d->copy($lesson->getDirectory() . basename(dirname($file)), true); } } $unit->persist(); // copying questions that belong to this unit if ($copyQuestions) { $questions = eF_getTableData("questions", "*", "content_ID=" . $sourceUnit->offsetGet('id')); if ($copyFiles) { $folderId = $lesson->lesson['share_folder'] ? $lesson->lesson['share_folder'] : $lesson->lesson['id']; } for ($k = 0; $k < sizeof($questions); $k++) { if ($copyFiles) { $questions[$k]['text'] = replaceQuestionPaths($questions[$k]['text'], $questions[$k]['lessons_ID'], $folderId); $questions[$k]['explanation'] = replaceQuestionPaths($questions[$k]['explanation'], $questions[$k]['lessons_ID'], $folderId); } $questions[$k]['content_ID'] = $unit->offsetGet('id'); $questions[$k]['lessons_ID'] = $unit->offsetGet('lessons_ID'); unset($questions[$k]['id']); eF_insertTableData("questions", $questions[$k]); } } return $unit; }
/** * Get statistic information about scorm tests * * This returns statistic info for a scorm test * <br/>Example: * <code> * $tests = array(2, 4); * $info = EfrontStats :: getScomTestInfo($tests); //Get information for tests 2,4 * </code> * @param mixed $tests Either an array of tests id or false (request information for all existing tests) * @return array the tests' statistic info * @since 3.5.0 * @access public * @static */ public static function getScormTestInfo($tests = false, $categories = false, $show_all = false) { $tests_info = array(); if ($tests === false) { $tests = eF_getTableDataFlat("content", "id", "ctg_type='scorm_test'"); $tests = $tests['id']; } else { if (!is_array($tests)) { $tests = array($tests); } } $lessonNames = eF_getTableDataFlat("lessons", "id,name"); sizeof($lessonNames) > 0 ? $lessonNames = array_combine($lessonNames['id'], $lessonNames['name']) : ($lessonNames = array()); $result = eF_getTableData("users", "name, surname, login"); $users = array(); foreach ($result as $user) { $users[$user['login']] = $user; } foreach ($tests as $id) { $testInfo = array(); $unit = new EfrontUnit($id); $result = eF_getTableData("scorm_data", "*", "content_ID={$id} and (users_LOGIN is null or users_LOGIN='')"); $testInfo['general']['content_ID'] = $id; $testInfo['general']['id'] = $id; $testInfo['general']['name'] = $unit->offsetGet('name'); $testInfo['general']['scorm'] = 1; $testInfo['general']['lesson_name'] = $lessonNames[$unit->offsetGet('lessons_ID')]; if ($result[0]['maxtimeallowed']) { $time_parts = explode(":", $result[0]['maxtimeallowed']); $testInfo['general']['duration'] = $time_parts[0] * 3600 + $time_parts[1] * 60 + $time_parts[2]; $testInfo['general']['duration_str'] = eF_convertIntervalToTime($testInfo['general']['duration']); } else { $testInfo['general']['duration'] = ''; $testInfo['general']['duration_str'] = eF_convertIntervalToTime($testInfo['general']['duration']); } // Create results score categories if ($categories) { $testInfo['score_categories'] = array(); $step = 100 / $categories; for ($i = 0; $i < $categories; $i++) { $testInfo['score_categories'][$i] = array("from" => $i * $step, "to" => ($i + 1) * $step, "count" => 0); if ($i == $categories - 1) { $testInfo['score_categories'][$i]["to"] = 100; } } } $testInfo['done'] = array(); $done_info = eF_getTableData("scorm_data d, users u", "d.users_LOGIN, u.name, u.surname, d.score, d.timestamp, d.lesson_status, d.masteryscore, d.minscore, d.maxscore", "d.lesson_status != 'incomplete' and d.users_LOGIN = u.LOGIN and d.content_ID = {$id}"); foreach ($done_info as $done) { $done_test = array(); $done_test['users_LOGIN'] = $done['users_LOGIN']; $done_test['name'] = $done['name']; $done_test['surname'] = $done['surname']; $done_test['timestamp'] = $done['timestamp']; $done_test['status'] = $done['lesson_status']; $done_test['mastery_score'] = $done['masteryscore']; if (is_numeric($done['minscore']) && is_numeric($done['maxscore'])) { $done_test['score'] = 100 * $done['score'] / ($done['minscore'] + $done['maxscore']); } else { $done_test['score'] = $done['score']; } //$done_test['score'] = $done['score']; $testInfo['done'][] = $done_test; if ($categories) { $stat_cat = $done_test['score'] / $step; $testInfo['score_categories'][$stat_cat >= $categories ? $categories - 1 : $stat_cat]["count"]++; } } if ($categories) { $doneTestsCount = sizeof($testInfo['done']); $sum_count = $doneTestsCount; // counts how many users have score equal or above each score_category if ($sum_count > 0) { foreach ($testInfo['score_categories'] as $key => $score) { $testInfo['score_categories'][$key]['percent'] = round(100 * ($testInfo['score_categories'][$key]['count'] / $doneTestsCount), 2); $testInfo['score_categories'][$key]['sum_count'] = $sum_count; $testInfo['score_categories'][$key]['sum_count_percent'] = round(100 * ($sum_count / $doneTestsCount), 2); $sum_count -= $testInfo['score_categories'][$key]['count']; } } } $tests_info[$id] = $testInfo; } return $tests_info; }