/** * (non-PHPdoc) * @see libraries/EfrontEntity#handleForm($form) */ public function handleForm($form) { $values = $form->exportValues(); if (!eF_checkParameter($values['name'], 'filename')) { throw new EfrontFileException(_ILLEGALFILENAME . ': ' . $values['name'], EfrontFileException::ILLEGAL_FILE_NAME); } $fields = array("name" => $values['name']); if (isset($_GET['add'])) { self::create($fields); } else { $directory = new EfrontDirectory(G_UPLOADPATH . $this->{$this->entity}['users_LOGIN'] . '/message_attachments/' . $this->{$this->entity}['name']); $directory->rename(G_UPLOADPATH . $this->{$this->entity}['users_LOGIN'] . '/message_attachments/' . $values['name']); $this->{$this->entity}['name'] = $values['name']; $this->persist(); } }
/** * Handle AJAX actions * * This function is used to perform the necessary ajax actions, * that may be fired by the file manager * <br/>Example: * <code> * $basedir = $currentLesson -> getDirectory(); * $filesystem = new FileSystemTree($basedir); * $filesystem -> handleAjaxActions(); * </code> * * @param EfrontUser $currentUser The current user * @since 3.5.0 * @access public */ public function handleAjaxActions($currentUser) { if (isset($_GET['delete_file']) && (eF_checkParameter($_GET['delete_file'], 'id') || strpos(urldecode($_GET['delete_file']), $this->dir['path']) !== false)) { try { $file = new EfrontFile(urldecode($_GET['delete_file'])); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $file->delete(); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } else { if (isset($_GET['share']) && (eF_checkParameter($_GET['share'], 'id') || strpos(urldecode($_GET['share']), $this->dir['path']) !== false)) { try { $file = new EfrontFile(urldecode($_GET['share'])); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $file->share(); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } else { if (isset($_GET['unshare']) && (eF_checkParameter($_GET['unshare'], 'id') || strpos(urldecode($_GET['unshare']), $this->dir['path']) !== false)) { try { $file = new EfrontFile(urldecode($_GET['unshare'])); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $file->unshare(); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } else { if (isset($_GET['uncompress']) && (eF_checkParameter($_GET['uncompress'], 'id') || strpos(urldecode($_GET['uncompress']), $this->dir['path']) !== false)) { try { $file = new EfrontFile(urldecode($_GET['uncompress'])); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $file->uncompress(); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } elseif (isset($_GET['delete_folder']) && (eF_checkParameter($_GET['delete_folder'], 'id') || strpos(urldecode($_GET['delete_folder']), $this->dir['path']) !== false)) { try { $directory = new EfrontDirectory(urldecode($_GET['delete_folder'])); if (strpos($directory['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $directory->delete(); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } elseif (isset($_GET['download']) && (eF_checkParameter($_GET['download'], 'id') || strpos(urldecode($_GET['download']), $this->dir['path']) !== false)) { try { $file = new EfrontFile(urldecode($_GET['download'])); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $file->sendFile(true); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } elseif (isset($_GET['view']) && (eF_checkParameter($_GET['view'], 'id') || strpos(urldecode($_GET['view']), $this->dir['path']) !== false)) { try { $file = new EfrontFile(urldecode($_GET['view'])); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $file->sendFile(false); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } elseif (isset($_GET['update']) && (eF_checkParameter($_GET['update'], 'id') || strpos(urldecode($_GET['update']), $this->dir['path']) !== false)) { try { $_GET['type'] == 'file' ? $file = new EfrontFile(urldecode($_GET['update'])) : ($file = new EfrontDirectory(urldecode($_GET['update']))); if (strpos($file['path'], $this->dir['path']) === false) { throw new EfrontFileException(_YOUCANNOTACCESSTHEREQUESTEDRESOURCE, EfrontFileException::UNAUTHORIZED_ACTION); } $previousName = $file['name']; if ($file['name'] != $_GET['name']) { $file->rename(dirname($file['path']) . '/' . EfrontFile::encode(urldecode($_GET['name']))); } echo json_encode(array('previousName' => $previousName, 'name' => $file['name'])); } catch (Exception $e) { handleAjaxExceptions($e); } exit; } } } } }
/** * Import lesson * * This function is used to import a lesson exported to a file * The first step is to optionally initialize the lesson, using initialize(). * It then uncompresses the given file and proceeds to importing * <br/>Example: * <code> * try { * $lesson = new EfrontLesson(32); //32 is the lesson id * $file = new EfrontFile($lesson -> getDirectory().'data.tar.gz'); //The file resides inside the lesson directory and is called 'data.tar.gz' * $lesson -> import(array('content'), $file); * } catch (Exception $e) { * echo $e -> getMessage(); * } * </code><br/> * * @param EfrontFile $file The compressed lesson file object * @param array $deleteEntities The lesson aspects to initialize * @param boolean $lessonProperties Whether to import lesson properties as well * @param boolean $keepName Whether to keep the current (false) or the original name (true) * @return boolean True if the importing was successful * @since 3.5.0 * @access public * @see EfrontLesson :: initialize() */ public function import($file, $deleteEntities = false, $lessonProperties = false, $keepName = false, $exclude_search = false) { if ($deleteEntities) { $this->initialize($deleteEntities); //Initialize the lesson aspects that the user specified } if (!$file instanceof EfrontFile) { $file = new EfrontFile($file); } $fileList = $file->uncompress(); $file->delete(); $fileList = array_unique(array_reverse($fileList, true)); $dataFile = new EfrontFile($file['directory'] . '/data.dat'); $filedata = file_get_contents($dataFile['path']); $dataFile->delete(); $data = unserialize($filedata); $data['content'] = self::eF_import_fixTree($data['content'], $last_current_node); for ($i = 0; $i < sizeof($data['files']); $i++) { if (isset($data['files'][$i]['file'])) { $newName = str_replace(G_ROOTPATH, '', dirname($data['files'][$i]['file']) . '/' . EfrontFile::encode(eFront_basename($data['files'][$i]['file']))); $newName = preg_replace("#(.*)www/content/lessons/#", "www/content/lessons/", $newName); $newName = preg_replace("#www/content/lessons/\\d+/(.*)#", "www/content/lessons/" . ($this->lesson['share_folder'] ? $this->lesson['share_folder'] : $this->lesson['id']) . "/\$1", $newName); if ($data['files'][$i]['original_name'] != eFront_basename($data['files'][$i]['file'])) { if (is_file(G_ROOTPATH . $newName)) { $replaceString['/\\/?(view_file.php\\?file=)' . $data['files'][$i]['id'] . '([^0-9])/'] = '${1}' . array_search(G_ROOTPATH . $newName, $fileList) . '${2}'; //Replace old ids with new ids //$mp[$data['files'][$i]['id']] = array_search(G_ROOTPATH.$newName, $fileList); $file = new EfrontFile(G_ROOTPATH . $newName); $file->rename(G_ROOTPATH . dirname($newName) . '/' . EfrontFile::encode(rtrim($data['files'][$i]['original_name'], "/"))); } } } else { $newName = preg_replace("#www/content/lessons/\\d+/(.*)#", "www/content/lessons/" . ($this->lesson['share_folder'] ? $this->lesson['share_folder'] : $this->lesson['id']) . "/\$1", $data['files'][$i]['path']); if (is_file(G_ROOTPATH . $newName)) { $replaceString['/\\/?(view_file.php\\?file=)' . $data['files'][$i]['id'] . '([^0-9])/'] = '${1}' . array_search(G_ROOTPATH . $newName, $fileList) . '${2}'; //Replace old ids with new ids } } } for ($i = 0; $i < sizeof($data['files']); $i++) { if (isset($data['files'][$i]['file'])) { $newName = str_replace(G_ROOTPATH, '', dirname($data['files'][$i]['file']) . '/' . EfrontFile::encode(eFront_basename($data['files'][$i]['file']))); $newName = preg_replace("#(.*)www/content/lessons/#", "www/content/lessons/", $newName); $newName = preg_replace("#www/content/lessons/\\d+/(.*)#", "www/content/lessons/" . ($this->lesson['share_folder'] ? $this->lesson['share_folder'] : $this->lesson['id']) . "/\$1", $newName); if ($data['files'][$i]['original_name'] != eFront_basename($data['files'][$i]['file'])) { if (is_dir(G_ROOTPATH . $newName)) { $file = new EfrontDirectory(G_ROOTPATH . $newName); $file->rename(G_ROOTPATH . dirname($newName) . '/' . EfrontFile::encode(rtrim($data['files'][$i]['original_name'], "/"))); } } } } unset($data['files']); $last_current_node = 0; $existing_tree = eF_getContentTree($nouse, $this->lesson['id'], 0, false, false); if (sizeof($existing_tree) > 0) { $last_current_node = $existing_tree[sizeof($existing_tree) - 1]['id']; $first_node = self::eF_import_getTreeFirstChild($data['content']); $data['content'][$first_node]['previous_content_ID'] = $last_current_node; } // MODULES - Import module data // Get all modules (NOT only the ones that have to do with the user type) $modules = eF_loadAllModules(); foreach ($modules as $module) { if (isset($data[$module->className])) { $module->onImportLesson($this->lesson['id'], $data[$module->className]); unset($data[$module->className]); } } if (isset($data['glossary_words'])) { // to avoid excluding it with the lines below $data['glossary'] = $data['glossary_words']; } $dbtables = eF_showTables(); //Skip tables that don't exist in current installation, such as modules' tables foreach (array_diff(array_keys($data), $dbtables) as $value) { unset($data[$value]); } //tests_to_questions table requires special handling //$testsToQuestions = $data['tests_to_questions']; //unset($data['tests_to_questions']); if (!$data['questions'] && $data['tests_to_questions']) { unset($data['tests_to_questions']); } foreach ($data as $table => $tabledata) { /*if ($table == "glossary_words") { $table = "glossary"; } */ // moved 20 lines above if ($table == "lessons") { //from v3 lessons parameters also imported if ($lessonProperties) { unset($data['lessons']['id']); unset($data['lessons']['directions_ID']); unset($data['lessons']['created']); $this->lesson = array_merge($this->lesson, $data['lessons']); $this->persist(); } eF_updateTableData("lessons", array('info' => $data['lessons']['info'], 'metadata' => $data['lessons']['metadata'], 'options' => $data['lessons']['options']), "id=" . $this->lesson['id']); if ($keepName) { eF_updateTableData("lessons", array("name" => $data['lessons']['name']), "id=" . $this->lesson['id']); $this->lesson['name'] = $data['lessons']['name']; eF_updateTableData("f_forums", array("title" => $data['lessons']['name']), "lessons_ID=" . $this->lesson['id']); } } else { if ($table == "questions") { foreach ($tabledata as $key => $value) { unset($tabledata[$key]['timestamp']); $tabledata[$key]['lessons_ID'] = $this->lesson['id']; if ($tabledata[$key]['estimate'] == "") { unset($tabledata[$key]['estimate']); } if (isset($tabledata[$key]['code'])) { //code field removed in version 3.6 unset($tabledata[$key]['code']); } } } if ($table == "tests") { for ($i = 0; $i < sizeof($tabledata); $i++) { if (!isset($tabledata[$i]['options'])) { $tabledata[$i]['options'] = serialize(array('duration' => $tabledata[$i]['duration'], 'redoable' => $tabledata[$i]['redoable'], 'onebyone' => $tabledata[$i]['onebyone'], 'answers' => $tabledata[$i]['answers'], 'given_answers' => $tabledata[$i]['given_answers'], 'shuffle_questions' => $tabledata[$i]['shuffle_questions'], 'shuffle_answers' => $tabledata[$i]['shuffle_answers'])); unset($tabledata[$i]['duration']); unset($tabledata[$i]['redoable']); unset($tabledata[$i]['onebyone']); unset($tabledata[$i]['answers']); unset($tabledata[$i]['given_answers']); unset($tabledata[$i]['shuffle_questions']); unset($tabledata[$i]['shuffle_answers']); } } } if ($table == 'calendar') { $tabledata = array_values($tabledata); // Because export returned assiciative array for ($i = 0; $i < sizeof($tabledata); $i++) { if (isset($tabledata[$i]['lessons_ID'])) { if ($tabledata[$i]['lessons_ID']) { $tabledata[$i]['foreign_ID'] = $tabledata[$i]['lessons_ID']; $tabledata[$i]['type'] = 'lesson'; } else { $tabledata[$i]['foreign_ID'] = 0; $tabledata[$i]['type'] = ''; } unset($tabledata[$i]['lessons_ID']); } unset($tabledata[$i]['name']); unset($tabledata[$i]['lesson_name']); } } for ($i = 0; $i < sizeof($tabledata); $i++) { if ($table == "tests") { if (!isset($tabledata[$i]['lessons_ID'])) { $tabledata[$i]['lessons_ID'] = $this->lesson['id']; } } if ($tabledata[$i]) { $sql = "INSERT INTO " . G_DBPREFIX . $table . " SET "; $connector = ""; $fields = array(); foreach ($tabledata[$i] as $key => $value) { if ($key == "id") { $old_id = $value; } else { if (($table == "content" and $key == "data") || ($table == "questions" and $key == "text") || ($table == "tests" and $key == "description")) { $value = str_replace("##SERVERNAME##", "", $value); //$value = str_replace("/##LESSONSLINK##", "content/lessons/".$this -> lesson['id'], $value); $value = str_replace("##LESSONSLINK##", "content/lessons/" . ($this->lesson['share_folder'] ? $this->lesson['share_folder'] : $this->lesson['id']), $value); $content_data = $value; } elseif ($key == "lessons_ID") { $value = $this->lesson['id']; } elseif ($table == "lesson_conditions" and $key == "options") { if (mb_strpos($data['lesson_conditions'][$i]['type'], "specific") === false) { } else { $options = unserialize($data['lesson_conditions'][$i]['options']); $options[0] = $map['content'][$options[0]]; $value = serialize($options); } } elseif ($table != "content" and mb_substr($key, -3) == "_ID") { $from_table = mb_substr($key, 0, -3); if (isset($map[$from_table][$value])) { $value = $map[$from_table][$value]; } } if ($table == 'scorm_sequencing_content_to_organization' && $key == 'organization_content_ID') { $value = $map['content'][$value]; } if ($table == 'scorm_sequencing_maps_info' && $key == 'organization_content_ID') { $value = $map['content'][$value]; } if ($table == "content" and $key == 'previous_content_ID' and !$value) { $value = 0; } if (!($table == "content" and $key == "format")) { //$sql .= $connector.$key."='".str_replace("'","''",$value)."'"; //$connector = ", "; $fields[$key] = $value; } if ($table == "content" and $key == "name") { $content_name = $value; } } } $new_id = eF_insertTableData($table, $fields); if (!$exclude_search) { if ($table == "content") { EfrontSearch::insertText($content_name, $new_id, "content", "title"); EfrontSearch::insertText(strip_tags($content_data), $new_id, "content", "data"); } } $map[$table][$old_id] = $new_id; } } } } if ($data['content']) { $map['content'] = array_reverse($map['content'], true); foreach ($map['content'] as $old_id => $new_id) { eF_updateTableData("content", array('parent_content_ID' => $new_id), "parent_content_ID={$old_id} AND lessons_ID=" . $this->lesson['id']); eF_updateTableData("content", array('previous_content_ID' => $new_id), "previous_content_ID={$old_id} AND lessons_ID=" . $this->lesson['id']); //eF_updateTableData("questions", array('content_ID' => $new_id), "content_ID=$old_id"); } } if ($data['rules']) { foreach ($map['content'] as $old_id => $new_id) { eF_updateTableData("rules", array('rule_content_ID' => $new_id), "rule_content_ID={$old_id}"); } } // Update lesson skill $lessonSkillId = $this->getLessonSkill(); // The lesson offers skill record remains the same if ($lessonSkillId) { eF_updateTableData("module_hcd_skills", array("description" => _KNOWLEDGEOFLESSON . " " . $this->lesson['name'], "categories_ID" => -1), "skill_ID = " . $lessonSkillId['skill_ID']); } if ($data['questions']) { foreach ($map['questions'] as $old_id => $new_id) { eF_updateTableData("tests_to_questions", array('previous_question_ID' => $new_id), "previous_question_ID={$old_id} and tests_ID in (select id from tests where lessons_ID=" . $this->lesson['id'] . ")"); // Update all questions of not course_only lessons to offer the lessons skill if ($lessonSkillId) { eF_insertTableData("questions_to_skills", array("questions_id" => $new_id, "skills_ID" => $lessonSkillId['skill_ID'], "relevance" => 2)); } //eF_insertTableData("questions_to_skills", array("q //$questions = eF_getTableDataFlat("questions", "id", "lessons_ID = ". $this ->lesson['id']); //eF_deleteTableData("questions_to_skills", "questions_id IN ('".implode("','",$questions['id'])."')"); } } foreach ($map['content'] as $old_id => $new_id) { //needs debugging $content_new_IDs[] = $new_id; } $content_new_IDs_list = implode(",", $content_new_IDs); if ($content_new_IDs_list) { $content_data = eF_getTableData("content", "data,id", "id IN ({$content_new_IDs_list}) AND lessons_ID=" . $this->lesson['id']); } if (isset($replaceString)) { for ($i = 0; $i < sizeof($content_data); $i++) { $replaced = preg_replace(array_keys($replaceString), array_values($replaceString), $content_data[$i]['data']); eF_updateTableData("content", array('data' => $replaced), "id=" . $content_data[$i]['id']); if (!$exclude_search) { EfrontSearch::removeText('content', $content_data[$i]['id'], 'data'); //Refresh the search keywords EfrontSearch::insertText($replaced, $content_data[$i]['id'], "content", "data"); } } } if ($content_new_IDs_list) { $content_data = eF_getTableData("content", "data,id", "id IN ({$content_new_IDs_list}) AND lessons_ID=" . $this->lesson['id'] . " AND data like '%##EFRONTINNERLINK##%'"); } for ($i = 0; $i < sizeof($content_data); $i++) { preg_match_all("/##EFRONTINNERLINK##.php\\?ctg=content&view_unit=(\\d+)/", $content_data[$i]['data'], $regs); foreach ($regs[1] as $value) { $replaced = str_replace("##EFRONTINNERLINK##.php?ctg=content&view_unit=" . $value, "##EFRONTINNERLINK##.php?ctg=content&view_unit=" . $map["content"][$value], $content_data[$i]['data']); eF_updateTableData("content", array('data' => $replaced), "id=" . $content_data[$i]['id']); if (!$exclude_search) { EfrontSearch::removeText('content', $content_data[$i]['id'], 'data'); //Refresh the search keywords EfrontSearch::insertText($replaced, $content_data[$i]['id'], "content", "data"); } } } $tests = eF_getTableData("tests t, content c", "t.id, t.name, c.name as c_name", "t.content_ID=c.id"); foreach ($tests as $test) { if (!$test['name']) { eF_updateTableData("tests", array("name" => $test['c_name']), "id=" . $test['id']); } } EfrontCache::getInstance()->clearCache(); return true; }
public function redoOnlyWrong($user) { if ($user instanceof EfrontUser) { $login = $user->user['login']; } elseif (eF_checkParameter($user, 'login')) { $login = $user; } else { throw new EfrontTestException(_INVALIDLOGIN . ': ' . $user, EfrontTestException::INVALID_LOGIN); } if (is_dir(G_UPLOADPATH . $login . '/tests/' . $this->test['id'])) { try { $directory = new EfrontDirectory(G_UPLOADPATH . $login . '/tests/' . $this->test['id'] . '/'); $directory->rename(G_UPLOADPATH . $login . '/tests/completed_' . $this->completedTest['id'] . '/'); } catch (EfrontFileException $e) { } } //Set the unit as "not seen" if (!$user instanceof EfrontUser) { $user = EfrontUserFactory::factory($login, false, 'student'); } $user->setSeenUnit($this->test['content_ID'], key($this->getLesson()), 0); $result = EfrontCompletedTest::retrieveCompletedTest("completed_tests ct join completed_tests_blob ctb on ct.id=ctb.completed_tests_ID", "ctb.test", "archive=0 AND tests_ID=" . $this->test['id'] . " and users_LOGIN='******'"); $testObject = unserialize($result[0]['test']); $testObject->redoOnlyWrong = true; EfrontCompletedTest::updateCompletedTest("completed_tests", array("test" => serialize($testObject), "archive" => 1), "archive=0 AND tests_ID=" . $this->test['id'] . " and users_LOGIN='******'"); }