Example #1
0
 /**
  * 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));
Example #3
0
    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"]);
    }
Example #4
0
 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;
 }
Example #5
0
 /**
  * <p>Возвращает список сертификатов по фильтру <b>arFilter</b>, отсортированный в порядке <b>arOrder</b>. Учитываются права доступа текущего пользователя.</p>
  *
  *
  * @param array $arrayarOrder = Array("ID"=>"DESC") Массив для сортировки результата. Массив вида <i>array("поле
  * сортировки"=&gt;"направление сортировки" [, ...])</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("фильтруемое поле"=&gt;"значение фильтра" [, ...])</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>"&lt;" - меньше </li> <li>"&lt;=" - меньше либо равно </li> <li>"&gt;" - больше
  * </li> <li>"&gt;=" - больше либо равно </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>
  * &lt;?<br>if (CModule::IncludeModule("learning"))<br>{<br>    $COURSE_ID = 100;<br>    $res = CCertification::GetList(<br>        Array("SUMMARY" =&gt; "DESC", "SORT"=&gt;"ASC"), <br>        Array("ACTIVE" =&gt; "Y", "COURSE_ID" =&gt; $COURSE_ID)<br>    );<br><br>    while ($arCertification = $res-&gt;GetNext())<br>    {<br>        echo "User:"******"USER_NAME"].<br>             "; Course name: ".$arCertification["COURSE_NAME"]."&lt;br&gt;";<br>    }<br>}<br>?&gt;&lt;?<br>if (CModule::IncludeModule("learning"))<br>{<br>    $COURSE_ID = 100;<br>    $res = CCertification::GetList(<br>        Array("SUMMARY" =&gt; "DESC", "SORT"=&gt;"ASC"), <br>        Array("ACTIVE" =&gt; "Y", "CHECK_PERMISSIONS" =&gt; "N")<br>    );<br><br>    while ($arCertification = $res-&gt;GetNext())<br>    {<br>        echo "User:"******"USER_NAME"].<br>             "; Course name: ".$arCertification["COURSE_NAME"]."&lt;br&gt;";<br>    }<br>}<br>?&gt;
  * </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;
 }
Example #6
0
 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;
 }
Example #7
0
 /**
  * <p>Метод удаляет учётную запись студента с кодом пользователя USER_ID.</p>
  *
  *
  * @param int $USER_ID  Код пользователя. </h
  *
  * @return bool <p>Метод возвращает <i>true</i> в случае успешного удаления учётной
  * записи студента, в противном случае возвращает <i>false</i>.</p>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * if (CModule::IncludeModule("learning"))
  * {
  *     $USER_ID = 3;
  *     if ($USER-&gt;IsAdmin())
  *     {
  *         @set_time_limit(0);
  *         $DB-&gt;StartTransaction();
  *         if (!CStudent::Delete($USER_ID))
  *         {
  *             echo "Error!";
  *             $DB-&gt;Rollback();
  *         }
  *         else
  *             $DB-&gt;Commit();
  *     }
  * }
  * ?&gt;
  * </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;
 }
Example #8
0
 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;
     }
 }
Example #9
0
}
//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;
Example #11
0
	/**
	 * <p>Добавляет или изменяет сертификат, если курс был пройден.</p>
	 *
	 *
	 *
	 *
	 * @param int $STUDENT_ID  Идентификатор студента.
	 *
	 *
	 *
	 * @param int $COURSE_ID  Идентификатор курса.
	 *
	 *
	 *
	 * @return bool <p>Метод возвращает <i>true</i>, если сертификация прошла успешно,
	 * иначе - <i>false</i>.</p>
	 *
	 *
	 * <h4>Example</h4> 
	 * <pre>
	 * &lt;?<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>?&gt;
	 * </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;
	}
Example #12
0
	/**
	 * <p>Возвращает список сертификатов по фильтру <b>arFilter</b>, отсортированный в порядке <b>arOrder</b>. Учитываются права доступа текущего пользователя.</p>
	 *
	 *
	 *
	 *
	 * @param array $arrayarOrder = Array("ID"=>"DESC") Массив для сортировки результата. Массив вида <i>array("поле
	 * сортировки"=&gt;"направление сортировки" [, ...])</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("фильтруемое поле"=&gt;"значение фильтра" [, ...])</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>"&lt;" - меньше </li> <li>"&lt;=" - меньше либо равно </li> <li>"&gt;" - больше
	 * </li> <li>"&gt;=" - больше либо равно </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>
	 * &lt;?<br>if (CModule::IncludeModule("learning"))<br>{<br>    $COURSE_ID = 100;<br>    $res = CCertification::GetList(<br>        Array("SUMMARY" =&gt; "DESC", "SORT"=&gt;"ASC"), <br>        Array("ACTIVE" =&gt; "Y", "COURSE_ID" =&gt; $COURSE_ID)<br>    );<br><br>    while ($arCertification = $res-&gt;GetNext())<br>    {<br>        echo "User:"******"USER_NAME"].<br>             "; Course name: ".$arCertification["COURSE_NAME"]."&lt;br&gt;";<br>    }<br>}<br>?&gt;&lt;?<br>if (CModule::IncludeModule("learning"))<br>{<br>    $COURSE_ID = 100;<br>    $res = CCertification::GetList(<br>        Array("SUMMARY" =&gt; "DESC", "SORT"=&gt;"ASC"), <br>        Array("ACTIVE" =&gt; "Y", "CHECK_PERMISSIONS" =&gt; "N")<br>    );<br><br>    while ($arCertification = $res-&gt;GetNext())<br>    {<br>        echo "User:"******"USER_NAME"].<br>             "; Course name: ".$arCertification["COURSE_NAME"]."&lt;br&gt;";<br>    }<br>}<br>?&gt;
	 * </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__);
	}