public function useCoupon($user, $payment, $productsList) { if (!$user instanceof EfrontUser) { $user = Efront::factory($user); } if (!$payment instanceof payments) { $payment = new payments($payment); } $fields = array('users_ID' => $user->user['id'], 'coupons_ID' => $this->{$this->entity}['id'], 'payments_ID' => $payment->{$payment->entity}['id'], 'products_list' => serialize($productsList), 'timestamp' => time()); eF_insertTableData("users_to_coupons", $fields); EfrontEvent::triggerEvent(array("type" => EfrontEvent::COUPON_USAGE, "users_LOGIN" => $user->user['login'], "users_name" => $user->user['name'], "users_surname" => $user->user['surname'], "entity_name" => $this->{$this->entity}['code'], "entity_ID" => $this->{$this->entity}['id'])); }
/** * Create news * * This function is used to create news * <br>Example: * <code> * $fields = array("title" => $form -> exportValue('title'), * "data" => $form -> exportValue('data'), * "timestamp" => $from_timestamp, * "expire" => $to_timestamp, * "lessons_ID" => isset($_SESSION['s_lessons_ID']) && $_SESSION['s_lessons_ID'] ? $_SESSION['s_lessons_ID'] : 0, * "users_LOGIN" => $_SESSION['s_login']); * * $news = news :: create($fields, 0)); * * </code> * * @param $fields An array of data * @param $sendEmail Whether to send the announcement as an email as well * @return news The new object * @since 3.6.0 * @access public * @static */ public static function create($fields = array(), $sendEmail = false) { $fields = array('title' => $fields['title'], 'data' => $fields['data'], 'timestamp' => $fields['timestamp'] ? $fields['timestamp'] : time(), 'expire' => $fields['expire'] ? $fields['expire'] : null, 'lessons_ID' => $fields['lessons_ID'], 'users_LOGIN' => $fields['users_LOGIN']); $newId = eF_insertTableData("news", $fields); $result = eF_getTableData("news", "*", "id=" . $newId); //We perform an extra step/query for retrieving data, sinve this way we make sure that the array fields will be in correct order (forst id, then name, etc) $news = new news($result[0]['id']); if ($news->news['lessons_ID']) { //EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_LESSON_ANNOUNCEMENT, "users_LOGIN" => $fields['users_LOGIN'], "users_name" => $currentUser -> user['name'], "users_surname" => $currentUser -> user['surname'], "lessons_ID" => $fields['lessons_ID'], "entity_ID" => $id, "entity_name" => $news_content['title']), isset($_POST['email'])); EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_LESSON_ANNOUNCEMENT, "users_LOGIN" => $GLOBALS['currentUser']->user['login'], "users_name" => $GLOBALS['currentUser']->user['name'], "users_surname" => $GLOBALS['currentUser']->user['surname'], "lessons_ID" => $GLOBALS['currentLesson']->lesson['id'], "lessons_name" => $GLOBALS['currentLesson']->lesson['name'], "entity_name" => $fields['title'], "entity_ID" => $newId), $sendEmail); } else { //EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_SYSTEM_ANNOUNCEMENT, "users_LOGIN" => $fields['users_LOGIN'], "users_name" => $currentUser -> user['name'], "users_surname" => $currentUser -> user['surname'], "entity_ID" => $id, "entity_name" => $news_content['title']), isset($_POST['email'])); EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_SYSTEM_ANNOUNCEMENT, "users_LOGIN" => $GLOBALS['currentUser']->user['login'], "users_name" => $GLOBALS['currentUser']->user['name'], "users_surname" => $GLOBALS['currentUser']->user['surname'], "lessons_name" => $GLOBALS['currentLesson']->lesson['name'], "entity_name" => $fields['title'], "entity_ID" => $newId), $sendEmail); } EfrontSearch::insertText($news->news['title'], $news->news['id'], "news", "title"); EfrontSearch::insertText($news->news['data'], $news->news['id'], "news", "data"); return $news; }
/** * Check if a course must be reset because of certificate expiry or 'before expiry' reset * * @param mixed lesson A lesson id or an EfrontLesson object * @since 3.6.3 * @access public */ public static function checkCertificateExpire() { $courses = eF_getTableData("courses", "id,reset_interval,reset", "certificate_expiration !=0"); $notifications = eF_getTableData("event_notifications", "id,event_type,after_time,send_conditions", "event_type=-56 and active=1"); $notifications_on_event = eF_getTableData("event_notifications", "id,event_type,after_time,send_conditions", "event_type=56 and active=1"); foreach ($courses as $value) { $course = new EfrontCourse($value['id']); $constraints = array('archive' => false, 'active' => true, 'condition' => 'issued_certificate != ""'); $users = $course->getStudentUsers(false, $constraints); foreach ($users as $user) { $login = $user['login']; $dateTable = unserialize($user['issued_certificate']); if (eF_checkParameter($dateTable['date'], 'timestamp')) { //new way that issued date saves $expirationArray = convertTimeToDays($course->course['certificate_expiration']); $expirationTimestamp = getCertificateExpirationTimestamp($dateTable['date'], $expirationArray); if ($course->course['reset_interval'] != 0) { $resetArray = convertTimeToDays($value['reset_interval']); $resetTimestamp = getCertificateResetTimestamp($expirationTimestamp, $resetArray); if ($resetTimestamp < time()) { $user = EfrontUserFactory::factory($user); $user->resetProgressInCourse($course, true, true); } } if ($course->course['reset']) { //If student completed again the course with reset_interval, he has a new expire date so he will not be reset,(so it is not elseif) if ($expirationTimestamp < time()) { if (!$user instanceof EfrontUser) { $user = EfrontUserFactory::factory($user); } $user->resetProgressInCourse($course, true); foreach ($notifications_on_event as $notification) { $send_conditions = unserialize($notification['send_conditions']); $courses_ID = $send_conditions['courses_ID']; if ($courses_ID == $value['id'] || $courses_ID == 0) { if ($notification['after_time'] == 0) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::COURSE_CERTIFICATE_EXPIRY, "users_LOGIN" => $user->user['login'], "lessons_ID" => $course->course['id'], "lessons_name" => $course->course['name'], 'create_negative' => false)); } } } } } if (!$course->course['reset'] && !$course->course['reset_interval']) { if ($expirationTimestamp < time()) { eF_updateTableData("users_to_courses", array("issued_certificate" => ""), "users_LOGIN='******' and courses_ID = " . $course->course['id']); foreach ($notifications_on_event as $notification) { $send_conditions = unserialize($notification['send_conditions']); $courses_ID = $send_conditions['courses_ID']; if ($courses_ID == $value['id'] || $courses_ID == 0) { if ($notification['after_time'] == 0) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::COURSE_CERTIFICATE_REVOKE, "users_LOGIN" => $login, "lessons_ID" => $course->course['id'], "lessons_name" => $course->course['name'], "create_negative" => false)); } } } } } foreach ($notifications as $notification) { $send_conditions = unserialize($notification['send_conditions']); $courses_ID = $send_conditions['courses_ID']; if ($courses_ID == $value['id'] || $courses_ID == 0) { if ($notification['after_time'] < 0) { $resetArray = convertTimeToDays(abs($notification['after_time'])); $resetTimestamp = getCertificateResetTimestamp($expirationTimestamp, $resetArray); // in order notification to be sent one (not every day after $resetTimestamp) if ($GLOBALS['configuration']['last_reset_certificate'] < $resetTimestamp && $resetTimestamp < time() && $expirationTimestamp > time()) { EfrontEvent::triggerEvent(array("type" => -1 * EfrontEvent::COURSE_CERTIFICATE_EXPIRY, "users_LOGIN" => $login, "lessons_ID" => $course->course['id'], "lessons_name" => $course->course['name'], "create_negative" => false)); } } } } } } } }
if ($form->validate()) { if (isset($_GET['action']) && $_GET['action'] == 'change' && isset($id)) { $topics_content = array("data" => $form->exportValue('data')); if (eF_updateTableData("lessons_timeline_topics_data", $topics_content, "id=" . $id)) { $_GET['topics_ID'] = $_GET['post_topic']; $message = _SUCCESFULLYUPDATEDTOPIC; $message_type = 'success'; } else { $message = _SOMEPROBLEMEMERGED; $message_type = 'failure'; } } elseif (isset($_GET['action']) && $_GET['action'] == 'insert') { $topics_content = array("data" => $form->exportValue('data'), "topics_ID" => $_GET['post_topic'], "users_LOGIN" => $currentUser->user['login']); if ($id = eF_insertTableData("lessons_timeline_topics_data", $topics_content)) { // Timelines add event EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_POST_FOR_LESSON_TIMELINE_TOPIC, "entity_ID" => $_GET['post_topic'], "entity_name" => serialize(array("post_id" => $id, "data" => $form->exportValue('data'), "topic_title" => $topic_name)), "lessons_ID" => $currentLesson->lesson['id'], "lessons_name" => $currentLesson->lesson['name'], "users_LOGIN" => $_SESSION['s_login'], "users_name" => $currentUser->user['name'], "users_surname" => $currentUser->user['surname'])); $message = _SUCCESFULLYADDEDTOPICPOST; $message_type = 'success'; } else { $message = _SOMEPROBLEMEMERGED; $message_type = 'failure'; } } } } $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->setJsWarnings(_BEFOREJAVASCRIPTERROR, _AFTERJAVASCRIPTERROR); $form->setRequiredNote(_REQUIREDNOTE); $form->accept($renderer); $smarty->assign('T_POST_TIMELINE_TOPICS_FORM', $renderer->toArray()); $smarty->assign("T_HEADER_LOAD_SCRIPTS", array());
private function sendNotificationsRemoveLessonUsers($users) { foreach ($users as $user) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::LESSON_REMOVAL, "users_LOGIN" => $user, "lessons_ID" => $this->lesson['id'], "lessons_name" => $this->lesson['name'])); } }
if ($fromTimestamp < $toTimestamp) { $currentLesson->lesson['from_timestamp'] = $fromTimestamp; $currentLesson->lesson['to_timestamp'] = $toTimestamp; //$currentLesson -> lesson['shift'] = $form -> exportValue('shift') ? 1 : 0; $smarty->assign("T_FROM_TIMESTAMP", $currentLesson->lesson['from_timestamp']); $smarty->assign("T_TO_TIMESTAMP", $currentLesson->lesson['to_timestamp']); // Note: the semantics of the following event triggers: these triggerings are used to create future "before event" notifications now // For this reason the timestamp is set to the values of the lesson eF_deleteTableData("notifications", "id_type_entity LIKE '%_" . -1 * EfrontEvent::LESSON_PROGRAMMED_START . "_" . $lesson->lesson['id'] . "'"); eF_deleteTableData("notifications", "id_type_entity LIKE '%_" . -1 * EfrontEvent::LESSON_PROGRAMMED_EXPIRY . "_" . $lesson->lesson['id'] . "'"); eF_deleteTableData("events", "lessons_ID = " . $currentLesson->lesson['id'] . " AND (type = '" . EfrontEvent::LESSON_PROGRAMMED_START . "' OR type = '" . EfrontEvent::LESSON_PROGRAMMED_EXPIRY . "')"); $currentLesson->persist(); if ($fromTimestamp > time()) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::LESSON_PROGRAMMED_START, "timestamp" => $fromTimestamp, "lessons_ID" => $currentLesson->lesson['id'], "lessons_name" => $currentLesson->lesson['name'])); } if ($toTimestamp > time()) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::LESSON_PROGRAMMED_EXPIRY, "timestamp" => $toTimestamp, "lessons_ID" => $currentLesson->lesson['id'], "lessons_name" => $currentLesson->lesson['name'])); } $message = _OPERATIONCOMPLETEDSUCCESSFULLY; $message_type = 'success'; } else { $message = _ENDDATEMUSTBEBEFORESTARTDATE; $message_type = 'failure'; } } } $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->setJsWarnings(_BEFOREJAVASCRIPTERROR, _AFTERJAVASCRIPTERROR); $form->setRequiredNote(_REQUIREDNOTE); $form->accept($renderer); $smarty->assign('T_ADD_PERIOD_FORM', $renderer->toArray());
/** * Create a new unit * * This function is used to create a new unit. * <br/>Example: * <code> * $fields = array('name' => 'new unit', 'ctg_type' => 'theory'); * $unit = EfrontUnit :: createUnit($fields); * </code> * * @param array $fields The new unit fields * @return EfrontUnit The newly created unit * @since 3.5.0 * @access public */ public static function createUnit($fields = array()) { if (!isset($fields['lessons_ID'])) { return false; } !isset($fields['name']) ? $fields['name'] = 'Default unit' : null; !isset($fields['timestamp']) ? $fields['timestamp'] = time() : null; !isset($fields['ctg_type']) ? $fields['ctg_type'] = 'theory' : null; if (!isset($fields['metadata'])) { $defaultMetadata = array('title' => $fields['name'], 'creator' => $GLOBALS['currentUser']->user['name'] . ' ' . $GLOBALS['currentUser']->user['surname'], 'publisher' => $GLOBALS['currentUser']->user['name'] . ' ' . $GLOBALS['currentUser']->user['surname'], 'contributor' => $GLOBALS['currentUser']->user['name'] . ' ' . $GLOBALS['currentUser']->user['surname'], 'date' => date("Y/m/d", $fields['timestamp']), 'type' => 'content'); $fields['metadata'] = serialize($defaultMetadata); } $newId = eF_insertTableData("content", $fields); EfrontCache::getInstance()->deleteCache("content_tree:{$this['lessons_ID']}"); $result = eF_getTableData("content", "*", "id=" . $newId); //We perform an extra step/query for retrieving data, sinve this way we make sure that the array fields will be in correct order (forst id, then name, etc) $unit = new EfrontUnit($result[0]); EfrontSearch::insertText(htmlspecialchars($fields['name'], ENT_QUOTES), $unit['id'], "content", "title"); EfrontEvent::triggerEvent(array("type" => EfrontEvent::CONTENT_CREATION, "lessons_ID" => $fields['lessons_ID'], "entity_ID" => $unit['id'], "entity_name" => $fields['name'])); return $unit; }
/** * * @param $fields * @return unknown_type */ public static function create($fields = array()) { $new_id = eF_insertTableData("f_poll", $fields); EfrontSearch::insertText($fields['title'], $new_id, "f_poll", "title"); if (mb_strlen($fields['question']) > 3) { EfrontSearch::insertText(strip_tags($fields['question']), $new_id, "f_poll", "data"); } $post_lesson_id = $post_lesson_name = null; $result = eF_getTableData("lessons l, f_forums f", "l.id,l.name", "l.id=f.lessons_ID and f.id={$fields['f_forums_ID']}"); if (!empty($result)) { $post_lesson_id = $result[0]['id']; $post_lesson_name = $result[0]['name']; } // Timelines add event EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_POLL, "users_LOGIN" => $_SESSION['s_login'], "lessons_ID" => $post_lesson_id, "lessons_name" => $post_lesson_name, "entity_ID" => $new_id, "entity_name" => $fields['title'])); }
public function persist() { parent::persist(); $sourceUnit = new EfrontUnit($this->comments['content_ID']); EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_COMMENT_WRITING, "lessons_ID" => $sourceUnit['lessons_ID'], "entity_ID" => $this->comments['content_ID'], "entity_name" => $sourceUnit['name'])); }
$_SESSION['s_courses_ID'] = $course->course['id']; } else { unset($_SESSION['s_courses_ID']); } if (in_array($_GET['lessons_ID'], array_keys($userLessons))) { $newLesson = new EfrontLesson($_GET['lessons_ID']); if (!isset($_GET['course']) && !isset($_GET['from_course']) && $roles[$userLessons[$_GET['lessons_ID']]] == 'student' && ($newLesson->lesson['from_timestamp'] && $newLesson->lesson['from_timestamp'] > time() || $newLesson->lesson['to_timestamp'] && $newLesson->lesson['to_timestamp'] < time())) { eF_redirect("student.php?ctg=lessons&message=" . urlencode(_YOUCANNOTACCESSTHISLESSONORITDOESNOTEXIST)); } $_SESSION['s_lessons_ID'] = $_GET['lessons_ID']; $_SESSION['s_type'] = $roles[$userLessons[$_GET['lessons_ID']]]; //$justVisited = 1; // used to trigger the event when the lesson info is available // The justVisited flag is set to one during the first visit to this lesson //if ($justVisited) { //Trigger onLessonVisited event EfrontEvent::triggerEvent(array("type" => EfrontEvent::LESSON_VISITED, "users_LOGIN" => $currentUser->user['login'], "users_name" => $currentUser->user['name'], "users_surname" => $currentUser->user['surname'], "lessons_ID" => $_SESSION['s_lessons_ID'])); //} $smarty->assign("T_CHANGE_LESSON", "true"); $smarty->assign("T_REFRESH_SIDE", "true"); } else { unset($_GET['lessons_ID']); $message = _YOUCANNOTACCESSTHISLESSONORITDOESNOTEXIST; $message_type = 'failure'; $ctg = 'personal'; } } else { if ($_GET['lessons_ID'] == $_SESSION['s_lessons_ID']) { $smarty->assign("T_SHOW_LOADED_LESSON_OPTIONS", 1); } } }
/** * Create a new project * * This function is used to create a new project, * based on the specified values. * <br/>Example: * <code> * </code> * * @param array $fields The new project properties * @return EfrontProject The new project * @since 3.5.0 * @access public */ public static function createProject($fields = array()) { $projectMetadata = array('title' => $fields['title'], 'creator' => $GLOBALS['currentUser']->user['name'] . ' ' . $GLOBALS['currentUser']->user['surname'], 'publisher' => $GLOBALS['currentUser']->user['name'] . ' ' . $GLOBALS['currentUser']->user['surname'], 'contributor' => $GLOBALS['currentUser']->user['name'] . ' ' . $GLOBALS['currentUser']->user['surname'], 'date' => date("Y/m/d", time()), 'type' => 'project'); $fields['metadata'] = serialize($projectMetadata); $newId = eF_insertTableData("projects", $fields); $result = eF_getTableData("projects", "*", "id=" . $newId); //We perform an extra step/query for retrieving data, sinve this way we make sure that the array fields will be in correct order (forst id, then name, etc) $project = new EfrontProject($result[0]['id']); EfrontEvent::triggerEvent(array("type" => EfrontEvent::PROJECT_CREATION, "users_LOGIN" => $GLOBALS['currentUser']->user['login'], "users_name" => $GLOBALS['currentUser']->user['name'], "users_surname" => $GLOBALS['currentUser']->user['surname'], "lessons_ID" => $GLOBALS['currentLesson']->lesson['id'], "lessons_name" => $GLOBALS['currentLesson']->lesson['name'], "entity_name" => $fields['title'], "entity_ID" => $newId)); return $project; }
if ($form->isSubmitted() && $form->validate() && !$currentProject->expired) { try { $projectDirectory = G_UPLOADPATH . $currentUser->user['login'] . '/projects'; if (!is_dir($projectDirectory)) { EfrontDirectory::createDirectory($projectDirectory); } $projectDirectory = G_UPLOADPATH . $currentUser->user['login'] . '/projects/' . $currentProject->project['id']; if (!is_dir($projectDirectory)) { EfrontDirectory::createDirectory($projectDirectory); } $filesystem = new FileSystemTree($projectDirectory); $uploadedFile = $filesystem->uploadFile('filename', $projectDirectory); //$uploadedFile -> rename($uploadedFile['directory'].'/project_'.$currentProject -> project['id'].'.'.$uploadedFile['extension']); $fields_update = array("filename" => $uploadedFile['id'], "upload_timestamp" => time()); eF_updateTableData("users_to_projects", $fields_update, "users_LOGIN='******'login'] . "' AND projects_ID=" . $_GET['view_project']); EfrontEvent::triggerEvent(array("type" => EfrontEvent::PROJECT_SUBMISSION, "users_LOGIN" => $currentUser->user['login'], "lessons_ID" => $currentLesson->lesson['id'], "lessons_name" => $currentLesson->lesson['name'], "entity_ID" => $currentProject->project['id'], "entity_name" => $currentProject->project['title'])); eF_redirect("" . basename($_SERVER['PHP_SELF']) . "?ctg=projects&view_project=" . $_GET['view_project'] . "&message=" . urlencode(_FILEUPLOADED) . "&message_type=success"); } catch (EfrontFileException $e) { $smarty->assign("T_EXCEPTION_TRACE", $e->getTraceAsString()); $message = _SOMEPROBLEMOCCURED . ': ' . $e->getMessage() . ' (' . $e->getCode() . ') <a href = "javascript:void(0)" onclick = "eF_js_showDivPopup(event, \'' . _ERRORDETAILS . '\', 2, \'error_details\')">' . _MOREINFO . '</a>'; $message_type = 'failure'; } } elseif ($currentProject->expired) { $message = _PROJECTEXPIRED; $message_type = 'failure'; } $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->setJsWarnings(_BEFOREJAVASCRIPTERROR, _AFTERJAVASCRIPTERROR); $form->setRequiredNote(_REQUIREDNOTE); $form->accept($renderer); $smarty->assign('T_UPLOAD_PROJECT_FORM', $renderer->toArray());
/** * Handle AJAX actions * * This function is used to perform the necessary ajax actions, * that may be used in tests * <br/>Example: * <code> * $result = eF_getTableData("completed_tests", "*", "id=".$_GET['show_solved_test']); * $showTest = unserialize($result[0]['test']); * $status = $showTest -> getStatus($result[0]['users_LOGIN']); * $testString = $showTest -> toHTMLQuickForm(new HTML_Quickform(), false, true, true); * $testString = $showTest -> toHTMLSolved($testString, true); * if (isset($_GET['ajax'])) { * $showTest -> handleAjaxActions(); * } * </code> * * @since 3.5.2 * @access public */ public function handleAjaxActions() { try { if (isset($_GET['test_score'])) { if (mb_strpos($_GET['test_score'], ",") !== false) { $_GET['test_score'] = str_replace(",", ".", $_GET['test_score']); } if (is_numeric($_GET['test_score']) && $_GET['test_score'] <= 100 && $_GET['test_score'] >= 0) { $this->completedTest['score'] = $_GET['test_score']; foreach ($this->questions as $id => $question) { if ($question->pending) { $this->questions[$id]->pending = 0; $this->questions[$id]->score = $this->completedTest['score']; } } if ($this->test['mastery_score'] && $this->test['mastery_score'] > $this->completedTest['score']) { $this->completedTest['status'] = 'failed'; } else { if ($this->test['mastery_score'] && $this->test['mastery_score'] <= $this->completedTest['score']) { $this->completedTest['status'] = 'passed'; } } $this->completedTest['pending'] = 0; $this->save(); $result = eF_getTableData("completed_tests", "archive", "id=" . $this->completedTest['id']); if (!$result[0]['archive']) { $testUser = EfrontUserFactory::factory($this->completedTest['login']); if ($this->completedTest['status'] == 'failed') { $testUser->setSeenUnit($this->test['content_ID'], $this->test['lessons_ID'], 0); } else { $testUser->setSeenUnit($this->test['content_ID'], $this->test['lessons_ID'], 1); } } echo $this->completedTest['status']; } else { throw new EfrontTestException(_INVALIDSCORE . ': ' . $_GET['test_score'], EfrontTestException::INVALID_SCORE); } exit; } else { if (isset($_GET['test_feedback'])) { $this->completedTest['feedback'] = $_GET['test_feedback']; $this->save(); echo $_GET['test_feedback']; exit; } else { if (isset($_GET['redo_test']) && eF_checkParameter($_GET['redo_test'], 'id')) { $result = eF_getTableData("completed_tests", "tests_ID, users_LOGIN", "id=" . $_GET['redo_test']); $test = new EfrontTest($result[0]['tests_ID']); $test->redo($result[0]['users_LOGIN']); exit; } else { if (isset($_GET['redo_wrong_test']) && eF_checkParameter($_GET['redo_wrong_test'], 'id')) { $result = eF_getTableData("completed_tests", "tests_ID, users_LOGIN", "id=" . $_GET['redo_wrong_test']); $test = new EfrontTest($result[0]['tests_ID']); $test->redoOnlyWrong($result[0]['users_LOGIN']); exit; } else { if (isset($_GET['delete_done_test'])) { if (isset($_GET['all'])) { $this->undo($this->completedTest['login']); //eF_deleteTableData("completed_tests", "users_LOGIN='******'login']."' and tests_ID=".$this -> completedTest['testsId']); } else { $this->undo($this->completedTest['login'], $this->completedTest['id']); //eF_deleteTableData("completed_tests", "id=".$this -> completedTest['id']); } exit; } else { if (isset($_GET['question_score'])) { if (mb_strpos($_GET['question_score'], ",") !== false) { $_GET['question_score'] = str_replace(",", ".", $_GET['question_score']); } if (in_array($_GET['question'], array_keys($this->questions))) { if (is_numeric($_GET['question_score']) && $_GET['question_score'] <= 100 && $_GET['question_score'] >= 0) { $this->questions[$_GET['question']]->score = $_GET['question_score']; $this->questions[$_GET['question']]->scoreInTest = round($_GET['question_score'] * $this->getQuestionWeight($_GET['question']), 3); $this->questions[$_GET['question']]->pending = 0; $score = 0; foreach ($this->questions as $question) { $this->completedTest['scoreInTest'][$question->question['id']] = $question->scoreInTest; $score += $question->scoreInTest; } $this->completedTest['score'] = round($score, 2); $testUser = EfrontUserFactory::factory($this->completedTest['login']); if ($this->test['mastery_score'] && $this->test['mastery_score'] > $this->completedTest['score']) { if ($this->getPotentialScore() < $this->test['mastery_score']) { $this->completedTest['status'] = 'failed'; $flag = 0; //$testUser -> setSeenUnit($this -> test['content_ID'], $this -> test['lessons_ID'], 0); } } else { if ($this->test['mastery_score'] && $this->test['mastery_score'] <= $this->completedTest['score']) { $this->completedTest['status'] = 'passed'; $flag = 1; //$testUser -> setSeenUnit($this -> test['content_ID'], $this -> test['lessons_ID'], 1); } } $this->completedTest['pending'] = 0; foreach ($this->getQuestions(true) as $question) { if ($question->pending) { $this->completedTest['pending'] = 1; } } try { $lesson = new EfrontLesson($this->test['lessons_ID']); $lesson_name = $lesson->lesson['name']; } catch (EfrontLessonException $e) { $lesson_name = _SKILLGAPTESTS; } if (!$this->completedTest['pending']) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::TEST_MARKED, "users_LOGIN" => $this->completedTest['login'], "lessons_ID" => $this->test['lessons_ID'], "lessons_name" => $lesson_name, "entity_ID" => $this->test['id'], "entity_name" => $this->test['name'])); } if ($this->completedTest['status'] == 'failed' && $this->completedTest['pending'] != 1) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::TEST_FAILURE, "users_LOGIN" => $this->completedTest['login'], "lessons_ID" => $this->test['lessons_ID'], "lessons_name" => $lesson_name, "entity_ID" => $this->test['id'], "entity_name" => $this->test['name'])); } $this->save(); $testUser->setSeenUnit($this->test['content_ID'], $this->test['lessons_ID'], $flag); echo json_encode($this->completedTest); } else { throw new EfrontTestException(_INVALIDSCORE . ': ' . $_GET['test_score'], EfrontTestException::INVALID_SCORE); } } else { throw new EfrontTestException(_INVALIDID . ': ' . $_GET['question'], EfrontTestException::QUESTION_NOT_EXISTS); } exit; } else { if (isset($_GET['question_feedback'])) { if (in_array($_GET['question'], array_keys($this->questions))) { $this->questions[$_GET['question']]->feedback = $_GET['question_feedback']; $this->save(); echo $_GET['question_feedback']; } else { throw new EfrontTestException(_INVALIDID . ': ' . $_GET['question'], EfrontTestException::QUESTION_NOT_EXISTS); } exit; } else { if (isset($_GET['delete_file'])) { $file = new EfrontFile($_GET['delete_file']); $testDirectory = $this->getDirectory(); if (strpos($file['path'], $testDirectory['path']) !== false) { $file->delete(); } exit; } } } } } } } } } catch (Exception $e) { handleAjaxExceptions($e); } }
/** * Add event to eFront's events log * * This function enables module to provide events to the log * Events should be UNIQUELY defined INSIDE the module * * All data required for the appearance of the log message (provided by the getEventMessage function) * should be defined in the second argument array. * * <br/>Example: * <code> * $define("NEW_MODULE_ENTITY_INSERTION", 1); * $module -> addEvent(NEW_MODULE_ENTITY_INSERTION, array("id" => $id, "title" => $title)); * </code> * The $data parameter is the information required by the getEventMessage function to display the related message * for this event. * Note: * Field 'timestamp' is automatically completed * If fields "users_LOGIN", "users_name" and "users_surname" are not defined, then the currentUser's info will be used * If fields "lessons_ID" and "lessons_name" are defined, then this event will also be related with that lesson * The array might contain any other fields. However, the exact same ones need to be used by getEventMessage * * @param integer $type The unique code of the event inside the particular module scope * @param array $data The information required by the getEventMessage function to display the related message * for this event. * @return EfrontEvent the result of the event insertion to the database or false if arguments are not correct * @since 3.6.0 * @access public */ public function addEvent($type, $data) { $fields = array(); // All module related events have the same offset + the particular event's type $fields['type'] = EfrontEvent::MODULE_BASE_TYPE_CODE + (int) $type; // This should not exist normally, just in case unset($data['type']); // The discimination between events from different modules with the same type is made // by the entity_ID field, which is the className of the implicated module $fields['entity_ID'] = $this->className; // Mandatory users_LOGIN, users_surname, users_name fields if (isset($data['users_LOGIN'])) { $fields['users_LOGIN'] = $data['users_LOGIN']; if (isset($data['surname']) && isset($data['name'])) { $fields['users_surname'] = $data['surname']; $fields['users_name'] = $data['name']; } else { $eventsUser = EfrontUserFactory::factory($data['users_LOGIN']); $fields['users_surname'] = $eventsUser->user['surname']; $fields['users_name'] = $eventsUser->user['name']; } // We remove data fields, to serialize all remaining ones into the entity_name field unset($data['users_LOGIN']); unset($data['users_surname']); unset($data['users_name']); } else { $currentUser = $this->getCurrentUser(); $fields['users_LOGIN'] = $currentUser->user['login']; $fields['users_surname'] = $currentUser->user['surname']; $fields['users_name'] = $currentUser->user['name']; } // The lessons_ID field associates an event with a specific lesson if (isset($data['lessons_ID'])) { $fields['lessons_ID'] = $data['lessons_ID']; if (isset($data['lessons_name'])) { $fields['lessons_name'] = $data['lessons_name']; unset($data['lessons_name']); } else { $lesson = new EfrontLesson($fields['lessons_ID']); $fields['lessons_name'] = $lesson->lesson['name']; } // We remove data fields, to serialize all remaining ones into the entity_name field unset($data['lessons_ID']); } // Serialize all remaining user provided data for this event, with the same labels as the ones given if (!empty($data)) { $fields['entity_name'] = serialize($data); } // Finally get current time $fields['timestamp'] = time(); return EfrontEvent::triggerEvent($fields); }
if ($_GET['ldap']) { $newUser->login($_SESSION['ldap_user_pwd'], $encrypted); unset($_SESSION['ldap_user_pwd']); } else { $newUser->login($newUser->user['password'], $encrypted); } if ($GLOBALS['configuration']['force_change_password'] && !$newUser->isLdapUser && $newUser->user['need_pwd_change']) { eF_redirect("index.php?ctg=password_change"); } else { if ($GLOBALS['configuration']['show_license_note'] && $newUser->user['viewed_license'] == 0) { eF_redirect("index.php?ctg=agreement&message=" . urlencode($message) . "&message_type=" . $message_type); } else { if ($_SESSION['login_mode']) { eF_redirect("index.php?ctg=checkout&checkout=1&message=" . urlencode($message) . "&message_type=" . $message_type); } else { EfrontEvent::triggerEvent(array("type" => EfrontEvent::SYSTEM_VISITED, "users_LOGIN" => $newUser->user['login'], "users_name" => $newUser->user['name'], "users_surname" => $newUser->user['surname'])); loginRedirect($newUser->user['user_type'], urlencode($message), $message_type); } } } } } catch (Exception $e) { $smarty->assign("T_EXCEPTION_TRACE", $e->getTraceAsString()); $message = $e->getMessage() . ' <a href = "javascript:void(0)" onclick = "eF_js_showDivPopup(event, \'' . _ERRORDETAILS . '\', 2, \'error_details\')">' . _MOREINFO . '</a>'; $message_type = failure; } } } $renderer = new HTML_QuickForm_Renderer_ArraySmarty($smarty); $renderer->setRequiredTemplate('{$html}{if $required} <span class = "formRequired">*</span>
} if ($form->exportValue('system_avatar') == "none") { $selectedAvatar = 'unknown_small.png'; } else { if ($form->exportValue('system_avatar') != "") { $selectedAvatar = $form->exportValue('system_avatar'); } } if (isset($selectedAvatar)) { $selectedAvatar = $avatarsFileSystemTree->seekNode(G_SYSTEMAVATARSPATH . $selectedAvatar); $newList = FileSystemTree::importFiles($selectedAvatar['path']); //Import the file to the database, so we can access it with view_file $editedUser->user['avatar'] = key($newList); } } EfrontEvent::triggerEvent(array("type" => EfrontEvent::AVATAR_CHANGE, "users_LOGIN" => $editedUser->user['login'], "users_name" => $editedUser->user['name'], "users_surname" => $editedUser->user['surname'], "lessons_ID" => 0, "lessons_name" => "", "entity_ID" => $editedUser->user['avatar'])); } $editedUser->persist(); if (G_VERSIONTYPE == 'enterprise') { #cpp#ifdef ENTERPRISE if (isset($_GET['add_user'])) { $editedEmployee = EfrontHcdUser::createUser(array('users_login' => $editedUser->user['login'])); if ($currentEmployee->isSupervisor() && !EfrontUser::isOptionVisible('show_unassigned_users_to_supervisors')) { //if supervisors can't see unassigned users, then attach this new user to the supervisor's firts branch and job $branch = new EfrontBranch(current($currentEmployee->getSupervisedBranchesRecursive())); $nospecific = false; foreach ($branch->getJobDescriptions() as $value) { if ($value['description'] == _NOSPECIFICJOB) { $nospecific = $value['job_description_ID']; } }
/** * Set seen unit * * This function is used to set the designated unit as seen or not seen, * according to $seen parameter. It also sets current unit to be the seen * unit, if we are setting a unit as seen. Otherwise, the current unit is * either leaved unchanged, or, if it matches the unset unit, it points * to another seen unit. * <br/>Example: * <code> * $user -> setSeenUnit(32, 2, true); //Set the unit with id 32 in lesson 2 as seen * $user -> setSeenUnit(32, 2, false); //Set the unit with id 32 in lesson 2 as not seen * </code> * From version 3.5.2 and above, this function also sets the lesson as completed, if the conditions are met * * @param mixed $unit The unit to set status for, can be an id or an EfrontUnit object * @param mixed $lesson The lesson that the unit belongs to, can be an id or an EfrontLesson object * @param boolean $seen Whether to set the unit as seen or not * @return boolean true if the lesson was completed as well * @since 3.5.0 * @access public */ public function setSeenUnit($unit, $lesson, $seen) { if (isset($this->coreAccess['content']) && $this->coreAccess['content'] != 'change') { //If user type is not plain 'student' and is not set to 'change' mode, do nothing return true; } if ($unit instanceof EfrontUnit) { //Check validity of $unit $unit = $unit['id']; } elseif (!eF_checkParameter($unit, 'id')) { throw new EfrontContentException(_INVALIDID . ": {$unit}", EfrontContentException::INVALID_ID); } if ($lesson instanceof EfrontLesson) { //Check validity of $lesson $lesson = $lesson->lesson['id']; } elseif (!eF_checkParameter($lesson, 'id')) { throw new EfrontLessonException(_INVALIDID . ": {$lesson}", EfrontLessonException::INVALID_ID); } $lessons = $this->getLessons(); if (!in_array($lesson, array_keys($lessons))) { //Check if the user is actually registered in this lesson throw new EfrontUserException(_USERDOESNOTHAVETHISLESSON . ": " . $lesson, EfrontUserException::USER_NOT_HAVE_LESSON); } $result = eF_getTableData("users_to_lessons", "done_content, current_unit", "users_LOGIN='******'login'] . "' and lessons_ID=" . $lesson); sizeof($result) > 0 ? $doneContent = unserialize($result[0]['done_content']) : ($doneContent = array()); $current_unit = 0; if ($seen) { $doneContent[$unit] = $unit; $current_unit = $unit; } else { if (isset($doneContent[$unit])) { //Because of Fatal error: Cannot unset string offsets error unset($doneContent[$unit]); } if ($unit == $result[0]['current_unit']) { sizeof($doneContent) ? $current_unit = end($doneContent) : ($current_unit = 0); } } sizeof($doneContent) ? $doneContent = serialize($doneContent) : ($doneContent = null); eF_updateTableData("users_to_lessons", array('done_content' => $doneContent, 'current_unit' => $current_unit), "users_LOGIN='******'login'] . "' and lessons_ID=" . $lesson); // $cacheKey = "user_lesson_status:lesson:".$lesson."user:"******"type" => EfrontEvent::CONTENT_COMPLETION, "users_LOGIN" => $this->user['login'], "lessons_ID" => $lesson, "entity_ID" => $current_unit)); } //Set the lesson as complete, if it can be. $completedLesson = false; $userProgress = EfrontStats::getUsersLessonStatus($lesson, $this->user['login']); $userProgress = $userProgress[$lesson][$this->user['login']]; //eF_updateTableData("users_to_lessons", array('progress' => $userProgress['overall_progress']), "users_LOGIN='******'login']."' and lessons_ID=".$lesson); if ($seen) { if ($userProgress['lesson_passed'] && !$userProgress['completed']) { $lesson = new EfrontLesson($lesson); if ($lesson->options['auto_complete']) { $userProgress['tests_avg_score'] ? $avgScore = $userProgress['tests_avg_score'] : ($avgScore = 100); $timestamp = _AUTOCOMPLETEDAT . ': ' . date("Y/m/d, H:i:s"); $this->completeLesson($lesson, $avgScore, $timestamp); $completedLesson = true; } } if (!self::$cached_modules) { self::$cached_modules = eF_loadAllModules(); } // Trigger all necessary events. If the function has not been re-defined in the derived module class, nothing will happen foreach (self::$cached_modules as $module) { $module->onCompleteUnit($unit, $this->user['login']); } } return $completedLesson; }
/** * Add users to group * * This function is used to add users to the current group * <br>Example: * <code> * $group = new EfrontGroup(2); * $group -> addUsers(array('jdoe', 'doej')); * </code> * * @param mixed $users An array of user logins or EfrontUser objects, or a single login or EfrontUser object * @return boolean True if everything is ok * @since 3.5.2 * @access public */ public function addUsers($users, $userTypeInCourses = 'student') { if (empty($users)) { return true; } $users = EfrontUser::verifyUsersList($users); $groupUsers = eF_getTableDataFlat("users_to_groups", "users_LOGIN", "groups_ID=" . $this->group['id']); $errors = array(); foreach ($users as $key => $user) { if (!in_array($user, $groupUsers['users_LOGIN'], true)) { $fields[] = array('groups_ID' => $this->group['id'], 'users_LOGIN' => $user); } } eF_insertTableDataMultiple("users_to_groups", $fields); foreach ($fields as $utg) { EfrontEvent::triggerEvent(array("type" => EfrontEvent::NEW_ASSIGNMENT_TO_GROUP, "users_LOGIN" => $utg['users_LOGIN'], "entity_ID" => $this->group['id'], "entity_name" => $this->group['name'])); } foreach ($this->getCourses(true, true) as $course) { try { $course->addUsers($users, $userTypeInCourses, 1); } catch (Exception $e) { if ($e->getCode() == EfrontCourseException::MAX_USERS_LIMIT) { $max_users_errors[] = $e->getMessage(); } else { $errors[] = $e->getMessage(); } } } foreach ($this->getLessons(true, true) as $lesson) { try { $lesson->addUsers($users, $userTypeInCourses, 1); } catch (Exception $e) { if ($e->getCode() == EfrontCourseException::MAX_USERS_LIMIT) { $max_users_errors[] = $e->getMessage(); } else { $errors[] = $e->getMessage(); } } } if (!empty($errors)) { throw new EfrontGroupException(implode("<br>", $errors), EfrontGroupException::ASSIGNMENT_ERROR); } if (!empty($max_users_errors)) { return $max_users_errors; } return true; }
if (isset($_GET['ajax']) && $_GET['ajax'] == 'approval') { try { $course = new EfrontCourse($_GET['course_id']); $course->confirm($_GET['users_login']); echo json_encode(array('status' => 1)); exit; } catch (Exception $e) { handleAjaxExceptions($e); } } elseif (isset($_GET['ajax']) && $_GET['ajax'] == 'cancel') { try { if (eF_checkParameter($_GET['course_id'], 'id')) { $course = new EfrontCourse($_GET['course_id']); $course->removeUsers($_GET['users_login']); $event = array("type" => EfrontEvent::COURSE_USER_REFUSAL, "users_LOGIN" => $_GET['users_login'], "lessons_ID" => $course->course['id'], "lessons_name" => $course->course['name']); EfrontEvent::triggerEvent($event); echo json_encode(array('status' => 1)); exit; } } catch (Exception $e) { handleAjaxExceptions($e); } } } } #cpp#endif if ($currentUser->coreAccess['dashboard'] != 'hidden') { $myCoursesOptions[] = array('text' => _DASHBOARD, 'image' => "32x32/user.png", 'href' => basename($_SERVER['PHP_SELF']) . "?ctg=personal"); } $constraints = array('archive' => false, 'active' => true, 'sort' => 'name'); $userCourses = $currentUser->getUserCourses($constraints);
/** * Create Payment * * This function is used to create a new payment entry * * @param array $fields The payment properties * @return payment The created payment * @since 3.6.0 * @access public */ public static function create($fields = array()) { $fields['lessons'] = array_filter($fields['lessons'], 'is_numeric'); if (isset($fields['lessons']) && sizeof($fields['lessons']) > 0) { $lessonNames = eF_getTableDataFlat("lessons", "name", "id in (" . implode(",", $fields['lessons']) . ")"); } $fields['courses'] = array_filter($fields['courses'], 'is_numeric'); if (isset($fields['courses']) && sizeof($fields['courses']) > 0) { $courseNames = eF_getTableDataFlat("courses", "name", "id in (" . implode(",", $fields['courses']) . ")"); } !isset($fields['charset']) or $fields['comments'] = iconv($fields['charset'], "UTF-8", $fields['comments']); $fields = array('timestamp' => isset($fields['timestamp']) && eF_checkParameter($fields['timestamp'], 'timestamp') ? $fields['timestamp'] : time(), 'users_LOGIN' => isset($fields['users_LOGIN']) && eF_checkParameter($fields['users_LOGIN'], 'login') ? $fields['users_LOGIN'] : $_SESSION['s_login'], 'amount' => isset($fields['amount']) && is_numeric($fields['amount']) && $fields['amount'] > 0 ? $fields['amount'] : 0, 'status' => isset($fields['status']) && $fields['status'] ? $fields['status'] : 'completed', 'txn_id' => $fields['txn_id'], 'comments' => $fields['comments'], 'method' => isset($fields['method']) && in_array($fields['method'], array_keys(self::$methods)) ? $fields['method'] : 'manual'); $user = EfrontUserFactory::factory($fields['users_LOGIN']); if ($fields['method'] == 'paypal') { //@todo: get corresponding paypal_data id $eventType = EfrontEvent::NEW_PAYPAL_PAYMENT; } else { if ($fields['method'] == 'balance') { $eventType = EfrontEvent::NEW_BALANCE_PAYMENT; } else { if ($fields['method'] == 'manual') { $eventType = EfrontEvent::NEW_MANUAL_PAYMENT; } else { $eventType = false; } } } $newId = eF_insertTableData("payments", $fields); $result = eF_getTableData("payments", "*", "id=" . $newId); //We perform an extra step/query for retrieving data, since this way we make sure that the array fields will be in correct order (first id, then name, etc) $payment = new payments($result[0]['id']); if ($eventType) { $event = array("type" => $eventType, "users_LOGIN" => $user->user['login'], "users_name" => $user->user['name'], "users_surname" => $user->user['surname'], "entity_ID" => $newId); if (isset($lessonNames) && !empty($lessonNames)) { $event['lessons_name'] = _LESSONS . ': ' . implode(",", $lessonNames['name']) . '<br>'; } if (isset($courseNames) && !empty($courseNames)) { $event['lessons_name'] .= _COURSES . ': ' . implode(",", $courseNames['name']); } if ($fields['credit']) { $event['lessons_name'] .= _BALANCE . ': ' . $fields['credit']; } EfrontEvent::triggerEvent($event); } return $payment; }