12 $arMsg[] =
array(
"id"=>
"NAME",
"text"=>
GetMessage(
"LEARNING_BAD_NAME"));
16 $arMsg[] =
array(
"id"=>
"COURSE_ID",
"text"=>
GetMessage(
"LEARNING_BAD_COURSE_ID"));
22 $arMsg[] =
array(
"id"=>
"COURSE_ID",
"text"=>
GetMessage(
"LEARNING_BAD_COURSE_ID_EX"));
29 && (intval(
$arFields[
"COMPLETED_SCORE"]) <= 0 || intval(
$arFields[
"COMPLETED_SCORE"]) > 100)
31 $arMsg[] =
array(
"id"=>
"COMPLETED_SCORE",
"text"=>
GetMessage(
"LEARNING_BAD_COMPLETED_SCORE"));
37 $arMsg[] =
array(
"id"=>
"PREVIOUS_TEST_ID",
"text"=>
GetMessage(
"LEARNING_BAD_PREVIOUS_TEST"));
41 (intval(
$arFields[
"PREVIOUS_TEST_SCORE"]) <= 0 || intval(
$arFields[
"PREVIOUS_TEST_SCORE"]) > 100) &&
42 intval(
$arFields[
"PREVIOUS_TEST_ID"]) != 0
44 $arMsg[] =
array(
"id"=>
"PREVIOUS_TEST_SCORE",
"text"=>
GetMessage(
"LEARNING_BAD_COMPLETED_SCORE"));
49 $GLOBALS[
"APPLICATION"]->ThrowException($e);
95 $arFields[
"NEXT_QUESTION_ON_ERROR"] =
"Y";
99 $arFields[
"NEXT_QUESTION_ON_ERROR"] =
"N";
114 $ID =
$DB->Add(
"b_learn_test",
$arFields, Array(
"DESCRIPTION"),
"learning");
130 if (
$ID < 1)
return false;
137 "DESCRIPTION" =>
$arFields[
"DESCRIPTION"] ??
''
140 foreach(
GetModuleEvents(
'learning',
'OnBeforeTestUpdate',
true) as $arEvent)
143 $strUpdate =
$DB->PrepareUpdate(
"b_learn_test",
$arFields,
"learning");
144 $strSql =
"UPDATE b_learn_test SET ".$strUpdate.
" WHERE ID=".
$ID;
145 $DB->QueryBind($strSql, $arBinds);
147 foreach(
GetModuleEvents(
'learning',
'OnAfterTestUpdate',
true) as $arEvent)
161 if (
$ID < 1)
return false;
167 while($arRecord = $records->Fetch())
175 while($arAttempt = $attempts->Fetch())
183 while($arMark = $marks->Fetch())
191 while ($previousTest = $previousTests->Fetch())
194 $test->
Update($previousTest[
"ID"], [
"PREVIOUS_TEST_ID" => 0]);
197 $strSql =
"DELETE FROM b_learn_test WHERE ID = ".$ID;
199 if (!
$DB->Query($strSql))
202 CEventLog::add(
array(
203 'AUDIT_TYPE_ID' =>
'LEARNING_REMOVE_ITEM',
204 'MODULE_ID' =>
'learning',
205 'ITEM_ID' =>
'T #' .
$ID,
206 'DESCRIPTION' =>
'test removed'
220 $arSqlSearch = Array();
226 $cOperationType =
$res[
"OPERATION"];
235 case "ATTEMPT_LIMIT":
237 case "PREVIOUS_TEST_ID":
248 case "INCLUDE_SELF_TEST":
249 case "RANDOM_ANSWERS":
250 case "RANDOM_QUESTIONS":
251 case "QUESTIONS_FROM":
252 case "QUESTIONS_FROM_ID":
283 if ( ! empty($arSqlSearch) )
284 $strSqlSearch .=
' AND ' . implode(
' AND ', $arSqlSearch) .
' ';
287 "SELECT COUNT(*) as CNT
289 INNER JOIN b_learn_course C
290 ON LT.COURSE_ID = C.ID
293 if ($oPermParser->IsNeedCheckPerm())
294 $strSql .=
" AND C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() .
") ";
296 $strSql .= $strSqlSearch;
301 return intval(
$ar[
"CNT"]);
311 $SCORE = intval($SCORE);
314 FROM b_learn_gradebook
316 STUDENT_ID = ".$USER->GetID().
" AND
318 TEST_ID = ".
$ID.
" AND
319 1.0*RESULT/MAX_RESULT*100 >= ".$SCORE
336 $strSql =
"SELECT COUNT(*) AS ALL_CNT, SUM(CASE WHEN COMPLETED = 'Y' THEN 1 ELSE 0 END) AS CORRECT_CNT FROM b_learn_attempt WHERE STATUS = 'F' AND TEST_ID = ".$ID;
337 $rsStat =
$DB->Query($strSql);
338 if ($arStat = $rsStat->GetNext())
340 return array(
"ALL_CNT" => intval($arStat[
"ALL_CNT"]),
"CORRECT_CNT" => intval($arStat[
"CORRECT_CNT"]));
344 return array(
"ALL_CNT" => 0,
"CORRECT_CNT" => 0);
360 $arSqlSearch = array_filter($arSqlSearch);
362 if ($oPermParser->IsNeedCheckPerm())
363 $arSqlSearch[] =
" C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() .
") ";
366 if ( ! empty($arSqlSearch) )
368 $strSqlSearch =
' WHERE ';
369 $strSqlSearch .= implode(
' AND ', $arSqlSearch);
372 $strSqlFrom =
"FROM b_learn_test LT ".
373 "INNER JOIN b_learn_course C ON LT.COURSE_ID = C.ID "
377 "SELECT LT.ID, LT.COURSE_ID, LT.SORT, LT.ACTIVE, LT.NAME,
378 LT.DESCRIPTION, LT.DESCRIPTION_TYPE, LT.ATTEMPT_LIMIT,
379 LT.TIME_LIMIT, LT.COMPLETED_SCORE, LT.QUESTIONS_FROM,
380 LT.QUESTIONS_FROM_ID, LT.QUESTIONS_AMOUNT, LT.RANDOM_QUESTIONS,
381 LT.RANDOM_ANSWERS, LT.APPROVED, LT.INCLUDE_SELF_TEST,
382 LT.PASSAGE_TYPE, LT.PREVIOUS_TEST_ID, LT.PREVIOUS_TEST_SCORE,
383 LT.INCORRECT_CONTROL, LT.CURRENT_INDICATION,
384 LT.FINAL_INDICATION, LT.MIN_TIME_BETWEEN_ATTEMPTS,
385 LT.SHOW_ERRORS, LT.NEXT_QUESTION_ON_ERROR, ".
386 $DB->DateToCharFunction(
"LT.TIMESTAMP_X").
" as TIMESTAMP_X "
389 if (!is_array($arOrder))
392 foreach($arOrder as $by=>
$order)
394 $by = mb_strtolower($by);
401 $arSqlOrder[] =
" LT.ID ".$order.
" ";
403 $arSqlOrder[] =
" LT.NAME ".$order.
" ";
405 $arSqlOrder[] =
" LT.ACTIVE ".$order.
" ";
407 $arSqlOrder[] =
" LT.SORT ".$order.
" ";
410 $arSqlOrder[] =
" LT.TIMESTAMP_X ".$order.
" ";
418 if ( ! empty($arSqlOrder) )
419 $strSqlOrder .=
' ORDER BY ' . implode(
', ', $arSqlOrder) .
' ';
421 $strSql .= $strSqlOrder;
423 if (is_array($arNavParams) && ( ! empty($arNavParams) ) )
425 if (isset($arNavParams[
'nTopCount']) && ((
int) $arNavParams[
'nTopCount'] > 0))
427 $strSql =
$DB->TopSql($strSql, (
int) $arNavParams[
'nTopCount']);
432 $res_cnt =
$DB->Query(
"SELECT COUNT(LT.ID) as C " . $strSqlFrom);
433 $res_cnt = $res_cnt->fetch();
434 $res =
new CDBResult();
435 $res->NavQuery($strSql, $res_cnt[
'C'], $arNavParams);
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
static GetList($arOrder=array(), $arFilter=array(), $arSelect=array(), $arNavParams=array())
CheckFields(&$arFields, $ID=false)
static isPrevPassed($ID, $SCORE)
static GetCount($arFilter=Array())
static GetFilter($arFilter)
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
static GetList($arOrder=Array(), $arFilter=Array())
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
static MkOperationFilter($key)
static FireEvent($eventName, $eventParams)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
ExecuteModuleEventEx($arEvent, $arParams=[])
DelDuplicateSort(&$arSort)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
$GLOBALS['_____370096793']