%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/learning/classes/general/ |
Current File : //home/bitrix/www/bitrix/modules/learning/classes/general/certification.php |
<? // 2012-04-10 Checked/modified for compatibility with new data model class CAllCertification { public static function LessonIdByCertId ($certId) { $rc = CCertification::GetByID($certId); if ($rc === false) throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP); $row = $rc->Fetch(); if ( ! isset($row['COURSE_ID']) ) throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP); $lessonId = CCourse::CourseGetLinkedLesson($row['COURSE_ID']); if ($lessonId === false) throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP); return ($lessonId); } // 2012-04-10 Checked/modified for compatibility with new data model 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, "COURSE_ID")) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_COURSE_ID"), "ERROR_EMPTY_COURSE_ID"); return false; } elseif (is_set($arFields, "COURSE_ID")) { if ($bCheckRights) $r = CCourse::GetByID($arFields["COURSE_ID"]); else $r = CCourse::GetList(Array(),Array("ID" => $arFields["COURSE_ID"], 'CHECK_PERMISSIONS' => 'N')); if(!$r->Fetch()) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_COURSE_ID_EX"), "ERROR_NO_COURSE_ID"); return false; } } if (is_set($arFields, "STUDENT_ID") && is_set($arFields, "COURSE_ID")) { $res = CCertification::GetList(Array(), Array("STUDENT_ID" => $arFields["STUDENT_ID"], "COURSE_ID" => $arFields["COURSE_ID"])); if ($res->Fetch()) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_CERTIFICATE_DUPLICATE"), "ERROR_CERTIFICATE_DUPLICATE"); return false; } } if (is_set($arFields, "DATE_CREATE") && (!$DB->IsDate($arFields["DATE_CREATE"], false, LANG, "FULL"))) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_DATE_CREATE"), "EMPTY_DATE_CREATE"); return false; } if (is_set($arFields, "PUBLIC_PROFILE") && $arFields["PUBLIC"] != "N") $arFields["PUBLIC_PROFILE"] = "Y"; if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "N") $arFields["ACTIVE"] = "Y"; if (is_set($arFields, "FROM_ONLINE") && $arFields["FROM_ONLINE"] != "N") $arFields["FROM_ONLINE"] = "Y"; return true; } // 2012-04-10 Checked/modified for compatibility with new data model function Add($arFields, $arParams = array()) { global $DB; $bCheckRights = true; if (isset($arParams['CHECK_PERMISSIONS']) && ($arParams['CHECK_PERMISSIONS'] === 'N')) $bCheckRights = false; if(CCertification::CheckFields($arFields, false, $bCheckRights)) { unset($arFields["ID"]); CLearnHelper::FireEvent('OnBeforeCertificateAdd', $arFields); $ID = $DB->Add("b_learn_certification", $arFields, Array(), "learning"); $arFields['ID'] = $ID; CLearnHelper::FireEvent('OnAfterCertificateAdd', $arFields); return $ID; } return false; } // 2012-04-10 Checked/modified for compatibility with new data model function Update($ID, $arFields, $arParams = array()) { global $DB; $ID = intval($ID); if ($ID < 1) return false; $bCheckRights = true; if (isset($arParams['CHECK_PERMISSIONS']) && ($arParams['CHECK_PERMISSIONS'] === 'N')) $bCheckRights = false; if (CCertification::CheckFields($arFields, $ID, $bCheckRights)) { unset($arFields["ID"]); unset($arFields["STUDENT_ID"]); unset($arFields["COURSE_ID"]); $arBinds=Array( //""=>$arFields[""] ); CLearnHelper::FireEvent('OnBeforeCertificateUpdate', $arFields); $strUpdate = $DB->PrepareUpdate("b_learn_certification", $arFields, "learning"); $strSql = "UPDATE b_learn_certification SET ".$strUpdate." WHERE ID=".$ID; $DB->QueryBind($strSql, $arBinds, false, "File: ".__FILE__."<br>Line: ".__LINE__); CLearnHelper::FireEvent('OnAfterCertificateUpdate', $arFields); return true; } return false; } // 2012-04-10 Checked/modified for compatibility with new data model function Delete($ID) { global $DB; $ID = intval($ID); if ($ID < 1) return false; CLearnHelper::FireEvent('OnBeforeCertificateDelete', $ID); $strSql = "SELECT G.ID FROM b_learn_certification C INNER JOIN b_learn_test T ON C.COURSE_ID = T.COURSE_ID INNER JOIN b_learn_gradebook G ON (G.TEST_ID = T.ID AND G.STUDENT_ID = C.STUDENT_ID) WHERE C.ID = ".$ID; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); //Gradebook while($arRecord = $res->Fetch()) { if(!CGradeBook::Delete($arRecord["ID"])) return false; } $strSql = "DELETE FROM b_learn_certification WHERE ID = ".$ID; if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__)) return false; CLearnHelper::FireEvent('OnAfterCertificateDelete', $ID); return true; } // 2012-04-10 Checked/modified for compatibility with new data model 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 "COURSE_ID": case "SORT": case "SUMMARY": case "MAX_SUMMARY": $arSqlSearch[] = CLearnHelper::FilterCreate("CER.".$key, $val, "number", $bFullJoin, $cOperationType); break; case "ACTIVE": case "PUBLIC_PROFILE": case "FROM_ONLINE": $arSqlSearch[] = CLearnHelper::FilterCreate("CER.".$key, $val, "string_equal", $bFullJoin, $cOperationType); break; case "TIMESTAMP_X": case "DATE_CREATE": $arSqlSearch[] = CLearnHelper::FilterCreate("CER.".$key, $val, "date", $bFullJoin, $cOperationType); break; case "USER": $arSqlSearch[] = GetFilterQuery("U.ID, U.LOGIN, U.NAME, U.LAST_NAME",$val); break; } } return $arSqlSearch; } // 2012-04-10 Checked/modified for compatibility with new data model function GetByID($ID) { return CCertification::GetList(Array(),Array("ID" => $ID)); } // 2012-04-10 Checked/modified for compatibility with new data model public static function IsCourseCompleted($STUDENT_ID, $COURSE_ID) { global $DB; $STUDENT_ID = intval($STUDENT_ID); $COURSE_ID = intval($COURSE_ID); if ($STUDENT_ID < 1 || $COURSE_ID < 1) return false; $strSql = " SELECT COUNT(*) CNT_ALL, SUM(CASE WHEN G.COMPLETED = 'Y' THEN 1 ELSE 0 END ) CNT_COMPLETED FROM b_learn_test T INNER JOIN b_learn_course C ON T.COURSE_ID = C.ID INNER JOIN b_learn_lesson TUL ON C.LINKED_LESSON_ID = TUL.ID LEFT JOIN b_learn_gradebook G ON T.ID = G.TEST_ID AND G.STUDENT_ID = '".$STUDENT_ID."' WHERE T.COURSE_ID = '".$COURSE_ID."' AND TUL.ACTIVE = 'Y' AND T.ACTIVE = 'Y' "; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); $cntAll = $cntCompleted = null; $isCourseCompleted = false; // can be overrided below if ( ($ar = $res->Fetch()) && intval($ar["CNT_ALL"]) > 0) { $cntAll = $ar['CNT_ALL']; $cntCompleted = $ar['CNT_COMPLETED']; if ($cntCompleted == $cntAll) $isCourseCompleted = true; } $arEventData = array( 'STUDENT_ID' => $STUDENT_ID, 'COURSE_ID' => $COURSE_ID, 'CNT_ALL' => $cntAll, 'CNT_COMPLETED' => $cntCompleted ); foreach(GetModuleEvents('learning', 'OnCheckCourseCompleted', true) as $arEvent) { $rc = ExecuteModuleEventEx($arEvent, array($arEventData)); if ($rc === false) { $isCourseCompleted = false; break; } elseif ($rc === true) { $isCourseCompleted = true; break; } } return $isCourseCompleted; } // 2012-04-10 Checked/modified for compatibility with new data model function Certificate($STUDENT_ID, $COURSE_ID, $checkPerms = true) { global $DB; $STUDENT_ID = intval($STUDENT_ID); $COURSE_ID = intval($COURSE_ID); if ($STUDENT_ID < 1 || $COURSE_ID < 1) return false; if (CCertification::IsCourseCompleted($STUDENT_ID, $COURSE_ID)) { $strSql = "SELECT SUM(G.RESULT) CNT, SUM(G.MAX_RESULT) MAX_CNT FROM b_learn_gradebook G INNER JOIN b_learn_test T ON T.ID = G.TEST_ID WHERE G.COMPLETED = 'Y' AND G.STUDENT_ID = '".$STUDENT_ID."' AND T.COURSE_ID = '".$COURSE_ID."'"; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); $SUMMARY = $MAX_SUMMARY = 0; if ($ar = $res->Fetch()) { $SUMMARY = $ar["CNT"]; $MAX_SUMMARY = $ar["MAX_CNT"]; } $arFields = array( 'STUDENT_ID' => $STUDENT_ID, 'COURSE_ID' => $COURSE_ID, 'SUMMARY' => &$SUMMARY, 'MAX_SUMMARY' => &$MAX_SUMMARY ); foreach(GetModuleEvents('learning', 'OnBeforeCertificate', true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array(&$arFields))===false) return (false); } $arParams = array(); if ( ! $checkPerms ) $arParams['CHECK_PERMISSIONS'] = 'N'; $strSql = "SELECT ID FROM b_learn_certification WHERE STUDENT_ID = '".$STUDENT_ID."' AND COURSE_ID = '".$COURSE_ID."'"; $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($ar = $res->Fetch()) { return CCertification::Update($ar["ID"], Array("SUMMARY" => $SUMMARY, "MAX_SUMMARY" => $MAX_SUMMARY, "ACTIVE" => "Y"), $arParams); } else { $arFields = Array( "STUDENT_ID" => $STUDENT_ID, "COURSE_ID" => $COURSE_ID, "SUMMARY" => $SUMMARY, "MAX_SUMMARY" => $MAX_SUMMARY, "~DATE_CREATE" => CDatabase::CurrentTimeFunction(), ); $ID = CCertification::Add($arFields, $arParams); return ($ID > 0); } } return false; } }