%PDF- %PDF-
Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/learning/classes/general/ |
Current File : //proc/self/root/home/bitrix/www/bitrix/modules/learning/classes/general/gradebook.php |
<?php class CAllGradeBook { public static function LessonIdByGradeBookId ($certId) { $rc = CGradeBook::GetByID($certId); if ($rc === false) throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP); $row = $rc->Fetch(); if ( ! isset($row['LINKED_LESSON_ID']) ) throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP); return ( (int) $row['LINKED_LESSON_ID'] ); } function CheckFields(&$arFields, $ID = false) { global $DB, $APPLICATION; if ($ID===false && !is_set($arFields, "STUDENT_ID")) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_USER_ID"), "EMPTY_STUDENT_ID"); return false; } elseif (is_set($arFields, "STUDENT_ID")) { $dbResult = CUser::GetByID($arFields["STUDENT_ID"]); if (!$dbResult->Fetch()) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_USER_ID_EX"), "ERROR_NO_STUDENT_ID"); return false; } } if ($ID===false && !is_set($arFields, "TEST_ID")) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_ID"), "EMPTY_TEST_ID"); return false; } elseif (is_set($arFields, "TEST_ID")) { $r = CTest::GetByID($arFields["TEST_ID"]); if(!$r->Fetch()) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_ID_EX"), "ERROR_NO_TEST_ID"); return false; } } if (is_set($arFields, "STUDENT_ID") && is_set($arFields, "TEST_ID")) { $res = CGradeBook::GetList(Array(), Array("STUDENT_ID" => $arFields["STUDENT_ID"], "TEST_ID" => $arFields["TEST_ID"])); if ($res->Fetch()) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_GRADEBOOK_DUPLICATE"), "ERROR_GRADEBOOK_DUPLICATE"); return false; } } if (is_set($arFields, "COMPLETED") && $arFields["COMPLETED"] != "Y") $arFields["COMPLETED"] = "N"; return true; } function Add($arFields) { global $DB; if(CGradeBook::CheckFields($arFields)) { unset($arFields["ID"]); $ID = $DB->Add("b_learn_gradebook", $arFields, Array(), "learning"); return $ID; } return false; } function Update($ID, $arFields) { global $DB; $ID = intval($ID); if ($ID < 1) return false; if (CGradeBook::CheckFields($arFields, $ID)) { unset($arFields["ID"]); unset($arFields["STUDENT_ID"]); unset($arFields["TEST_ID"]); $arBinds=Array(); $strUpdate = $DB->PrepareUpdate("b_learn_gradebook", $arFields, "learning"); $strSql = "UPDATE b_learn_gradebook SET ".$strUpdate." WHERE ID=".$ID; $DB->QueryBind($strSql, $arBinds, false, "File: ".__FILE__."<br>Line: ".__LINE__); return true; } return false; } 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; } function GetFilter($arFilter) { if (!is_array($arFilter)) $arFilter = Array(); $arSqlSearch = Array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "STUDENT_ID": case "TEST_ID": case "RESULT": case "MAX_RESULT": $arSqlSearch[] = CLearnHelper::FilterCreate("G.".$key, $val, "number", $bFullJoin, $cOperationType); break; case "COMPLETED": $arSqlSearch[] = CLearnHelper::FilterCreate("G.".$key, $val, "string_equal", $bFullJoin, $cOperationType); break; case "USER": $arSqlSearch[] = GetFilterQuery("U.ID, U.LOGIN, U.NAME, U.LAST_NAME",$val); break; case "USER_LOGIN": $arSqlSearch[] = CLearnHelper::FilterCreate("U.LOGIN", $val, "string_equal", $bFullJoin, $cOperationType); break; case "USER_NAME": $arSqlSearch[] = CLearnHelper::FilterCreate("U.NAME", $val, "string_equal", $bFullJoin, $cOperationType); break; case "USER_LAST_NAME": $arSqlSearch[] = CLearnHelper::FilterCreate("U.LAST_NAME", $val, "string_equal", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; } function GetByID($ID) { return CGradeBook::GetList(Array(), Array("ID"=>$ID)); } function RecountAttempts($STUDENT_ID,$TEST_ID) { global $DB; $STUDENT_ID = intval($STUDENT_ID); $TEST_ID = intval($TEST_ID); if ($TEST_ID < 1 || $STUDENT_ID < 1) return false; $strSql = "SELECT ID FROM b_learn_gradebook G WHERE STUDENT_ID = '".$STUDENT_ID."' AND TEST_ID = '".$TEST_ID."' "; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if (!$arG = $res->Fetch()) { $ID = CGradeBook::Add(Array( "STUDENT_ID" => $STUDENT_ID, "TEST_ID" => $TEST_ID, "RESULT" => "0", "MAX_RESULT" => "0", "COMPLETED" => "N" )); return ($ID > 0); } $strSql = "SELECT SCORE, MAX_SCORE, COMPLETED ". "FROM b_learn_attempt ". "WHERE STUDENT_ID = '".$STUDENT_ID."' AND TEST_ID = '".$TEST_ID."' ". "ORDER BY COMPLETED DESC, SCORE DESC "; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); $res->NavStart(); if (intval($res->SelectedRowsCount()) == 0) { $strSql = "DELETE FROM b_learn_gradebook WHERE ID = ".$arG["ID"]; if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; return true; } if (!$ar = $res->Fetch()) return false; $strSql = "UPDATE b_learn_gradebook SET ATTEMPTS = '".intval($res->SelectedRowsCount())."', COMPLETED = '".$ar["COMPLETED"]."', RESULT = '".intval($ar["SCORE"])."' , MAX_RESULT = '".intval($ar["MAX_SCORE"])."' WHERE STUDENT_ID = '".$STUDENT_ID."' AND TEST_ID = '".$TEST_ID."' "; if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; return true; } function GetExtraAttempts($STUDENT_ID, $TEST_ID) { global $DB; $STUDENT_ID = intval($STUDENT_ID); $TEST_ID = intval($TEST_ID); $strSql = "SELECT EXTRA_ATTEMPTS FROM b_learn_gradebook WHERE STUDENT_ID = ".$STUDENT_ID." AND TEST_ID = ".$TEST_ID.""; $rs = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if (!$ar = $rs->Fetch()) { return 0; } else { return $ar["EXTRA_ATTEMPTS"]; } } function AddExtraAttempts($STUDENT_ID, $TEST_ID, $COUNT = 1) { global $DB; $STUDENT_ID = intval($STUDENT_ID); $TEST_ID = intval($TEST_ID); $COUNT = intval($COUNT); $strSql = "SELECT ID, EXTRA_ATTEMPTS FROM b_learn_gradebook WHERE STUDENT_ID = ".$STUDENT_ID." AND TEST_ID = ".$TEST_ID.""; $rs = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ( ! ($ar = $rs->Fetch()) ) { $ID = CGradeBook::Add(Array( "STUDENT_ID" => $STUDENT_ID, "TEST_ID" => $TEST_ID, "RESULT" => "0", "MAX_RESULT" => "0", "COMPLETED" => "N", "EXTRA_ATTEMPTS" => $COUNT )); return ($ID > 0); } else { $strSql = "UPDATE b_learn_gradebook SET EXTRA_ATTEMPTS = ".($ar["EXTRA_ATTEMPTS"] + $COUNT)." WHERE ID = ".$ar["ID"]; if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; } } public static function GetList($arOrder = array(), $arFilter = array(), $arNavParams = array()) { global $DB; $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter); $arSqlSearch = array_filter(CGradeBook::GetFilter($arFilter)); $strSqlSearch = ''; if ( ! empty($arSqlSearch) ) $strSqlSearch .= implode(' AND ', $arSqlSearch); //Sites $SqlSearchLang = "''"; if (array_key_exists("SITE_ID", $arFilter)) { $arLID = Array(); if(is_array($arFilter["SITE_ID"])) $arLID = $arFilter["SITE_ID"]; else { if (strlen($arFilter["SITE_ID"]) > 0) $arLID[] = $arFilter["SITE_ID"]; } foreach($arLID as $v) $SqlSearchLang .= ", '".$DB->ForSql($v, 2)."'"; } $strSqlFrom = static::__getSqlFromClause($SqlSearchLang); if ($oPermParser->IsNeedCheckPerm()) $strSqlFrom .= " AND TUL.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; if ($strSqlSearch !== '') $strSqlFrom .= ' AND ' . $strSqlSearch; $strSql = "SELECT G.*, T.NAME as TEST_NAME, T.COURSE_ID as COURSE_ID, T.APPROVED as TEST_APPROVED, (T.ATTEMPT_LIMIT + G.EXTRA_ATTEMPTS) AS ATTEMPT_LIMIT, TUL.NAME as COURSE_NAME, C.LINKED_LESSON_ID AS LINKED_LESSON_ID, ". $DB->Concat("'('",'U.LOGIN',"') '","CASE WHEN U.NAME IS NULL THEN '' ELSE U.NAME END","' '", "CASE WHEN U.LAST_NAME IS NULL THEN '' ELSE U.LAST_NAME END")." as USER_NAME, U.ID as USER_ID ". $strSqlFrom; if (!is_array($arOrder)) $arOrder = array(); foreach($arOrder as $by=>$order) { $by = strtolower($by); $order = strtolower($order); if ($order!="asc") $order = "desc"; if ($by == "id") $arSqlOrder[] = " G.ID ".$order." "; elseif ($by == "student_id") $arSqlOrder[] = " G.STUDENT_ID ".$order." "; elseif ($by == "test_id") $arSqlOrder[] = " G.TEST_ID ".$order." "; elseif ($by == "completed") $arSqlOrder[] = " G.COMPLETED ".$order." "; elseif ($by == "result") $arSqlOrder[] = " G.RESULT ".$order." "; elseif ($by == "max_result") $arSqlOrder[] = " G.MAX_RESULT ".$order." "; elseif ($by == "user_name") $arSqlOrder[] = " USER_NAME ".$order." "; elseif ($by == "test_name") $arSqlOrder[] = " TEST_NAME ".$order." "; else $arSqlOrder[] = " G.ID ".$order." "; } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); for ($i=0, $len = count($arSqlOrder); $i < $len; $i++) { if($i==0) $strSqlOrder = " ORDER BY "; else $strSqlOrder .= ","; $strSqlOrder .= $arSqlOrder[$i]; } $strSql .= $strSqlOrder; if (is_array($arNavParams) && ( ! empty($arNavParams) ) ) { if (isset($arNavParams['nTopCount']) && ((int) $arNavParams['nTopCount'] > 0)) { $strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']); $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } else { $res_cnt = $DB->Query("SELECT COUNT(G.ID) as C " . $strSqlFrom); $res_cnt = $res_cnt->fetch(); $res = new CDBResult(); $res->NavQuery($strSql, $res_cnt['C'], $arNavParams); } } else $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); return $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } /** * This function is for internal use only. * It can be changed without any notification. * This is for MSSQL/Oracle. MySQL version of SQL-code redefined in ../mysql/gradebook.php * * @access private */ protected static function __getSqlFromClause($SqlSearchLang) { $strSqlFrom = "FROM b_learn_gradebook G ". "INNER JOIN b_learn_test T ON G.TEST_ID = T.ID ". "INNER JOIN b_user U ON U.ID = G.STUDENT_ID ". "LEFT JOIN b_learn_course C ON C.ID = T.COURSE_ID ". "LEFT JOIN b_learn_lesson TUL ON TUL.ID = C.LINKED_LESSON_ID ". "LEFT JOIN b_learn_test_mark TM ON G.TEST_ID = TM.TEST_ID ". "WHERE (TM.SCORE IS NULL OR TM.SCORE = ( SELECT MIN(SCORE) AS SCORE FROM b_learn_test_mark WHERE TEST_ID = G.TEST_ID AND SCORE >= CASE WHEN G.MAX_RESULT > 0 THEN (G.RESULT/G.MAX_RESULT*100) ELSE 0 END ) ) ". (strlen($SqlSearchLang)<=2?"": "AND EXISTS ( SELECT 'x' FROM b_learn_course_site CS WHERE C.ID = CS.COURSE_ID AND CS.SITE_ID IN (".$SqlSearchLang.") ) " ); return ($strSqlFrom); } }