final protected static function _GetListSQLFormer ($sSelect, $obUserFieldsSql, $bCheckPerm, $USER, $arFilter, $strSqlSearch) { $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter); $strSql = "SELECT DISTINCT ". $sSelect." ". $obUserFieldsSql->GetSelect()." ". "FROM b_learn_attempt A ". "INNER JOIN b_learn_test T ON A.TEST_ID = T.ID ". "INNER JOIN b_user U ON U.ID = A.STUDENT_ID ". "LEFT JOIN b_learn_course C ON C.ID = T.COURSE_ID ". "LEFT JOIN b_learn_test_mark TM ON A.TEST_ID = TM.TEST_ID ". $obUserFieldsSql->GetJoin("A.ID") . " WHERE (TM.SCORE IS NULL OR TM.SCORE = (SELECT MIN(SCORE) FROM b_learn_test_mark WHERE SCORE >= CASE WHEN A.STATUS = 'F' THEN 1.0*A.SCORE/A.MAX_SCORE*100 ELSE 0 END AND TEST_ID = A.TEST_ID ) ) "; if ($oPermParser->IsNeedCheckPerm()) $strSql .= " AND C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; $strSql .= $strSqlSearch; return ($strSql); }
protected static final function _GetListSQLFormer($sSelect, $obUserFieldsSql, $bCheckPerm, $USER, $arFilter, $strSqlSearch, &$strSqlFrom) { $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); $strSqlFrom = "FROM b_learn_attempt A " . "INNER JOIN b_learn_test T ON A.TEST_ID = T.ID " . "INNER JOIN b_user U ON U.ID = A.STUDENT_ID " . "LEFT JOIN b_learn_course C ON C.ID = T.COURSE_ID " . "LEFT JOIN b_learn_test_mark TM ON A.TEST_ID = TM.TEST_ID " . $obUserFieldsSql->GetJoin("A.ID") . " WHERE \n\t\t\t(TM.SCORE IS NULL \n\t\t\tOR TM.SCORE = \n\t\t\t\t(SELECT MIN(SCORE) \n\t\t\t\t\tFROM b_learn_test_mark \n\t\t\t\t\tWHERE SCORE >= \n\t\t\t\t\t\tCASE WHEN A.STATUS = 'F' \n\t\t\t\t\t\t\tTHEN 1.0*A.SCORE/A.MAX_SCORE*100 \n\t\t\t\t\t\t\tELSE 0 \n\t\t\t\t\t\tEND \n\t\t\t\t\t\tAND TEST_ID = A.TEST_ID\n\t\t\t\t)\n\t\t\t) "; if ($oPermParser->IsNeedCheckPerm()) { $strSqlFrom .= " AND C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSqlFrom .= $strSqlSearch; $strSql = "SELECT DISTINCT " . $sSelect . " " . $obUserFieldsSql->GetSelect() . " " . $strSqlFrom; return $strSql; }
$arPermissionsParams = array('lesson_id' => $linkedLessonId); $isAccessible = CLearnAccessMacroses::CanUserViewLessonContent($arPermissionsParams, $allowAccessViaLearningGroups = false); } } catch (Exception $e) { $isAccessible = false; // access denied } $arResult['LEARNING_GROUP_ACTIVE_FROM'] = false; $arResult['LEARNING_GROUP_ACTIVE_TO'] = false; $arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'] = false; if (!$isAccessible) { if ($linkedLessonId !== false) { $arGroupsPeriods = CLearnAccessMacroses::getActiveLearningGroupsPeriod($linkedLessonId, $USER->getId()); if ($arGroupsPeriods['IS_EXISTS']) { $isAccessible = true; CLearnParsePermissionsFromFilter::registerAvailableCourse($linkedLessonId); $arResult['LEARNING_GROUP_ACTIVE_FROM'] = $arGroupsPeriods['ACTIVE_FROM']; $arResult['LEARNING_GROUP_ACTIVE_TO'] = $arGroupsPeriods['ACTIVE_TO']; $activeFromMap = CLearnAccessMacroses::getActiveLearningChaptersPeriod($linkedLessonId, $USER->getId()); if ($activeFromMap !== false) { $arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'] = $activeFromMap; } } } } if (!$isAccessible) { ShowError(GetMessage('LEARNING_COURSE_DENIED')); return; exit; } }
protected static function GetListUni($arOrder = array(), $arFilter = array(), $arSelectFields = array(), $mode = self::GET_LIST_ALL, $lessonId = -1, $arNavParams = array()) { global $DB, $USER_FIELD_MANAGER; $obUserFieldsSql = new CUserTypeSQL(); $obUserFieldsSql->SetEntity('LEARNING_LESSONS', 'TL.ID'); $obUserFieldsSql->SetSelect($arSelectFields); $obUserFieldsSql->SetFilter($arFilter); $obUserFieldsSql->SetOrder($arOrder); $bReplaceCourseId = false; if (isset($arFilter['#REPLACE_COURSE_ID_TO_ID'])) { $bReplaceCourseId = true; unset($arFilter['#REPLACE_COURSE_ID_TO_ID']); } $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); // For ordering $arMap = array('lesson_id' => 'TL.ID', 'site_id' => 'TL.ID', 'name' => 'TL.NAME', 'code' => 'TL.CODE', 'active' => 'TL.ACTIVE', 'created' => 'TL.DATE_CREATE', 'date_create' => 'TL.DATE_CREATE', 'created_by' => 'TL.CREATED_BY', 'timestamp_x' => 'TL.TIMESTAMP_X', 'course_id' => 'TC.ID', 'course_sort' => 'TC.SORT', 'active_from' => 'TC.ACTIVE_FROM', 'sort' => 'TC.SORT', 'linked_lesson_id' => 'TC.LINKED_LESSON_ID'); $allowedModes = array(self::GET_LIST_ALL, self::GET_LIST_IMMEDIATE_CHILDS_OF, self::GET_LIST_IMMEDIATE_PARENTS_OF, self::GET_LIST_IMMEDIATE_CHILDS_OF | self::GET_LIST_IMMEDIATE_PARENTS_OF); $argsCheck = is_array($arOrder) && is_array($arSelectFields) && in_array($mode, $allowedModes, true) && self::_EnsureArgsStrictlyCastableToIntegers($lessonId); if (!$argsCheck) { throw new LearnException('EA_PARAMS', LearnException::EXC_ERR_ALL_PARAMS); } $arFieldsMap = array('LESSON_ID' => 'TL.ID', 'SITE_ID' => 'CASE WHEN (1 > 0) THEN \'no site\' ELSE \'0\' END', 'WAS_CHAPTER_ID' => 'TL.WAS_CHAPTER_ID', 'KEYWORDS' => 'TL.KEYWORDS', 'CHILDS_CNT' => '(SELECT COUNT(*) FROM b_learn_lesson_edges TLES WHERE TLES.SOURCE_NODE = TL.ID)', 'IS_CHILDS' => 'CASE WHEN (SELECT COUNT(*) FROM b_learn_lesson_edges TLES WHERE TLES.SOURCE_NODE = TL.ID) > 0 THEN \'1\' ELSE \'0\' END', 'SORT' => 'TC.SORT', 'TIMESTAMP_X' => $DB->DateToCharFunction('TL.TIMESTAMP_X'), 'DATE_CREATE' => $DB->DateToCharFunction('TL.DATE_CREATE'), 'CREATED_USER_NAME' => $DB->Concat("'('", 'TU.LOGIN', "') '", 'TU.NAME', "' '", 'TU.LAST_NAME'), 'CREATED_BY' => 'TL.CREATED_BY', 'ACTIVE' => 'TL.ACTIVE', 'NAME' => 'TL.NAME', 'PREVIEW_PICTURE' => 'TL.PREVIEW_PICTURE', 'PREVIEW_TEXT' => 'TL.PREVIEW_TEXT', 'PREVIEW_TEXT_TYPE' => 'TL.PREVIEW_TEXT_TYPE', 'DETAIL_TEXT' => 'TL.DETAIL_TEXT', 'DETAIL_PICTURE' => 'TL.DETAIL_PICTURE', 'DETAIL_TEXT_TYPE' => 'TL.DETAIL_TEXT_TYPE', 'LAUNCH' => 'TL.LAUNCH', 'CODE' => 'TL.CODE', 'ACTIVE_FROM' => $DB->DateToCharFunction('TC.ACTIVE_FROM'), 'ACTIVE_TO' => $DB->DateToCharFunction('TC.ACTIVE_TO'), 'RATING' => 'TC.RATING', 'RATING_TYPE' => 'TC.RATING_TYPE', 'SCORM' => 'TC.SCORM', 'LINKED_LESSON_ID' => 'TC.LINKED_LESSON_ID', 'COURSE_ID' => 'TC.ID', 'COURSE_SORT' => 'TC.SORT'); // filter by TIMESTAMP_X by default if (count($arOrder) == 0) { $arOrder['TIMESTAMP_X'] = 'DESC'; } $arSqlSearch = self::GetFilter($arFilter, $mode); if (isset($arFilter['SITE_ID'])) { $arLID = array(); if (is_array($arFilter['SITE_ID'])) { $arLID = $arFilter['SITE_ID']; } else { if (strlen($arFilter['SITE_ID']) > 0) { $arLID[] = $arFilter['SITE_ID']; } } $SqlSearchLang = "''"; foreach ($arLID as $v) { $SqlSearchLang .= ", '" . $DB->ForSql($v) . "'"; } } $r = $obUserFieldsSql->GetFilter(); if (strlen($r) > 0) { $arSqlSearch[] = "(" . $r . ")"; } $sqlSearch = ''; foreach ($arSqlSearch as $value) { if (strlen($value) > 0) { $sqlSearch .= ' AND ' . $value; } } $modeSQL_join = $modeSQL_where = ''; $modeSQL_defaultSortField = "TC.SORT"; // as SORT // Prepare SQL's joins, if $mode need it if ($mode & self::GET_LIST_IMMEDIATE_PARENTS_OF) { $modeSQL_join .= "\nINNER JOIN b_learn_lesson_edges TLE \n\t\t\t\tON TLE.SOURCE_NODE = TL.ID\n"; $modeSQL_where .= "\nAND TLE.TARGET_NODE = " . ($lessonId + 0) . "\n"; $arFieldsMap['EDGE_SORT'] = 'TLE.SORT'; $arFieldsMap['SORT'] = 'TLE.SORT'; } if ($mode & self::GET_LIST_IMMEDIATE_CHILDS_OF) { /** * GROUP BY works for MySQL, MSSQL, Oracle * select a.id, a.NAME, count(b.USER_ID) as C * from b_group a, b_user_group b * where a.id = b.GROUP_ID * group by a.id, a.NAME * order by C */ $modeSQL_join .= "\nINNER JOIN b_learn_lesson_edges TLE \n\t\t\t\tON TLE.TARGET_NODE = TL.ID\n"; $modeSQL_where .= "\nAND TLE.SOURCE_NODE = " . ($lessonId + 0) . "\n"; $arMap['childs_cnt'] = 'CHILDS_CNT'; $arMap['is_childs'] = 'IS_CHILDS'; $arMap['edge_sort'] = 'TLE.SORT'; // Override default sort $arMap['sort'] = $arMap['edge_sort']; $modeSQL_defaultSortField = "TLE.SORT"; // as SORT $arFieldsMap['EDGE_SORT'] = 'TLE.SORT'; $arFieldsMap['SORT'] = 'TLE.SORT'; } if ($bReplaceCourseId) { $arFieldsMap['ID'] = $arFieldsMap['COURSE_ID']; } // Select all fields by default if (count($arSelectFields) == 0) { $arSelectFields = array_keys($arFieldsMap); } // Ensure that all order fields will be selected foreach ($arOrder as $by => $order) { $fieldName = strtoupper($by); if (!in_array($fieldName, $arSelectFields)) { $arSelectFields[] = $fieldName; } } // Build list of fields to be selected $strSqlSelect = ''; $bFirstPass = true; $bDefaultSortFieldSelected = false; foreach ($arSelectFields as $selectFieldName) { if (substr($selectFieldName, 0, 3) === 'UF_') { continue; } if (!$bFirstPass) { $strSqlSelect .= ', '; } else { $bFirstPass = false; } if (!isset($arFieldsMap[$selectFieldName])) { throw new LearnException('EA_OTHER: UNKNOWN FIELD: ' . $selectFieldName, LearnException::EXC_ERR_ALL_GIVEUP); } $strSqlSelect .= $arFieldsMap[$selectFieldName] . ' AS ' . $selectFieldName; if ($selectFieldName === 'SORT' && $arFieldsMap[$selectFieldName] === $modeSQL_defaultSortField) { $bDefaultSortFieldSelected = true; } } if (!$bDefaultSortFieldSelected) { if ($strSqlSelect !== '') { $strSqlSelect .= ', '; } $strSqlSelect .= $modeSQL_defaultSortField . ' AS SORT'; } $strSqlSelect .= $obUserFieldsSql->GetSelect(); $sqlLangConstraint = ''; if (strlen($SqlSearchLang) > 2) { $sqlLangConstraint = "\n\t\t\tAND\n\t\t\tEXISTS\n\t\t\t(\n\t\t\t\tSELECT 'x' FROM b_learn_course_site TCS\n\t\t\t\tWHERE TC.ID = TCS.COURSE_ID AND TCS.SITE_ID IN (" . $SqlSearchLang . ")\n\t\t\t)\n\t\t\t"; } $strSqlFrom = "FROM b_learn_lesson TL\n\t\t\tLEFT JOIN b_learn_course TC \n\t\t\t\tON TC.LINKED_LESSON_ID = TL.ID\n\t\t\tLEFT JOIN b_user TU \n\t\t\t\tON TU.ID = TL.CREATED_BY " . $modeSQL_join . $obUserFieldsSql->GetJoin("TL.ID") . " WHERE 1 = 1 " . $sqlLangConstraint . $modeSQL_where; // for getting only parents/childs, if need if ($oPermParser->IsNeedCheckPerm()) { $strSqlFrom .= " AND TL.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSqlFrom .= $sqlSearch; $sql = "SELECT " . $strSqlSelect . " " . $strSqlFrom; $arSqlOrder = array(); foreach ($arOrder as $by => $order) { $by = strtolower($by); $order = strtolower($order); if ($order !== 'asc') { $order = 'desc'; } if ($s = $obUserFieldsSql->getOrder(strtolower($by))) { $arSqlOrder[] = ' ' . $s . ' ' . $order . ' '; } if (substr($by, 0, 3) !== 'UF_') { if (!isset($arMap[$by])) { throw new LearnException('EA_PARAMS: unknown order by field: "' . $by . '"', LearnException::EXC_ERR_ALL_PARAMS); } } $arSqlOrder[] = ' ' . $arMap[$by] . ' ' . $order . ' '; } // on duplicate first occured FIELD will be used according to function description DelDuplicateSort($arSqlOrder); $sql .= ' ORDER BY ' . implode(', ', $arSqlOrder); if (is_array($arNavParams) && !empty($arNavParams)) { if (isset($arNavParams['nTopCount']) && (int) $arNavParams['nTopCount'] > 0) { $sql = $DB->TopSql($sql, (int) $arNavParams['nTopCount']); $res = $DB->Query($sql, true); } else { $res_cnt = $DB->Query("SELECT COUNT(TL.ID) as C " . $strSqlFrom); $res_cnt = $res_cnt->fetch(); $res = new CDBResult(); $rc = $res->NavQuery($sql, $res_cnt['C'], $arNavParams, true); if ($rc === false) { throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP); } } } else { $res = $DB->Query($sql, true); } if ($res === false) { throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP); } $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields('LEARNING_LESSONS')); return $res; }
/** * <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>ATTEMPT_ID</b> - идентификатор * попытки; </li> <li> <b>QUESTION_ID</b> - идентификатор вопроса; </li> <li> <b>POINT</b> - * количество баллов; </li> <li> <b>ANSWERED</b> - вопрос отвечен (Y|N); </li> <li> * <b>CORRECT</b> - вопрос правильно отвечен (Y|N); </li> <li> <b>QUESTION_NAME</b> - * название вопроса; </li> <li> <b>RAND</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>ATTEMPT_ID</b> - * идентификатор попытки; </li> <li> <b>QUESTION_ID</b> - идентификатор вопроса; * </li> <li> <b>POINT</b> - количество баллов; </li> <li> <b>RESPONSE</b> - ответ учащегося * (можно искать по шаблону [%_]); </li> <li> <b>QUESTION_NAME</b> - название вопроса * (можно искать по шаблону [%_]); </li> <li> <b>ANSWERED</b> - вопрос отвечен (Y|N); * </li> <li> <b>CORRECT</b> - вопрос правильно отвечен (Y|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> * <? * if (CModule::IncludeModule("learning")) * { * $ATTEMPT_ID = 590; * $res = CTestResult::GetList( * Array("ID" => "ASC"), * Array("ANSWERED" => "N", "ATTEMPT_ID" => $ATTEMPT_ID) * ); * * while ($arQuestionPlan = $res->GetNext()) * { * echo "Question ID: ".$arQuestionPlan["QUESTION_ID"].<br> "; Correct answer: ".$arQuestionPlan["CORRECT"].<br> "; Question name:".$arQuestionPlan["QUESTION_NAME"]."<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="index.php">CTestResult</a>::<a href="getbyid.php">GetByID</a> </li> <li><a * href="../../fields.php#test_result">Поля плана тестирования</a></li> </ul><a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ctestresult/getlist.php * @author Bitrix */ public static function GetList($arOrder=array(), $arFilter=array()) { global $DB, $USER, $APPLICATION; if (!is_array($arFilter)) $arFilter = Array(); $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter); $arSqlSearch = CTestResult::GetFilter($arFilter); $strSqlSearch = ""; $arSqlSearchCnt = count($arSqlSearch); for($i=0; $i<$arSqlSearchCnt; $i++) if(strlen($arSqlSearch[$i])>0) $strSqlSearch .= " AND ".$arSqlSearch[$i]." "; $strSql = "SELECT TR.*, Q.QUESTION_TYPE, Q.NAME as QUESTION_NAME, Q.POINT as QUESTION_POINT, Q.LESSON_ID FROM b_learn_test_result TR INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID INNER JOIN b_learn_lesson L ON Q.LESSON_ID = L.ID WHERE 1=1 "; if ($oPermParser->IsNeedCheckPerm()) $strSql .= " AND L.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; $strSql .= $strSqlSearch; /* was: $bCheckPerm = ($APPLICATION->GetUserRight("learning") < "W" && !$USER->IsAdmin() && $arFilter["CHECK_PERMISSIONS"] != "N"); $strSql = "SELECT TR.*, Q.QUESTION_TYPE, Q.NAME as QUESTION_NAME, Q.POINT as QUESTION_POINT, Q.LESSON_ID FROM b_learn_test_result TR INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID INNER JOIN b_learn_lesson L ON Q.LESSON_ID = L.ID " "INNER JOIN b_learn_course C ON L.COURSE_ID = C.ID ". . "WHERE 1=1 " . ($bCheckPerm ? "AND EXISTS (SELECT * FROM b_learn_course_permission CP WHERE ". "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[] = " TR.ID ".$order." "; elseif ($by == "attempt_id") $arSqlOrder[] = " TR.ATTEMPT_ID ".$order." "; elseif ($by == "question_id") $arSqlOrder[] = " TR.QUESTION_ID ".$order." "; elseif ($by == "point") $arSqlOrder[] = " TR.POINT ".$order." "; elseif ($by == "correct") $arSqlOrder[] = " TR.CORRECT ".$order." "; elseif ($by == "answered") $arSqlOrder[] = " TR.ANSWERED ".$order." "; elseif ($by == "question_name") $arSqlOrder[] = " QUESTION_NAME ".$order." "; elseif ($by == "rand") $arSqlOrder[] = CTest::GetRandFunction(); else { $arSqlOrder[] = " TR.ID ".$order." "; $by = "id"; } } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); $arSqlOrderCnt = count($arSqlOrder); for ($i=0; $i<$arSqlOrderCnt; $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__); }
/** * <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>ATTEMPT_ID</b> - идентификатор * попытки; </li> <li> <b>QUESTION_ID</b> - идентификатор вопроса; </li> <li> <b>POINT</b> - * количество баллов; </li> <li> <b>ANSWERED</b> - вопрос отвечен (Y|N); </li> <li> * <b>CORRECT</b> - вопрос правильно отвечен (Y|N); </li> <li> <b>QUESTION_NAME</b> - * название вопроса; </li> <li> <b>RAND</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>ATTEMPT_ID</b> - * идентификатор попытки; </li> <li> <b>QUESTION_ID</b> - идентификатор вопроса; * </li> <li> <b>POINT</b> - количество баллов; </li> <li> <b>RESPONSE</b> - ответ учащегося * (можно искать по шаблону [%_]); </li> <li> <b>QUESTION_NAME</b> - название вопроса * (можно искать по шаблону [%_]); </li> <li> <b>ANSWERED</b> - вопрос отвечен (Y|N); * </li> <li> <b>CORRECT</b> - вопрос правильно отвечен (Y|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> * <? * if (CModule::IncludeModule("learning")) * { * $ATTEMPT_ID = 590; * $res = CTestResult::GetList( * Array("ID" => "ASC"), * Array("ANSWERED" => "N", "ATTEMPT_ID" => $ATTEMPT_ID) * ); * * while ($arQuestionPlan = $res->GetNext()) * { * echo "Question ID: ".$arQuestionPlan["QUESTION_ID"].<br> "; Correct answer: ".$arQuestionPlan["CORRECT"].<br> "; Question name:".$arQuestionPlan["QUESTION_NAME"]."<b * </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="index.php">CTestResult</a>::<a href="getbyid.php">GetByID</a> </li> <li><a * href="../../fields.php#test_result">Поля плана тестирования</a></li> </ul> <a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ctestresult/getlist.php * @author Bitrix */ public static function GetList($arOrder = array(), $arFilter = array(), $arNavParams = array()) { global $DB, $USER, $APPLICATION; if (!is_array($arFilter)) { $arFilter = array(); } $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); $arSqlSearch = CTestResult::GetFilter($arFilter); // Remove empty strings from array $arSqlSearch = array_filter($arSqlSearch); if ($oPermParser->IsNeedCheckPerm()) { $arSqlSearch[] = " L.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSqlSearch = ' '; if (!empty($arSqlSearch)) { $strSqlSearch = ' WHERE '; $strSqlSearch .= implode(' AND ', $arSqlSearch); } $strSqlFrom = "FROM b_learn_test_result TR \n\t\t\tINNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID \n\t\t\tINNER JOIN b_learn_lesson L ON Q.LESSON_ID = L.ID " . $strSqlSearch; $strSql = "SELECT TR.*, Q.QUESTION_TYPE, Q.NAME as QUESTION_NAME, \n\t\t\tQ.POINT as QUESTION_POINT, Q.LESSON_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[] = " TR.ID " . $order . " "; } elseif ($by == "attempt_id") { $arSqlOrder[] = " TR.ATTEMPT_ID " . $order . " "; } elseif ($by == "question_id") { $arSqlOrder[] = " TR.QUESTION_ID " . $order . " "; } elseif ($by == "point") { $arSqlOrder[] = " TR.POINT " . $order . " "; } elseif ($by == "correct") { $arSqlOrder[] = " TR.CORRECT " . $order . " "; } elseif ($by == "answered") { $arSqlOrder[] = " TR.ANSWERED " . $order . " "; } elseif ($by == "question_name") { $arSqlOrder[] = " QUESTION_NAME " . $order . " "; } elseif ($by == "rand") { $arSqlOrder[] = CTest::GetRandFunction(); } else { $arSqlOrder[] = " TR.ID " . $order . " "; $by = "id"; } } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); $arSqlOrderCnt = count($arSqlOrder); for ($i = 0; $i < $arSqlOrderCnt; $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(TR.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 $res; }
/** * <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 GetList($arOrder = array(), $arFilter = array()) { global $DB, $USER; if (!is_array($arFilter)) { $arFilter = array(); } $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); $arSqlSearch = CTest::GetFilter($arFilter); $strSqlSearch = ""; for ($i = 0; $i < count($arSqlSearch); $i++) { if (strlen($arSqlSearch[$i]) > 0) { $strSqlSearch .= " AND " . $arSqlSearch[$i] . " "; } } $strSql = "SELECT DISTINCT T.*, " . $DB->DateToCharFunction("T.TIMESTAMP_X") . " as TIMESTAMP_X " . "FROM b_learn_test T " . "INNER JOIN b_learn_course C ON T.COURSE_ID = C.ID " . "WHERE 1=1 "; if ($oPermParser->IsNeedCheckPerm()) { $strSql .= " AND C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSql .= $strSqlSearch; /* was: $bCheckPerm = ($APPLICATION->GetUserRight("learning") < "W" && !$USER->IsAdmin() && $arFilter["CHECK_PERMISSIONS"] != "N"); $userID = $USER->GetID() ? $USER->GetID() : 0; $strSql = "SELECT DISTINCT T.*, ". $DB->DateToCharFunction("T.TIMESTAMP_X")." as TIMESTAMP_X ". "FROM b_learn_test T ". "INNER JOIN b_learn_course C ON T.COURSE_ID = C.ID ". ($bCheckPerm ? "LEFT JOIN b_learn_course_permission CP ON CP.COURSE_ID = C.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[] = " T.ID " . $order . " "; } elseif ($by == "name") { $arSqlOrder[] = " T.NAME " . $order . " "; } elseif ($by == "active") { $arSqlOrder[] = " T.ACTIVE " . $order . " "; } elseif ($by == "sort") { $arSqlOrder[] = " T.SORT " . $order . " "; } else { $arSqlOrder[] = " T.TIMESTAMP_X " . $order . " "; $by = "timestamp_x"; } } $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__); }
function GetList($arOrder = array(), $arFilter = array()) { global $DB, $USER, $APPLICATION; $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); $arSqlSearch = CGradeBook::GetFilter($arFilter); $strSqlSearch = ""; for ($i = 0; $i < count($arSqlSearch); $i++) { if (strlen($arSqlSearch[$i]) > 0) { $strSqlSearch .= " AND " . $arSqlSearch[$i] . " "; } } //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) . "'"; } } $strSql = "SELECT DISTINCT G.*, T.NAME as TEST_NAME, T.COURSE_ID as COURSE_ID, \n\t\t(T.ATTEMPT_LIMIT + G.EXTRA_ATTEMPTS) AS ATTEMPT_LIMIT, TUL.NAME as COURSE_NAME, \n\t\tC.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 " . "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 " . (strlen($SqlSearchLang) > 2 ? "LEFT JOIN b_learn_course_site CS ON C.ID = CS.COURSE_ID " : "") . "WHERE \n\t\t\t(TM.SCORE IS NULL \n\t\t\tOR TM.SCORE = \n\t\t\t\t(SELECT SCORE \n\t\t\t\tFROM b_learn_test_mark \n\t\t\t\tWHERE SCORE >= (G.RESULT/G.MAX_RESULT*100) \n\t\t\t\tORDER BY SCORE ASC \n\t\t\t\tLIMIT 1)\n\t\t\t) "; if ($oPermParser->IsNeedCheckPerm()) { $strSql .= " AND TUL.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSql .= $strSqlSearch; if (strlen($SqlSearchLang) > 2) { $strSql .= " AND CS.SITE_ID IN (" . $SqlSearchLang . ")"; } /* was: $bCheckPerm = ($APPLICATION->GetUserRight("learning") < "W" && !$USER->IsAdmin() && $arFilter["CHECK_PERMISSIONS"] != "N"); $strSql = "SELECT DISTINCT G.*, T.NAME as TEST_NAME, T.COURSE_ID as COURSE_ID, (T.ATTEMPT_LIMIT + G.EXTRA_ATTEMPTS) AS ATTEMPT_LIMIT, C.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 ". "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 ". (strlen($SqlSearchLang) > 2 ? "LEFT JOIN b_learn_course_site CS ON C.ID = CS.COURSE_ID " : ""). ($bCheckPerm ? "LEFT JOIN b_learn_course_permission CP ON CP.COURSE_ID = C.ID " : ""). "WHERE 1=1 ". "AND (TM.SCORE IS NULL OR TM.SCORE = (SELECT SCORE FROM b_learn_test_mark WHERE SCORE >= (G.RESULT/G.MAX_RESULT*100) ORDER BY SCORE ASC LIMIT 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 TUL.ACTIVE='Y')" :""). $strSqlSearch. (strlen($SqlSearchLang) > 2 ? " AND CS.SITE_ID IN (".$SqlSearchLang.")" : ""); */ 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 . " "; $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__); }
if (isset($_REQUEST['LESSON_PATH']) && strlen($_REQUEST['LESSON_PATH'])) { $arParams['LESSON_PATH'] = $_REQUEST['LESSON_PATH']; } } $strUrlencodedLessonPath = ''; if (strlen($arParams['LESSON_PATH']) > 0) { $strUrlencodedLessonPath = 'LESSON_PATH=' . $arParams['LESSON_PATH']; } $ratingTransistor = ''; if ($arParams['LESSON_ID'] > 0) { $arRatingData = CRatings::GetRatingVoteResult('LEARN_LESSON', $arParams['LESSON_ID']); $ratingTransistor = serialize($arRatingData); } $delayed = false; $courseLessonId = CCourse::CourseGetLinkedLesson($arParams['COURSE_ID']); if (CLearnParsePermissionsFromFilter::isRegisteredAsAvailableCourse($courseLessonId)) { $arGroupsPeriods = CLearnAccessMacroses::getActiveLearningGroupsPeriod($courseLessonId, $USER->getId()); if ($arGroupsPeriods['IS_EXISTS']) { $arResult['LEARNING_GROUP_ACTIVE_FROM'] = $arGroupsPeriods['ACTIVE_FROM']; $arResult['LEARNING_GROUP_ACTIVE_TO'] = $arGroupsPeriods['ACTIVE_TO']; $activeFromMap = CLearnAccessMacroses::getActiveLearningChaptersPeriod($courseLessonId, $USER->getId()); if ($activeFromMap !== false) { $arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'] = $activeFromMap; } $oPath = new CLearnPath(); $oPath->ImportUrlencoded($arParams['LESSON_PATH']); $arPath = $oPath->GetPathAsArray(); if (count($arPath) >= 2) { $secondLevelLesson = $arPath[1]; if (isset($arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'][$secondLevelLesson])) { $activeFrom = $arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'][$secondLevelLesson];
$bTzWasDisabled = !CTimeZone::enabled(); if ($bTzWasDisabled) { CTimeZone::enable(); } if ($userId === false) { $tzOffset = CTimeZone::getOffset(); } else { $tzOffset = CTimeZone::getOffset($userId); } if ($bTzWasDisabled) { CTimeZone::disable(); } $nowDateStr = ConvertTimeStamp(time() + $tzOffset, 'FULL'); $rs = CLearningGroup::getList(array(), array('MEMBER_ID' => $USER->getId(), 'ACTIVE' => 'Y', '<ACTIVE_FROM' => $nowDateStr, '>ACTIVE_TO' => $nowDateStr)); while ($ar = $rs->fetch()) { CLearnParsePermissionsFromFilter::registerAvailableCourse($ar['COURSE_LESSON_ID']); } $arParams["SORBY"] = isset($arParams["~SORBY"]) ? trim($arParams["~SORBY"]) : "SORT"; $arParams["SORORDER"] = isset($arParams["~SORORDER"]) ? trim($arParams["~SORORDER"]) : "ASC"; $arParams["CHECK_PERMISSIONS"] = isset($arParams["CHECK_PERMISSIONS"]) && $arParams["CHECK_PERMISSIONS"] == "N" ? "N" : "Y"; $arParams["COURSE_DETAIL_TEMPLATE"] = isset($arParams["COURSE_DETAIL_TEMPLATE"]) ? htmlspecialcharsbx($arParams["COURSE_DETAIL_TEMPLATE"]) : "course/index.php?COURSE_ID=#COURSE_ID#"; $arParams["COURSES_PER_PAGE"] = intval($arParams["COURSES_PER_PAGE"]) > 0 ? intval($arParams["COURSES_PER_PAGE"]) : 20; //Set Title $arParams["SET_TITLE"] = $arParams["SET_TITLE"] == "N" ? "N" : "Y"; if ($arParams["SET_TITLE"] == "Y") { $APPLICATION->SetTitle(GetMessage("LEARNING_COURSE_LIST")); } //arResult $arResult = array("COURSES" => array(), "NAV_SRTING" => "", "NAV_RESULT" => null); $arNavParams = array(); $arNavParams = array();
/** * <p>Возвращает список записей журнала по фильтру arFilter, отсортированный в порядке arOrder. Учитываются права доступа текущего пользователя.</p> * * * * * @param array $arrayarOrder = Array("ID"=>"DESC") Массив для сортировки результата. Массив вида <i>array("поле * сортировки"=>"направление сортировки" [, ...])</i>.<br> Поле для * сортировки может принимать значения: <ul> <li> <b>ID</b> - идентификатор * записи;</li> <li> <b>TEST_ID</b> - идентификатор теста;</li> <li> <b>STUDENT_ID</b> - * идентификатор студента ;</li> <li> <b>RESULT</b> - количество баллов;</li> <li> * <b>MAX_RESULT</b> - максимальное количество баллов;</li> <li> <b>COMPLETED</b> - тест * пройден;</li> <li> <b>USER_NAME</b> - имя студента;</li> <li> <b>TEST_NAME</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>TEST_ID</b> - идентификатор теста;</li> <li> * <b>STUDENT_ID</b> - идентификатор студента;</li> <li> <b>RESULT</b> - количество * баллов;</li> <li> <b>MAX_RESULT</b> - максимальное количество баллов;</li> <li> * <b>COMPLETED</b> - тест пройден (Y|N);</li> <li> <b>USER</b> - пользователь (возможны * сложные условия по полям пользователя ID, LOGIN, NAME, LAST_NAME);</li> <li> * <b>MIN_PERMISSION</b> - минимальный уровень доcтупа. По умолчанию "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> * <? * if (CModule::IncludeModule("learning")) * { * $TEST_ID = 45; * $res = CGradebook::GetList( * Array("ID" => "ASC"), * Array("TEST_ID" => $TEST_ID) * ); * * while ($arGradebook = $res->GetNext()) * { * echo "Student: ".$arGradebook["USER_NAME"]."; Test name: ".$arGradebook["TEST_NAME"]."; Completed: ".$arGradebook["COMPLETED"]."<br>"; * } * } * * ?> * * <? * * if (CModule::IncludeModule("learning")) * { * $TEST_ID = 45; * $STUDENT_ID = 3; * * $res = CGradebook::GetList( * Array("ID" => "ASC"), * Array("CHECK_PERMISSIONS" => "N", "TEST_ID" => $TEST_ID, "STUDENT_ID" => $STUDENT_ID) * ); * * while ($arGradebook = $res->GetNext()) * { * echo "Student: ".$arGradebook["USER_NAME"]."; Test name: ".$arGradebook["TEST_NAME"]."; Completed: ".$arGradebook["COMPLETED"]."<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/cgradebook/index.php">CGradeBook</a>::<a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/cgradebook/getbyid.php">GetByID</a> </li> <li><a * href="http://dev.1c-bitrix.ru/api_help/learning/fields.php#gradebook">Поля журнала</a></li> </ul> <a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/cgradebook/getlist.php * @author Bitrix */ 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, \n\t\tT.APPROVED as TEST_APPROVED,\n\t\t(T.ATTEMPT_LIMIT + G.EXTRA_ATTEMPTS) AS ATTEMPT_LIMIT, TUL.NAME as COURSE_NAME, \n\t\tC.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; $i < count($arSqlOrder); $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__); }
public static function GetList($arOrder = array(), $arFilter = array(), $arNavParams = array()) { global $DB, $USER; if (!is_array($arFilter)) { $arFilter = array(); } $oPermParser = new CLearnParsePermissionsFromFilter($arFilter); $arSqlSearch = CTest::GetFilter($arFilter); // Remove empty strings from array $arSqlSearch = array_filter($arSqlSearch); if ($oPermParser->IsNeedCheckPerm()) { $arSqlSearch[] = " C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; } $strSqlSearch = ' '; if (!empty($arSqlSearch)) { $strSqlSearch = ' WHERE '; $strSqlSearch .= implode(' AND ', $arSqlSearch); } $strSqlFrom = "FROM b_learn_test LT " . "INNER JOIN b_learn_course C ON LT.COURSE_ID = C.ID " . $strSqlSearch; $strSql = "SELECT LT.ID, LT.COURSE_ID, LT.SORT, LT.ACTIVE, LT.NAME, \n\t\t\t\tLT.DESCRIPTION, LT.DESCRIPTION_TYPE, LT.ATTEMPT_LIMIT, \n\t\t\t\tLT.TIME_LIMIT, LT.COMPLETED_SCORE, LT.QUESTIONS_FROM, \n\t\t\t\tLT.QUESTIONS_FROM_ID, LT.QUESTIONS_AMOUNT, LT.RANDOM_QUESTIONS, \n\t\t\t\tLT.RANDOM_ANSWERS, LT.APPROVED, LT.INCLUDE_SELF_TEST, \n\t\t\t\tLT.PASSAGE_TYPE, LT.PREVIOUS_TEST_ID, LT.PREVIOUS_TEST_SCORE, \n\t\t\t\tLT.INCORRECT_CONTROL, LT.CURRENT_INDICATION, \n\t\t\t\tLT.FINAL_INDICATION, LT.MIN_TIME_BETWEEN_ATTEMPTS, \n\t\t\t\tLT.SHOW_ERRORS, LT.NEXT_QUESTION_ON_ERROR, " . $DB->DateToCharFunction("LT.TIMESTAMP_X") . " as TIMESTAMP_X " . $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[] = " LT.ID " . $order . " "; } elseif ($by == "name") { $arSqlOrder[] = " LT.NAME " . $order . " "; } elseif ($by == "active") { $arSqlOrder[] = " LT.ACTIVE " . $order . " "; } elseif ($by == "sort") { $arSqlOrder[] = " LT.SORT " . $order . " "; } else { $arSqlOrder[] = " LT.TIMESTAMP_X " . $order . " "; $by = "timestamp_x"; } } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); if (!empty($arSqlOrder)) { $strSqlOrder .= ' ORDER BY ' . implode(', ', $arSqlOrder) . ' '; } $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(LT.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 $res; }
/** * <p>Возвращает количество тестов по заданному фильтру.</p> * * * * * @param array $arrayarFilter = Array() Массив вида <i> array("фильтруемое поле"=>"значение фильтра" [, ...])</i>. * Описание фильтра см. в <a * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ctest/getlist.php">CTest::GetList</a>.<br> По * умолчанию тесты не фильтруются. * * * * @return int <p>Число - количество тестов.</p> * * * <h4>Example</h4> * <pre> * <? * if (CModule::IncludeModule("learning")) * { * $COURSE_ID = 97; * * $cnt = CTest::GetCount(Array("ACTIVE" => "Y", "COURSE_ID" => $COURSE_ID)); * * echo "Number of tests: ".$cnt; * } * * ?> * * <? * if (CModule::IncludeModule("learning")) * { * $COURSE_ID = 97; * * $cnt = CTest::GetCount(Array("CHECK_PERMISSIONS" => "N", "COURSE_ID" => $COURSE_ID)); * * echo "Number of tests: ".$cnt; * } * * ?> * </pre> * * * * <h4>See Also</h4> * <ul> <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> </ul><a * name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ctest/getcount.php * @author Bitrix */ public static function GetCount($arFilter = Array()) { global $DB, $USER, $APPLICATION; if (!is_array($arFilter)) $arFilter = Array(); $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter); $arSqlSearch = CTest::GetFilter($arFilter); $strSqlSearch = ""; for($i=0; $i<count($arSqlSearch); $i++) if(strlen($arSqlSearch[$i])>0) $strSqlSearch .= " AND ".$arSqlSearch[$i]." "; $strSql = "SELECT COUNT(*) as CNT FROM b_learn_test T INNER JOIN b_learn_course C ON T.COURSE_ID = C.ID WHERE 1=1"; if ($oPermParser->IsNeedCheckPerm()) $strSql .= " AND C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") "; $strSql .= $strSqlSearch; /* was: $strSql = "SELECT COUNT(*) as CNT ". "FROM b_learn_test T ". "INNER JOIN b_learn_course C ON T.COURSE_ID = C.ID ". ($bCheckPerm ? "LEFT JOIN b_learn_course_permission CP ON CP.COURSE_ID = C.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; */ $res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); if ($ar = $res->Fetch()) return intval($ar["CNT"]); else return 0; }
/** * <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__); }