/**
  * (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();
     }
 }
예제 #2
0
 /**
  * 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;
                 }
             }
         }
     }
 }
예제 #3
0
 /**
  * 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&amp;view_unit=(\\d+)/", $content_data[$i]['data'], $regs);
         foreach ($regs[1] as $value) {
             $replaced = str_replace("##EFRONTINNERLINK##.php?ctg=content&amp;view_unit=" . $value, "##EFRONTINNERLINK##.php?ctg=content&amp;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;
 }
예제 #4
0
 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='******'");
 }