/** * WARNING: don't use this method, it's for internal use only * * Convert course to non-course lesson (course will be removed, * but lesson will stay exists) * * WARNING: this method terminates (by die()/exit()) current execution flow * when SQL server error occured. It's due to bug in CDatabase::Update() in main * module (version info: * define("SM_VERSION","11.0.12"); * define("SM_VERSION_DATE","2012-02-21 17:00:00"); // YYYY-MM-DD HH:MI:SS * ) * * @param int $courseId (returned by GetLinkedCourse($lessonId) ) * * @access private */ protected static function CourseBecomeLesson($courseId) { global $DB; self::_EnsureArgsStrictlyCastableToIntegers($courseId); $linkedLessonId = CCourse::CourseGetLinkedLesson($courseId); if ($linkedLessonId === false) { return false; } // Check certificates (if exists => forbid removing course) $certificate = CCertification::GetList(array(), array("COURSE_ID" => $courseId, 'CHECK_PERMISSIONS' => 'N')); if ($certificate === false || $certificate->GetNext()) { return false; } // Remove tests $tests = CTest::GetList(array(), array("COURSE_ID" => $courseId)); if ($tests === false) { return false; } while ($arTest = $tests->Fetch()) { if (!CTest::Delete($arTest["ID"])) { return false; } } // Remove all prohibitions for lessons in context of course to be removed // and remove prohibitions for course to be removed in context of all other courses self::PublishProhibitionPurge($linkedLessonId, self::PUBLISH_PROHIBITION_PURGE_ALL_LESSONS_IN_COURSE_CONTEXT | self::PUBLISH_PROHIBITION_PURGE_LESSON_IN_ALL_COURSE_CONTEXT); $rc = $DB->Query("DELETE FROM b_learn_course\n\t\t\tWHERE ID=" . (string) (int) $courseId, true); // reload cache of LINKED_LESSON_ID -> COURSE_ID self::GetCourseToLessonMap_ReloadCache(); CLearnCacheOfLessonTreeComponent::MarkAsDirty(); /** * This code will be useful after bug in CDatabase::Update() * and CDatabase::Insert() will be solved and $ignore_errors setted * to true in Insert()/Update() call above. */ if ($rc === false) { throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP); } // If data not updated if ($rc === 0) { throw new LearnException('EA_OTHER: data not updated', LearnException::EXC_ERR_ALL_GIVEUP); } }
case "delete": $oAccess = CLearnAccess::GetInstance($USER->GetID()); if (!$oAccess->IsLessonAccessible(CCertification::LessonIdByCertId($ID), CLearnAccess::OP_LESSON_WRITE)) { break; } @set_time_limit(0); $DB->StartTransaction(); if (!CCertification::Delete($ID)) { $DB->Rollback(); $lAdmin->AddGroupError(GetMessage("LEARNING_DELETE_ERROR"), $ID); } $DB->Commit(); break; case "activate": case "deactivate": $cl = new CCertification(); $arFields = array("ACTIVE" => $_REQUEST['action'] == "activate" ? "Y" : "N"); if (!$cl->Update($ID, $arFields)) { if ($e = $APPLICATION->GetException()) { $lAdmin->AddGroupError(GetMessage("SAVE_ERROR") . $ID . ": " . $e->GetString(), $ID); } } break; } } } // fetch data if (isset($_REQUEST["mode"]) && $_REQUEST["mode"] == "excel") { $arNavParams = array(); } else { $arNavParams = array('nPageSize' => CAdminResult::GetNavSize($sTableID));
ShowError(GetMessage("LEARNING_TRANSCRIPT_PERMISSION_DENIED")); return; } //User exists? $res = CUser::GetByID($arStudent["USER_ID"]); if (!($arUser = $res->GetNext())) { ShowError(GetMessage("LEARNING_TRANSCRIPT_ERROR")); return; } //Images $arUser["PERSONAL_PHOTO_ARRAY"] = CFile::GetFileArray($arUser["PERSONAL_PHOTO"]); $arUser["WORK_LOGO_ARRAY"] = CFile::GetFileArray($arUser["WORK_LOGO"]); //Country $arUser["PERSONAL_COUNTRY_NAME"] = GetCountryByID($arUser["PERSONAL_COUNTRY"]); $arResult = array("STUDENT" => $arStudent, "USER" => $arUser, "CERTIFICATES" => array()); $res = CCertification::GetList(array("SORT" => "ASC", "DATE_CREATE" => "ASC"), array("STUDENT_ID" => $arStudent["USER_ID"], "ACTIVE" => "Y", "PUBLIC" => "Y", "CHECK_PERMISSIONS" => "N")); while ($arCertification = $res->GetNext()) { $arCertification["PREVIEW_PICTURE_ARRAY"] = CFile::GetFileArray($arCertification["PREVIEW_PICTURE"]); $arResult["CERTIFICATES"][] = $arCertification; } unset($res); unset($arStudent); unset($arUser); //Set Title $arParams["SET_TITLE"] = $arParams["SET_TITLE"] == "N" ? "N" : "Y"; if ($arParams["SET_TITLE"] == "Y") { if (strlen($arResult["USER"]["LAST_NAME"]) > 0 || strlen($arResult["USER"]["NAME"]) > 0) { $APPLICATION->SetTitle(CUser::FormatName($arParams["NAME_TEMPLATE"], $arResult["USER"])); } else { $APPLICATION->SetTitle($arResult["USER"]["LOGIN"]); }
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\n\t\t\tINNER JOIN b_learn_test T ON T.ID = G.TEST_ID\n\t\t\tWHERE 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; }
/** * <p>Возвращает список сертификатов по фильтру <b>arFilter</b>, отсортированный в порядке <b>arOrder</b>. Учитываются права доступа текущего пользователя.</p> * * * @param array $arrayarOrder = Array("ID"=>"DESC") Массив для сортировки результата. Массив вида <i>array("поле * сортировки"=>"направление сортировки" [, ...])</i>. <br> Поле для * сортировки может принимать значения: <ul> <li> <b>ID</b> - идентификатор * сертификата; </li> <li> <b>STUDENT_ID</b> - идентификатор студента ; </li> <li> * <b>COURSE_ID</b> - идентификатор курса; </li> <li> <b>SUMMARY</b> - cумма баллов, * набранных за прохождение всех тестов курса; </li> <li> <b>MAX_SUMMARY</b> - * максимально возможная сумма баллов за прохождение всех тестов * курса; </li> <li> <b>SORT</b> - индекс сортировки; </li> <li> <b>ACTIVE</b> - фильтр по * активности (Y|N); </li> <li> <b>FROM_ONLINE</b> - сертификат получен через * online-обучение (Y/N); </li> <li> <b>PUBLIC_PROFILE</b> - публиковать сертификат в * профиле (Y/N); </li> <li> <b>DATE_CREATE</b> - дата создания сертификата; </li> <li> * <b>TIMESTAMP_X</b> - дата изменения студента. </li> </ul> Направление * сортировки может принимать значения: <ul> <li> <b>asc</b> - по возрастанию; * </li> <li> <b>desc</b> - по убыванию; </li> </ul> Необязательный. По умолчанию * фильтруется по убыванию идентификатора сертификата. * * @param array $arrayarFilter = Array() Массив вида <i>array("фильтруемое поле"=>"значение фильтра" [, ...])</i>. * Фильтруемое поле может принимать значения: <ul> <li> <b>ID</b> - * идентификатор сертификата; </li> <li> <b>STUDENT_ID</b> - идентификатор * студента ; </li> <li> <b>COURSE_ID</b> - идентификатор курса; </li> <li> <b>SUMMARY</b> - * cумма баллов, набранных за прохождение всех тестов курса; </li> <li> * <b>MAX_SUMMARY</b> - максимально возможная сумма баллов за прохождение * всех тестов курса; </li> <li> <b>SORT</b> - индекс сортировки; </li> <li> <b>ACTIVE</b> - * фильтр по активности (Y|N); </li> <li> <b>FROM_ONLINE</b> - сертификат получен * через online-обучение (Y/N); </li> <li> <b>PUBLIC_PROFILE</b> - публиковать сертификат * в профиле (Y/N); </li> <li> <b>DATE_CREATE</b> - дата создания сертификата; </li> <li> * <b>TIMESTAMP_X</b> - дата изменения студента. </li> <li> <b>USER</b> - пользователь * (возможны сложные условия по полям пользователя ID, LOGIN, NAME, LAST_NAME); * </li> <li> <b>MIN_PERMISSION</b> - минимальный уровень доступа. По умолчанию "R". * Список прав доступа см. в <a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccourse/setpermission.php">CCourse::SetPermission</a>. </li> * <li> <b>CHECK_PERMISSIONS</b> - проверять уровень доступа. Если установлено * значение "N" - права доступа не проверяются. </li> </ul> Перед названием * фильтруемого поля можно указать тип фильтрации: <ul> <li>"!" - не равно * </li> <li>"<" - меньше </li> <li>"<=" - меньше либо равно </li> <li>">" - больше * </li> <li>">=" - больше либо равно </li> </ul> <br> "<i>значения фильтра</i>" - * одиночное значение или массив. <br><br> Необязательный. По умолчанию * записи не фильтруются. * * @return CDBResult <p>Возвращается объект <a * href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a>.</p> </h * * <h4>Example</h4> * <pre> * <?<br>if (CModule::IncludeModule("learning"))<br>{<br> $COURSE_ID = 100;<br> $res = CCertification::GetList(<br> Array("SUMMARY" => "DESC", "SORT"=>"ASC"), <br> Array("ACTIVE" => "Y", "COURSE_ID" => $COURSE_ID)<br> );<br><br> while ($arCertification = $res->GetNext())<br> {<br> echo "User:"******"USER_NAME"].<br> "; Course name: ".$arCertification["COURSE_NAME"]."<br>";<br> }<br>}<br>?><?<br>if (CModule::IncludeModule("learning"))<br>{<br> $COURSE_ID = 100;<br> $res = CCertification::GetList(<br> Array("SUMMARY" => "DESC", "SORT"=>"ASC"), <br> Array("ACTIVE" => "Y", "CHECK_PERMISSIONS" => "N")<br> );<br><br> while ($arCertification = $res->GetNext())<br> {<br> echo "User:"******"USER_NAME"].<br> "; Course name: ".$arCertification["COURSE_NAME"]."<br>";<br> }<br>}<br>?> * </pre> * * * <h4>See Also</h4> * <ul> <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/classes/ccertification/index.php">CCertification</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/getbyid.php">GetByID</a> </li> <li><a * href="http://dev.1c-bitrix.ru/api_help/learning/fields.php">Поля сертификата</a></li> </ul> </ht<a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/getlist.php * @author Bitrix */ public static function GetList($arOrder = array(), $arFilter = array(), $arNavParams = array()) { global $DB; $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); $arSqlSearch = CCertification::GetFilter($arFilter); $strSqlSearch = ""; if (!empty($arSqlSearch)) { $arSqlSearch = array_filter($arSqlSearch); if (!empty($arSqlSearch)) { $strSqlSearch .= ' AND ' . implode(' AND ', $arSqlSearch); } } $strSql = "SELECT CER.*, C.NAME as COURSE_NAME, COURSEOLD.ID as COURSE_ID, " . "COURSEOLD.ACTIVE_FROM as ACTIVE_FROM, COURSEOLD.ACTIVE_TO as ACTIVE_TO, COURSEOLD.RATING as RATING, " . "COURSEOLD.RATING_TYPE as RATING_TYPE, COURSEOLD.SCORM as SCORM, " . $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, " . $DB->DateToCharFunction("CER.TIMESTAMP_X") . " as TIMESTAMP_X, " . $DB->DateToCharFunction("CER.DATE_CREATE") . " as DATE_CREATE "; $strSqlFrom = "FROM b_learn_certification CER " . "INNER JOIN b_learn_course COURSEOLD ON CER.COURSE_ID = COURSEOLD.ID " . "INNER JOIN b_learn_lesson C ON C.ID = COURSEOLD.LINKED_LESSON_ID " . "INNER JOIN b_user U ON U.ID = CER.STUDENT_ID " . "WHERE 1=1 "; if ($oPermParser->IsNeedCheckPerm()) { $strSqlFrom .= " AND C.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSqlFrom .= $strSqlSearch; 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[] = " CER.ID " . $order . " "; } elseif ($by == "student_id") { $arSqlOrder[] = " CER.STUDENT_ID " . $order . " "; } elseif ($by == "course_id") { $arSqlOrder[] = " CER.COURSE_ID " . $order . " "; } elseif ($by == "summary") { $arSqlOrder[] = " CER.SUMMARY " . $order . " "; } elseif ($by == "sort") { $arSqlOrder[] = " CER.SORT " . $order . " "; } elseif ($by == "active") { $arSqlOrder[] = " CER.ACTIVE " . $order . " "; } elseif ($by == "from_online") { $arSqlOrder[] = " CER.FROM_ONLINE " . $order . " "; } elseif ($by == "public") { $arSqlOrder[] = " CER.PUBLIC " . $order . " "; } elseif ($by == "public_profile") { $arSqlOrder[] = " CER.PUBLIC " . $order . " "; } elseif ($by == "date_create") { $arSqlOrder[] = " CER.DATE_CREATE " . $order . " "; } elseif ($by == "summary") { $arSqlOrder[] = " CER.SUMMARY " . $order . " "; } elseif ($by == "max_summary") { $arSqlOrder[] = " CER.MAX_SUMMARY " . $order . " "; } elseif ($by == "timestamp_x") { $arSqlOrder[] = " CER.TIMESTAMP_X " . $order . " "; } else { $arSqlOrder[] = " CER.ID " . $order . " "; } } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); if (!empty($arSqlOrder)) { $strSqlOrder .= " ORDER BY " . implode(', ', $arSqlOrder); } $strSql .= $strSqlFrom . $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(CER.ID) as CNT " . $strSqlFrom, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $res_cnt = $res_cnt->fetch(); $res = new CDBResult(); $rc = $res->NavQuery($strSql, $res_cnt['CNT'], $arNavParams, true); if ($rc === false) { throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP); } } } else { $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } return $res; }
function OnAttemptChange($ATTEMPT_ID, $bCOMPLETED = false) { global $DB; $ATTEMPT_ID = intval($ATTEMPT_ID); if ($ATTEMPT_ID < 1) { return false; } $strSql = "SELECT A.*, T.APPROVED, T.COMPLETED_SCORE, T.COURSE_ID " . "FROM b_learn_attempt A " . "INNER JOIN b_learn_test T ON A.TEST_ID = T.ID " . "WHERE A.ID = '" . $ATTEMPT_ID . "' AND A.STATUS = 'F' "; $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (!($arAttempt = $res->Fetch())) { return false; } $COMPLETED = "N"; if ($arAttempt["APPROVED"] == "Y" && intval($arAttempt["COMPLETED_SCORE"]) > 0 && CTestAttempt::IsTestCompleted($ATTEMPT_ID, $arAttempt["COMPLETED_SCORE"])) { $COMPLETED = "Y"; } if ($bCOMPLETED) { $COMPLETED = "Y"; } $strSql = "UPDATE b_learn_attempt SET COMPLETED = '" . $COMPLETED . "' " . "WHERE ID = '" . $ATTEMPT_ID . "'"; if (!($res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__))) { return false; } $strSql = "SELECT * FROM b_learn_gradebook WHERE STUDENT_ID='" . $arAttempt["STUDENT_ID"] . "' AND TEST_ID='" . $arAttempt["TEST_ID"] . "'"; $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (!($arGradeBook = $res->Fetch())) { $arFields = array("STUDENT_ID" => $arAttempt["STUDENT_ID"], "TEST_ID" => $arAttempt["TEST_ID"], "RESULT" => $arAttempt["SCORE"], "MAX_RESULT" => intval($arAttempt["MAX_SCORE"]), "COMPLETED" => $COMPLETED); $at = new CGradeBook(); if (!($res = $at->Add($arFields))) { return false; } CCertification::Certificate($arAttempt["STUDENT_ID"], $arAttempt["COURSE_ID"]); } else { $strSql = "SELECT A.SCORE, A.MAX_SCORE FROM b_learn_attempt A " . "WHERE A.STUDENT_ID = '" . $arAttempt["STUDENT_ID"] . "' AND A.TEST_ID = '" . $arAttempt["TEST_ID"] . "' ORDER BY COMPLETED DESC, SCORE DESC"; //AND A.COMPLETED = 'Y' $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (!($arMaxScore = $res->Fetch())) { return false; } if ($arGradeBook["COMPLETED"] == "Y") { $COMPLETED = "Y"; } $strSql = "UPDATE b_learn_gradebook SET RESULT = '" . intval($arMaxScore["SCORE"]) . "', MAX_RESULT = '" . intval($arMaxScore["MAX_SCORE"]) . "',COMPLETED = '" . $COMPLETED . "' " . "WHERE ID = '" . $arGradeBook["ID"] . "'"; if (!($res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__))) { return false; } CCertification::Certificate($arAttempt["STUDENT_ID"], $arAttempt["COURSE_ID"]); } return true; }
/** * <p>Метод удаляет учётную запись студента с кодом пользователя USER_ID.</p> * * * @param int $USER_ID Код пользователя. </h * * @return bool <p>Метод возвращает <i>true</i> в случае успешного удаления учётной * записи студента, в противном случае возвращает <i>false</i>.</p> * * <h4>Example</h4> * <pre> * <? * if (CModule::IncludeModule("learning")) * { * $USER_ID = 3; * if ($USER->IsAdmin()) * { * @set_time_limit(0); * $DB->StartTransaction(); * if (!CStudent::Delete($USER_ID)) * { * echo "Error!"; * $DB->Rollback(); * } * else * $DB->Commit(); * } * } * ?> * </pre> * * * <h4>See Also</h4> * <ul><li> <a href="http://dev.1c-bitrix.ru/api_help/learning/classes/cstudent/index.php">CStudent</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/cstudent/add.php">Add</a> </li></ul><a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/cstudent/delete.php * @author Bitrix */ public static function Delete($ID) { global $DB; $ID = intval($ID); if ($ID < 1) { return false; } CLearnHelper::FireEvent('OnBeforeStudentDelete', $ID); //Certification $records = CCertification::GetList(array(), array("STUDENT_ID" => $ID)); while ($arRecord = $records->Fetch()) { if (!CCertification::Delete($arRecord["ID"])) { return false; } } $strSql = "DELETE FROM b_learn_student WHERE USER_ID = " . $ID; if (!$DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__)) { return false; } CLearnHelper::FireEvent('OnAfterStudentDelete', $ID); return true; }
public static function IsCertificatesExists($courseId) { // Check certificates (if exists => forbid removing course) $certificate = CCertification::GetList(array(), array("COURSE_ID" => $courseId, 'CHECK_PERMISSIONS' => 'N')); if ($certificate === false || $certificate->GetNext()) { return true; } else { return false; } }
} //Authorized? if (!$USER->IsAuthorized()) { $APPLICATION->AuthForm(GetMessage("LEARNING_NO_AUTHORIZE")); } //Module if (!CModule::IncludeModule("learning")) { ShowError(GetMessage("LEARNING_MODULE_NOT_FOUND")); return; } //Params $arParams["TESTS_LIST_TEMPLATE"] = strlen($arParams["TESTS_LIST_TEMPLATE"]) > 0 ? htmlspecialcharsbx($arParams["TESTS_LIST_TEMPLATE"]) : "course/test_list.php?COURSE_ID=#COURSE_ID#"; $arParams["COURSE_DETAIL_TEMPLATE"] = strlen($arParams["COURSE_DETAIL_TEMPLATE"]) > 0 ? htmlspecialcharsbx($arParams["COURSE_DETAIL_TEMPLATE"]) : "course/index.php?COURSE_ID=#COURSE_ID#"; $arResult = array("COURSES" => array(), "CERTIFICATES" => array()); //Certificates $rsCertificate = CCertification::GetList(array("ID" => "DESC"), array("STUDENT_ID" => intval($USER->GetID()), "ACTIVE" => "Y")); while ($arCertificate = $rsCertificate->GetNext()) { $arResult["CERTIFICATES"][$arCertificate["COURSE_ID"]] = $arCertificate; } //Courses $rsCourse = CCourse::GetList(array("SORT" => "ASC"), array("ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "SITE_ID" => LANG)); while ($arCourse = $rsCourse->GetNext()) { //Test list Url $arCourse["TESTS_LIST_URL"] = CComponentEngine::MakePathFromTemplate($arParams["TESTS_LIST_TEMPLATE"], array("COURSE_ID" => $arCourse["ID"])); //Course Url $arCourse["COURSE_DETAIL_URL"] = CComponentEngine::MakePathFromTemplate($arParams["COURSE_DETAIL_TEMPLATE"], array("COURSE_ID" => $arCourse["ID"])); $arCourse["COMPLETED"] = array_key_exists($arCourse["ID"], $arResult["CERTIFICATES"]); if (!$arCourse["COMPLETED"]) { $rsTest = CTest::GetList(array(), array("COURSE_ID" => $arCourse["ID"], "ACTIVE" => "Y", 'CHECK_PERMISSIONS' => 'N')); $rsTest->NavStart(1); $arCourse["NO_TESTS"] = !$rsTest->SelectedRowsCount();
continue; } $res = CGradeBook::GetByID($ID); if (!($ar = $res->Fetch())) { continue; } $DB->StartTransaction(); $ID = IntVal($ID); $ob = new CGradeBook(); if (!$ob->Update($ID, $arFields)) { if ($e = $APPLICATION->GetException()) { $lAdmin->AddUpdateError(GetMessage("SAVE_ERROR") . $ID . ": " . $e->GetString(), $ID); $DB->Rollback(); } } else { CCertification::Certificate($ar["STUDENT_ID"], $ar["COURSE_ID"]); } $DB->Commit(); } } // group and single actions processing if ($arID = $lAdmin->GroupAction()) { if ($_REQUEST['action_target'] == 'selected') { $rsData = CGradeBook::GetList(array($by => $order), $arFilter); while ($arRes = $rsData->Fetch()) { $arID[] = $arRes['ID']; } } foreach ($arID as $ID) { if (strlen($ID) <= 0) { continue;
/** * <p>Добавляет или изменяет сертификат, если курс был пройден.</p> * * * * * @param int $STUDENT_ID Идентификатор студента. * * * * @param int $COURSE_ID Идентификатор курса. * * * * @return bool <p>Метод возвращает <i>true</i>, если сертификация прошла успешно, * иначе - <i>false</i>.</p> * * * <h4>Example</h4> * <pre> * <?<br>if (CModule::IncludeModule("learning"))<br>{<br> $STUDENT_ID = 1;<br> $COURSE_ID = 92;<br><br> $done = CCertification::Certificate($STUDENT_ID, $COURSE_ID);<br><br> if ($done)<br> echo "Success!";<br> else<br> echo "Course is not completed";<br>}<br>?> * </pre> * * * * <h4>See Also</h4> * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/index.php">CCertification</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/add.php">Add</a> </li> <li> <a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/index.php">CCertification</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/update.php">Update</a> </li> <li> <a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ctest/index.php">CTest</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ctest/getlist.php">GetList</a> </li> <li> <a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/cgradebook/index.php">CGradeBook</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/cgradebook/getlist.php">GetList</a> </li> </ul><a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/certificate.php * @author Bitrix */ public static function Certificate($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; 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"]; } $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") ); } 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); return ($ID > 0); } } return false; }
/** * <p>Возвращает список сертификатов по фильтру <b>arFilter</b>, отсортированный в порядке <b>arOrder</b>. Учитываются права доступа текущего пользователя.</p> * * * * * @param array $arrayarOrder = Array("ID"=>"DESC") Массив для сортировки результата. Массив вида <i>array("поле * сортировки"=>"направление сортировки" [, ...])</i>. <br> Поле для * сортировки может принимать значения: <ul> <li> <b>ID</b> - идентификатор * сертификата; </li> <li> <b>STUDENT_ID</b> - идентификатор студента ; </li> <li> * <b>COURSE_ID</b> - идентификатор курса; </li> <li> <b>SUMMARY</b> - cумма баллов, * набранных за прохождение всех тестов курса; </li> <li> <b>MAX_SUMMARY</b> - * максимально возможная сумма баллов за прохождение всех тестов * курса; </li> <li> <b>SORT</b> - индекс сортировки; </li> <li> <b>ACTIVE</b> - фильтр по * активности (Y|N); </li> <li> <b>FROM_ONLINE</b> - сертификат получен через * online-обучение (Y/N); </li> <li> <b>PUBLIC_PROFILE</b> - публиковать сертификат в * профиле (Y/N); </li> <li> <b>DATE_CREATE</b> - дата создания сертификата; </li> <li> * <b>TIMESTAMP_X</b> - дата изменения студента. </li> </ul> Направление * сортировки может принимать значения: <ul> <li> <b>asc</b> - по возрастанию; * </li> <li> <b>desc</b> - по убыванию; </li> </ul> Необязательный. По умолчанию * фильтруется по убыванию идентификатора сертификата. * * * * @param array $arrayarFilter = Array() Массив вида <i>array("фильтруемое поле"=>"значение фильтра" [, ...])</i>. * Фильтруемое поле может принимать значения: <ul> <li> <b>ID</b> - * идентификатор сертификата; </li> <li> <b>STUDENT_ID</b> - идентификатор * студента ; </li> <li> <b>COURSE_ID</b> - идентификатор курса; </li> <li> <b>SUMMARY</b> - * cумма баллов, набранных за прохождение всех тестов курса; </li> <li> * <b>MAX_SUMMARY</b> - максимально возможная сумма баллов за прохождение * всех тестов курса; </li> <li> <b>SORT</b> - индекс сортировки; </li> <li> <b>ACTIVE</b> - * фильтр по активности (Y|N); </li> <li> <b>FROM_ONLINE</b> - сертификат получен * через online-обучение (Y/N); </li> <li> <b>PUBLIC_PROFILE</b> - публиковать сертификат * в профиле (Y/N); </li> <li> <b>DATE_CREATE</b> - дата создания сертификата; </li> <li> * <b>TIMESTAMP_X</b> - дата изменения студента. </li> <li> <b>USER</b> - пользователь * (возможны сложные условия по полям пользователя ID, LOGIN, NAME, LAST_NAME); * </li> <li> <b>MIN_PERMISSION</b> - минимальный уровень доступа. По умолчанию "R". * Список прав доступа см. в <a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccourse/setpermission.php">CCourse::SetPermission</a>. </li> * <li> <b>CHECK_PERMISSIONS</b> - проверять уровень доступа. Если установлено * значение "N" - права доступа не проверяются. </li> </ul> Перед названием * фильтруемого поля может указать тип фильтрации: <ul> <li>"!" - не равно * </li> <li>"<" - меньше </li> <li>"<=" - меньше либо равно </li> <li>">" - больше * </li> <li>">=" - больше либо равно </li> </ul> <br> "<i>значения фильтра</i>" - * одиночное значение или массив. <br><br> Необязательный. По умолчанию * записи не фильтруются. * * * * @return CDBResult <p>Возвращается объект <a * href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a>.</p> * * * <h4>Example</h4> * <pre> * <?<br>if (CModule::IncludeModule("learning"))<br>{<br> $COURSE_ID = 100;<br> $res = CCertification::GetList(<br> Array("SUMMARY" => "DESC", "SORT"=>"ASC"), <br> Array("ACTIVE" => "Y", "COURSE_ID" => $COURSE_ID)<br> );<br><br> while ($arCertification = $res->GetNext())<br> {<br> echo "User:"******"USER_NAME"].<br> "; Course name: ".$arCertification["COURSE_NAME"]."<br>";<br> }<br>}<br>?><?<br>if (CModule::IncludeModule("learning"))<br>{<br> $COURSE_ID = 100;<br> $res = CCertification::GetList(<br> Array("SUMMARY" => "DESC", "SORT"=>"ASC"), <br> Array("ACTIVE" => "Y", "CHECK_PERMISSIONS" => "N")<br> );<br><br> while ($arCertification = $res->GetNext())<br> {<br> echo "User:"******"USER_NAME"].<br> "; Course name: ".$arCertification["COURSE_NAME"]."<br>";<br> }<br>}<br>?> * </pre> * * * * <h4>See Also</h4> * <ul> <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/classes/ccertification/index.php">CCertification</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/getbyid.php">GetByID</a> </li> <li><a * href="http://dev.1c-bitrix.ru/api_help/learning/fields.php">Поля сертификата</a></li> </ul><a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ccertification/getlist.php * @author Bitrix */ public static function GetList($arOrder=Array(), $arFilter=Array()) { global $DB, $USER, $APPLICATION; $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter); $arSqlSearch = CCertification::GetFilter($arFilter); $strSqlSearch = ""; for($i=0; $i<count($arSqlSearch); $i++) if(strlen($arSqlSearch[$i])>0) $strSqlSearch .= " AND ".$arSqlSearch[$i]." "; $strSql = "SELECT DISTINCT C.*, CER.*, C.NAME as COURSE_NAME, COURSEOLD.ID as COURSE_ID, " . "COURSEOLD.ACTIVE_FROM as ACTIVE_FROM, COURSEOLD.ACTIVE_TO as ACTIVE_TO, COURSEOLD.RATING as RATING, " . "COURSEOLD.RATING_TYPE as RATING_TYPE, COURSEOLD.SCORM as SCORM, " . $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, ". $DB->DateToCharFunction("CER.TIMESTAMP_X")." as TIMESTAMP_X, ". $DB->DateToCharFunction("CER.DATE_CREATE")." as DATE_CREATE ". "FROM b_learn_certification CER ". "INNER JOIN b_learn_course COURSEOLD ON CER.COURSE_ID = COURSEOLD.ID ". "INNER JOIN b_learn_lesson C ON C.ID = COURSEOLD.LINKED_LESSON_ID ". "INNER JOIN b_user U ON U.ID = CER.STUDENT_ID ". "WHERE 1=1 "; if ($oPermParser->IsNeedCheckPerm()) $strSql .= " AND C.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; $strSql .= $strSqlSearch; /* was: $bCheckPerm = ($APPLICATION->GetUserRight("learning") < "W" && !$USER->IsAdmin() && $arFilter["CHECK_PERMISSIONS"] != "N"); $strSql = "SELECT DISTINCT C.*, CER.*, C.NAME as COURSE_NAME, COURSEOLD.ID as COURSE_ID, " . "COURSEOLD.ACTIVE_FROM as ACTIVE_FROM, COURSEOLD.ACTIVE_TO as ACTIVE_TO, COURSEOLD.RATING as RATING, " . "COURSEOLD.RATING_TYPE as RATING_TYPE, COURSEOLD.SCORM as SCORM, " . $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, ". $DB->DateToCharFunction("CER.TIMESTAMP_X")." as TIMESTAMP_X, ". $DB->DateToCharFunction("CER.DATE_CREATE")." as DATE_CREATE ". "FROM b_learn_certification CER ". "INNER JOIN b_learn_course COURSEOLD ON CER.COURSE_ID = COURSEOLD.ID ". "INNER JOIN b_learn_lesson C ON C.ID = COURSEOLD.LINKED_LESSON_ID ". "INNER JOIN b_user U ON U.ID = CER.STUDENT_ID ". ($bCheckPerm ? "LEFT JOIN b_learn_course_permission CP ON CP.COURSE_ID = COURSEOLD.ID " : ""). "WHERE 1=1 ". (!$bCheckPerm?"": "AND CP.USER_GROUP_ID IN (".$USER->GetGroups().") ". "AND CP.PERMISSION >= '".(strlen($arFilter["MIN_PERMISSION"])==1 ? $arFilter["MIN_PERMISSION"] : "R")."' ". "AND (CP.PERMISSION='X' OR C.ACTIVE='Y')" ). $strSqlSearch; */ 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[] = " CER.ID ".$order." "; elseif ($by == "student_id") $arSqlOrder[] = " CER.STUDENT_ID ".$order." "; elseif ($by == "course_id") $arSqlOrder[] = " CER.COURSE_ID ".$order." "; elseif ($by == "sort") $arSqlOrder[] = " CER.SORT ".$order." "; elseif ($by == "active") $arSqlOrder[] = " CER.ACTIVE ".$order." "; elseif ($by == "from_online") $arSqlOrder[] = " CER.FROM_ONLINE ".$order." "; elseif ($by == "public_profile") $arSqlOrder[] = " CER.PUBLIC ".$order." "; elseif ($by == "date_create") $arSqlOrder[] = " CER.DATE_CREATE ".$order." "; elseif ($by == "summary") $arSqlOrder[] = " CER.SUMMARY ".$order." "; elseif ($by == "max_summary")$arSqlOrder[] = " CER.MAX_SUMMARY ".$order." "; elseif ($by == "timestamp_x") $arSqlOrder[] = " CER.TIMESTAMP_X ".$order." "; else { $arSqlOrder[] = " CER.ID ".$order." "; $by = "id"; } } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); for ($i=0; $i<count($arSqlOrder); $i++) { if($i==0) $strSqlOrder = " ORDER BY "; else $strSqlOrder .= ","; $strSqlOrder .= $arSqlOrder[$i]; } $strSql .= $strSqlOrder; //echo $strSql; return $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); }