function _AttemptExists($testID, $attemptID = false) { $arFields = array("STUDENT_ID" => intval($GLOBALS["USER"]->GetID()), "TEST_ID" => $testID, "STATUS" => "B"); if ($attemptID !== false) { $arFields["ID"] = $attemptID; } $rsAttempt = CTestAttempt::GetList(array(), $arFields); return $rsAttempt->GetNext(); }
$arResult["RECORDS"][] = $arGradebook; // collect tests' ids if (!in_array($arGradebook['TEST_ID'], $arTestsIds)) { $arTestsIds[] = $arGradebook['TEST_ID']; } } // Add info about last tests' attempts for each test $arResult['LAST_TEST_INFO'] = array(); foreach ($arTestsIds as $key => $testId) { $arAttempt = false; $attempts = CTestAttempt::GetList(array('ID' => 'DESC'), array('TEST_ID' => $testId, 'STUDENT_ID' => (int) $USER->getId()), array('ID', 'TEST_ID', 'STUDENT_ID', 'SCORE', 'COMPLETED'), array('NAV_PARAMS' => array('nPageTop' => 1))); $lastScore = false; $lastCompleted = false; if ($arAttempt = $attempts->fetch()) { $lastScore = $arAttempt['SCORE']; $lastCompleted = $arAttempt['COMPLETED']; } $arResult['LAST_TEST_INFO'][$testId] = array('LAST_SCORE' => $lastScore, 'LAST_COMPLETED' => $lastCompleted); } unset($rsGradebook); unset($arGradebook); //Attempts if (array_key_exists($arParams["TEST_ID_VARIABLE"], $_REQUEST) && intval($_REQUEST[$arParams["TEST_ID_VARIABLE"]]) > 0) { $rsAttempt = CTestAttempt::GetList(array("ID" => "DESC"), array("TEST_ID" => intval($_REQUEST[$arParams["TEST_ID_VARIABLE"]]), "STUDENT_ID" => intval($USER->GetID()))); while ($arAttempt = $rsAttempt->GetNext()) { $arResult["ATTEMPTS"][] = $arAttempt; } unset($arAttempt); unset($rsAttempt); } $this->IncludeComponentTemplate();
/** * <p>Метод удаляет запись в журнале с идентификатором ID.</p> * * * * * @param int $ID Идентификатор записи. * * * * @return bool <p>Метод возвращает <i>true</i> в случае успешного удаления записи, в * противном случае возвращает <i>false</i>.</p><a name="examples"></a> * * * <h4>Example</h4> * <pre> * <? * if (CModule::IncludeModule("learning")) * { * $RECORD_ID = 96; * * @set_time_limit(0); * $DB->StartTransaction(); * if (!CGradeBook::Delete($RECORD_ID)) * { * echo "Error!"; * $DB->Rollback(); * } * else * $DB->Commit(); * * } * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/cgradebook/delete.php * @author Bitrix */ public static function Delete($ID) { global $DB; $ID = intval($ID); if ($ID < 1) return false; $strSql = "SELECT TEST_ID, STUDENT_ID FROM b_learn_gradebook WHERE ID = ".$ID; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if (!$arGBook = $res->Fetch()) return false; $attempts = CTestAttempt::GetList(Array(), Array("TEST_ID" => $arGBook["TEST_ID"], "STUDENT_ID" => $arGBook["STUDENT_ID"])); while($arAttempt = $attempts->Fetch()) { if(!CTestAttempt::Delete($arAttempt["ID"])) return false; } $strSql = "DELETE FROM b_learn_gradebook WHERE ID = ".$ID; if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; return true; }
$APPLICATION->SetTitle(GetMessage("LEARNING_TESTS_LIST")); } //arResult $arResult = array("TESTS" => array(), "TESTS_COUNT" => 0, "ERROR_MESSAGE" => "", "NAV_SRTING" => "", "NAV_RESULT" => null); $rsTest = CTest::GetList(array("SORT" => "ASC"), array("COURSE_ID" => $arParams["COURSE_ID"], "ACTIVE" => "Y", "CHECK_PERMISSIONS" => $arParams["CHECK_PERMISSIONS"])); CPageOption::SetOptionString("main", "nav_page_in_session", "N"); $rsTest->NavStart($arParams["TESTS_PER_PAGE"]); $arResult["NAV_STRING"] = $rsTest->GetPageNavString(GetMessage("LEARNING_TESTS_NAV")); $arResult["NAV_RESULT"] = $rsTest; while ($arTest = $rsTest->GetNext()) { //Test URL $arTest["TEST_DETAIL_URL"] = CComponentEngine::MakePathFromTemplate($arParams["TEST_DETAIL_TEMPLATE"], array("TEST_ID" => $arTest["ID"], "COURSE_ID" => $arTest["COURSE_ID"])); if ($_SERVER['REDIRECT_STATUS'] == '404' || isset($_REQUEST["SEF_APPLICATION_CUR_PAGE_URL"])) { $arTest["TEST_DETAIL_URL"] = "/bitrix/urlrewrite.php?SEF_APPLICATION_CUR_PAGE_URL=" . urlencode($arTest["TEST_DETAIL_URL"]); } //Unfinished attempt exists? $arTest["ATTEMPT"] = false; if ($USER->IsAuthorized()) { $rsAttempt = CTestAttempt::GetList(array(), array("TEST_ID" => $arTest["ID"], "STATUS" => "B", "STUDENT_ID" => intval($USER->GetID()))); $arTest["ATTEMPT"] = $rsAttempt->GetNext(); } $arResult["TESTS"][] = $arTest; } $arResult["TESTS_COUNT"] = count($arResult["TESTS"]); if ($arResult["TESTS_COUNT"] <= 0) { $arResult["ERROR_MESSAGE"] = GetMessage("LEARNING_BAD_TEST_LIST"); } unset($rsTest); unset($arTest); unset($rsAttempt); $this->IncludeComponentTemplate();
CAdminMessage::ShowMessage(GetMessage('LEARNING_MODULE_NOT_FOUND')); } require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_admin.php'; // system's epilog exit; } require_once $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/learning/prolog.php"; IncludeModuleLangFile(__FILE__); ClearVars(); $ATTEMPT_ID = intval($ATTEMPT_ID); $ID = intval($ID); $bBadResult = false; $message = null; //$r = CTestAttempt::GetByID($ATTEMPT_ID); // was: $r = CTestAttempt::GetList(Array(), Array("ID" => $ATTEMPT_ID, "MIN_PERMISSION" => "W")); $r = CTestAttempt::GetList(array(), array("ID" => $ATTEMPT_ID, 'ACCESS_OPERATIONS' => CLearnAccess::OP_LESSON_READ | CLearnAccess::OP_LESSON_WRITE)); if (!($arAttempt = $r->GetNext())) { $bBadResult = true; } if (!$bBadResult) { $r = CTestResult::GetByID($ID); if (!$r->ExtractFields("str_")) { $bBadResult = true; } } if ($bBadResult) { $APPLICATION->SetTitle(GetMessage("LEARNING_ADMIN_TITLE")); require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_after.php"; $aContext = array(array("ICON" => "btn_list", "TEXT" => GetMessage("LEARNING_BACK_TO_ADMIN"), "LINK" => "learn_unilesson_admin.php?lang=" . LANG, "TITLE" => GetMessage("LEARNING_BACK_TO_ADMIN"))); $context = new CAdminContextMenu($aContext); $context->Show();
function GetByID($ID) { if ((int) $ID > 0) return CTestAttempt::GetList(array(), array("ID" => (int) $ID)); else return (new CDBResult()); }
function GetByID($ID) { return CTestAttempt::GetList(array(), array("ID" => $ID)); }
if ($arAttempt["STATUS"] == "N") { $arFields = array("~DATE_START" => CDatabase::CurrentTimeFunction(), "DATE_END" => false, "STATUS" => "B"); $ta = new CTestAttempt(); $res = $ta->Update($arAttempt["ID"], $arFields); } LocalRedirect($arResult["REDIRECT_PAGE"]); } //Check attempt limit if ($arTest["ATTEMPT_LIMIT"] > 0 && $arTest["ATTEMPT_LIMIT"] <= CTestAttempt::GetCount($arParams["TEST_ID"], $USER->GetID())) { $sessAttemptError = GetMessage("LEARNING_LIMIT_ERROR"); LocalRedirect($arResult["REDIRECT_PAGE"]); } //Check min time between attempts if ($arTest["MIN_TIME_BETWEEN_ATTEMPTS"] > 0) { CTimeZone::Disable(); $rsPrevAttempt = CTestAttempt::GetList(array("DATE_END" => "DESC"), array("TEST_ID" => $arParams["TEST_ID"], "STUDENT_ID" => $USER->GetID())); CTimeZone::Enable(); if ($arPrevAttempt = $rsPrevAttempt->GetNext()) { $prevTime = strtotime($arPrevAttempt["DATE_END"]); $timeDiff = floor((time() - strtotime($arPrevAttempt["DATE_END"])) / 60); //time difference in minutes if ($timeDiff < $arTest["MIN_TIME_BETWEEN_ATTEMPTS"]) { $nextAttemptAfter = $arTest["MIN_TIME_BETWEEN_ATTEMPTS"] - $timeDiff; $nextAttemptAfterD = floor($nextAttemptAfter / (60 * 24)); $nextAttemptAfterH = floor(($nextAttemptAfter - $nextAttemptAfterD * 60 * 24) / 60); $nextAttemptAfterM = $nextAttemptAfter - $nextAttemptAfterD * 60 * 24 - $nextAttemptAfterH * 60; $sessAttemptError = GetMessage("LEARNING_TEST_TIME_INTERVAL_ERROR") . " " . ($nextAttemptAfterD > 0 ? $nextAttemptAfterD . " " . GetMessage("LEARNING_TEST_TIME_INTERVAL_ERROR_D") . " " : "") . ($nextAttemptAfterH > 0 ? $nextAttemptAfterH . " " . GetMessage("LEARNING_TEST_TIME_INTERVAL_ERROR_H") . " " : "") . $nextAttemptAfterM . " " . GetMessage("LEARNING_TEST_TIME_INTERVAL_ERROR_M") . ""; LocalRedirect($arResult["REDIRECT_PAGE"]); } } }
/** * <p>Возвращает попытку по идентификатору ID. Учитываются права доступа текущего пользователя.</p> * * * @param int $ID Идентификатор попытки. * * @return CDBResult <p>Возвращается объект <a * href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a>.</p> </h * * <h4>See Also</h4> * <li> <a href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a> </li><li> <a * href="http://dev.1c-bitrix.ru/api_help/learning/fields.php#attempt">Поля попытки</a> </li> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ctestattempt/getbyid.php * @author Bitrix */ public static function GetByID($ID) { if ((int) $ID > 0) { return CTestAttempt::GetList(array(), array("ID" => (int) $ID)); } else { return new CDBResult(); } }
if ($ar = $res->Fetch()) { $DB->StartTransaction(); if (!CTestAttempt::Delete($ID)) { $DB->Rollback(); $lAdmin->AddGroupError(GetMessage("LEARNING_DELETE_ERROR"), $ID); } else { CGradeBook::RecountAttempts($ar["STUDENT_ID"], $ar["TEST_ID"]); } $DB->Commit(); } break; } } } // fetch data $rsData = CTestAttempt::GetList(array($by => $order), $arFilter, array(), array('nPageSize' => CAdminResult::GetNavSize($sTableID))); $rsData = new CAdminResult($rsData, $sTableID); // navigation string setup $lAdmin->NavText($rsData->GetNavPrint(GetMessage("LEARNING_ADMIN_RESULTS"))); // list header $lAdmin->AddHeaders(array(array("id" => "ID", "content" => "ID", "sort" => "id", "default" => true), array("id" => "USER_NAME", "content" => GetMessage('LEARNING_ADMIN_STUDENT'), "sort" => "student_id", "default" => true), array("id" => "TEST_NAME", "content" => GetMessage('LEARNING_ADMIN_TEST'), "sort" => "test_name", "default" => true), array("id" => "DATE_START", "content" => GetMessage('LEARNING_ADMIN_DATE_START'), "sort" => "date_start", "default" => true), array("id" => "DATE_END", "content" => GetMessage('LEARNING_ADMIN_DATE_END'), "sort" => "date_end", "default" => true), array("id" => "STATUS", "content" => GetMessage('LEARNING_ADMIN_STATUS'), "sort" => "status", "default" => true), array("id" => "QUESTIONS", "content" => Getmessage('LEARNING_ADMIN_QUESTIONS'), "sort" => "questions", "default" => true, "align" => "center"), array("id" => "COMPLETED", "content" => Getmessage('LEARNING_ADMIN_COMPLETED'), "sort" => "completed", "default" => true), array("id" => "SCORE", "content" => GetMessage('LEARNING_ADMIN_SCORE'), "sort" => "score", "default" => true), array("id" => "MAX_SCORE", "content" => GetMessage('LEARNING_ADMIN_MAX_SCORE'), "sort" => "max_score", "default" => true))); // building list while ($arRes = $rsData->NavNext(true, "f_")) { $row =& $lAdmin->AddRow($f_ID, $arRes); $row->AddCalendarField("DATE_START"); $row->AddCalendarField("DATE_END"); $row->AddSelectField("STATUS", $arStatus); $row->AddCheckField("COMPLETED"); $row->AddInputField("SCORE", array("size" => "3")); $row->AddInputField("MAX_SCORE", array("size" => "3")); $row->AddViewField("ID", '<a href="learn_test_result_admin.php?lang=' . LANG . '&ATTEMPT_ID=' . $f_ID . '">' . $f_ID . '</a>');
if ($ar = $res->Fetch()) { $DB->StartTransaction(); if (!CTestAttempt::Delete($ID)) { $DB->Rollback(); $lAdmin->AddGroupError(GetMessage("LEARNING_DELETE_ERROR"), $ID); } else { CGradeBook::RecountAttempts($ar["STUDENT_ID"], $ar["TEST_ID"]); } $DB->Commit(); } break; } } } // fetch data $rsData = CTestAttempt::GetList(array($by => $order), $arFilter); $rsData = new CAdminResult($rsData, $sTableID); $rsData->NavStart(); // navigation string setup $lAdmin->NavText($rsData->GetNavPrint(GetMessage("LEARNING_ADMIN_RESULTS"))); // list header $lAdmin->AddHeaders(array(array("id" => "ID", "content" => "ID", "sort" => "id", "default" => true), array("id" => "USER_NAME", "content" => GetMessage('LEARNING_ADMIN_STUDENT'), "sort" => "student_id", "default" => true), array("id" => "TEST_NAME", "content" => GetMessage('LEARNING_ADMIN_TEST'), "sort" => "test_name", "default" => true), array("id" => "DATE_START", "content" => GetMessage('LEARNING_ADMIN_DATE_START'), "sort" => "date_start", "default" => true), array("id" => "DATE_END", "content" => GetMessage('LEARNING_ADMIN_DATE_END'), "sort" => "date_end", "default" => true), array("id" => "STATUS", "content" => GetMessage('LEARNING_ADMIN_STATUS'), "sort" => "status", "default" => true), array("id" => "QUESTIONS", "content" => Getmessage('LEARNING_ADMIN_QUESTIONS'), "sort" => "questions", "default" => true, "align" => "center"), array("id" => "COMPLETED", "content" => Getmessage('LEARNING_ADMIN_COMPLETED'), "sort" => "completed", "default" => true), array("id" => "SCORE", "content" => GetMessage('LEARNING_ADMIN_SCORE'), "sort" => "score", "default" => true), array("id" => "MAX_SCORE", "content" => GetMessage('LEARNING_ADMIN_MAX_SCORE'), "sort" => "max_score", "default" => true))); // building list while ($arRes = $rsData->NavNext(true, "f_")) { $row =& $lAdmin->AddRow($f_ID, $arRes); $row->AddCalendarField("DATE_START"); $row->AddCalendarField("DATE_END"); $row->AddSelectField("STATUS", $arStatus); $row->AddCheckField("COMPLETED"); $row->AddInputField("SCORE", array("size" => "3")); $row->AddInputField("MAX_SCORE", array("size" => "3"));
$arResult["NAV_RESULT"] = $rsTest; while ($arTest = $rsTest->GetNext()) { // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour // can be changed in future without any notifications. if (isset($arTest['DESCRIPTION'])) { $arTest['DESCRIPTION'] = CLearnHelper::PatchLessonContentLinks($arTest['DESCRIPTION'], $arParams['COURSE_ID']); } //Test URL $arTest["TEST_DETAIL_URL"] = CComponentEngine::MakePathFromTemplate($arParams["TEST_DETAIL_TEMPLATE"], array("TEST_ID" => $arTest["ID"], "COURSE_ID" => $arTest["COURSE_ID"])); if ($_SERVER['REDIRECT_STATUS'] == '404' || isset($_REQUEST["SEF_APPLICATION_CUR_PAGE_URL"])) { $arTest["TEST_DETAIL_URL"] = "/bitrix/urlrewrite.php?SEF_APPLICATION_CUR_PAGE_URL=" . urlencode($arTest["TEST_DETAIL_URL"]); } //Unfinished attempt exists? $arTest["ATTEMPT"] = false; if ($USER->IsAuthorized()) { $rsAttempt = CTestAttempt::GetList(array(), array("TEST_ID" => $arTest["ID"], "STATUS" => "B", "STUDENT_ID" => intval($USER->GetID()), "CHECK_PERMISSIONS" => $arParams["CHECK_PERMISSIONS"])); $arTest["ATTEMPT"] = $rsAttempt->GetNext(); } if ($arTest["PREVIOUS_TEST_ID"] > 0 && $arTest["PREVIOUS_TEST_SCORE"] > 0) { $rsPrevTest = CTest::GetList(array(), array("ID" => $arTest["PREVIOUS_TEST_ID"], 'CHECK_PERMISSIONS' => 'N')); if ($arPrevTest = $rsPrevTest->GetNext()) { if ($parent = $this->GetParent()) { $testUrlTemplate = CComponentEngine::MakePathFromTemplate($parent->arResult["URL_TEMPLATES"]["test"], array("TEST_ID" => $arPrevTest["ID"], "COURSE_ID" => $arPrevTest["COURSE_ID"])); $arTest["PREVIOUS_TEST_LINK"] = "<a href=\"" . $testUrlTemplate . "\">" . $arPrevTest["NAME"] . "</a>"; } } } $arResult["TESTS"][] = $arTest; } $arResult["TESTS_COUNT"] = count($arResult["TESTS"]); if ($arResult["TESTS_COUNT"] <= 0) {
function Delete($ID) { global $DB; $ID = intval($ID); if ($ID < 1) { return false; } CLearnHelper::FireEvent('OnBeforeTestDelete', $ID); //Gradebook $records = CGradeBook::GetList(array(), array("TEST_ID" => $ID)); while ($arRecord = $records->Fetch()) { if (!CGradeBook::Delete($arRecord["ID"])) { return false; } } //Attempts $attempts = CTestAttempt::GetList(array(), array("TEST_ID" => $ID)); while ($arAttempt = $attempts->Fetch()) { if (!CTestAttempt::Delete($arAttempt["ID"])) { return false; } } //Marks $marks = CLTestMark::GetList(array(), array("TEST_ID" => $ID)); while ($arMark = $marks->Fetch()) { if (!CLTestMark::Delete($arMark["ID"])) { return false; } } $strSql = "DELETE FROM b_learn_test WHERE ID = " . $ID; if (!$DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__)) { return false; } CEventLog::add(array('AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM', 'MODULE_ID' => 'learning', 'ITEM_ID' => 'T #' . $ID, 'DESCRIPTION' => 'test removed')); CLearnHelper::FireEvent('OnAfterTestDelete', $ID); return true; }
/** * <p>Метод удаляет тест с идентификатором ID.</p> * * * * * @param int $ID Идентификатор теста. * * * * @return bool <p>Метод возвращает <i>true</i> в случае успешного удаления теста, в * противном случае возвращает <i>false</i>.</p><a name="examples"></a> * * * <h4>Example</h4> * <pre> * <? * if (CModule::IncludeModule("learning")) * { * * $TEST_ID = 99; * $COURSE_ID = 97; * * if (CCourse::GetPermission($COURSE_ID) >= 'W') * { * @set_time_limit(0); * $DB->StartTransaction(); * if (!CTest::Delete($TEST_ID)) * { * echo "Error!"; * $DB->Rollback(); * } * else * $DB->Commit(); * } * } * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ctest/delete.php * @author Bitrix */ public static function Delete($ID) { global $DB; $ID = intval($ID); if ($ID < 1) return false; CLearnHelper::FireEvent('OnBeforeTestDelete', $ID); //Gradebook $records = CGradeBook::GetList(Array(), Array("TEST_ID" => $ID)); while($arRecord = $records->Fetch()) { if(!CGradeBook::Delete($arRecord["ID"])) return false; } //Attempts $attempts = CTestAttempt::GetList(Array(), Array("TEST_ID" => $ID)); while($arAttempt = $attempts->Fetch()) { if(!CTestAttempt::Delete($arAttempt["ID"])) return false; } //Marks $marks = CLTestMark::GetList(Array(), Array("TEST_ID" => $ID)); while($arMark = $marks->Fetch()) { if(!CLTestMark::Delete($arMark["ID"])) return false; } $strSql = "DELETE FROM b_learn_test WHERE ID = ".$ID; if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; CLearnHelper::FireEvent('OnAfterTestDelete', $ID); return true; }