1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
test.php
См. документацию.
1<?php
2
4{
5 public function CheckFields(&$arFields, $ID = false)
6 {
7 global $DB;
8 $arMsg = array();
9
10 if ( (is_set($arFields, "NAME") || $ID === false) && $arFields["NAME"] == '')
11 {
12 $arMsg[] = array("id"=>"NAME", "text"=> GetMessage("LEARNING_BAD_NAME"));
13 }
14
15 if ($ID===false && !is_set($arFields, "COURSE_ID"))
16 $arMsg[] = array("id"=>"COURSE_ID", "text"=> GetMessage("LEARNING_BAD_COURSE_ID"));
17
18 if (is_set($arFields, "COURSE_ID"))
19 {
20 $r = CCourse::GetByID($arFields["COURSE_ID"]);
21 if(!$r->Fetch())
22 $arMsg[] = array("id"=>"COURSE_ID", "text"=> GetMessage("LEARNING_BAD_COURSE_ID_EX"));
23 }
24
25 if (
26 isset($arFields["APPROVED"])
27 && $arFields["APPROVED"] === "Y"
28 && is_set($arFields, "COMPLETED_SCORE")
29 && (intval($arFields["COMPLETED_SCORE"]) <= 0 || intval($arFields["COMPLETED_SCORE"]) > 100)
30 )
31 $arMsg[] = array("id"=>"COMPLETED_SCORE", "text"=> GetMessage("LEARNING_BAD_COMPLETED_SCORE"));
32
33 if (is_set($arFields, "PREVIOUS_TEST_ID") && intval($arFields["PREVIOUS_TEST_ID"]) != 0)
34 {
35 $r = CTest::GetByID($arFields["PREVIOUS_TEST_ID"]);
36 if(!$r->Fetch())
37 $arMsg[] = array("id"=>"PREVIOUS_TEST_ID", "text"=> GetMessage("LEARNING_BAD_PREVIOUS_TEST"));
38 }
39
40 if ( is_set($arFields, "PREVIOUS_TEST_SCORE") &&
41 (intval($arFields["PREVIOUS_TEST_SCORE"]) <= 0 || intval($arFields["PREVIOUS_TEST_SCORE"]) > 100) &&
42 intval($arFields["PREVIOUS_TEST_ID"]) != 0
43 )
44 $arMsg[] = array("id"=>"PREVIOUS_TEST_SCORE", "text"=> GetMessage("LEARNING_BAD_COMPLETED_SCORE"));
45
46 if(!empty($arMsg))
47 {
48 $e = new CAdminException($arMsg);
49 $GLOBALS["APPLICATION"]->ThrowException($e);
50 return false;
51 }
52
53 //Defaults
54 if (is_set($arFields, "QUESTIONS_FROM") && !in_array($arFields["QUESTIONS_FROM"], array("A", "C", "L", "H", "S", 'R')))
55 $arFields["QUESTIONS_FROM"] = "A";
56
57 if (is_set($arFields, "QUESTIONS_AMOUNT") && intval($arFields["QUESTIONS_AMOUNT"]) <= 0)
58 $arFields["QUESTIONS_AMOUNT"] = "0";
59
60 if (is_set($arFields, "QUESTIONS_FROM_ID") && intval($arFields["QUESTIONS_FROM_ID"]) <= 0)
61 $arFields["QUESTIONS_FROM_ID"] = "0";
62
63 if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
64 $arFields["ACTIVE"] = "N";
65
66 if (is_set($arFields, "APPROVED") && $arFields["APPROVED"] != "Y")
67 $arFields["APPROVED"] = "N";
68
69 if (isset($arFields["APPROVED"]) && $arFields["APPROVED"] == "N")
70 {
71 $arFields["COMPLETED_SCORE"] = "";
72 }
73
74 if (is_set($arFields, "INCLUDE_SELF_TEST") && $arFields["INCLUDE_SELF_TEST"] != "Y")
75 $arFields["INCLUDE_SELF_TEST"] = "N";
76
77 if (is_set($arFields, "RANDOM_QUESTIONS") && $arFields["RANDOM_QUESTIONS"] != "Y")
78 $arFields["RANDOM_QUESTIONS"] = "N";
79
80 if (is_set($arFields, "RANDOM_ANSWERS") && $arFields["RANDOM_ANSWERS"] != "Y")
81 $arFields["RANDOM_ANSWERS"] = "N";
82
83 if (is_set($arFields, "DESCRIPTION_TYPE") && $arFields["DESCRIPTION_TYPE"] != "html")
84 $arFields["DESCRIPTION_TYPE"] = "text";
85
86 if (is_set($arFields, "PASSAGE_TYPE") && !in_array($arFields["PASSAGE_TYPE"], Array("0", "1", "2")))
87 $arFields["PASSAGE_TYPE"] = "0";
88
89 if (is_set($arFields, "INCORRECT_CONTROL") && $arFields["INCORRECT_CONTROL"] != "Y")
90 $arFields["INCORRECT_CONTROL"] = "N";
91
92 if (is_set($arFields, "SHOW_ERRORS") && $arFields["SHOW_ERRORS"] != "Y")
93 {
94 $arFields["SHOW_ERRORS"] = "N";
95 $arFields["NEXT_QUESTION_ON_ERROR"] = "Y";
96 }
97
98 if (is_set($arFields, "NEXT_QUESTION_ON_ERROR") && $arFields["NEXT_QUESTION_ON_ERROR"] != "Y")
99 $arFields["NEXT_QUESTION_ON_ERROR"] = "N";
100
101 return true;
102 }
103
104 public function Add($arFields)
105 {
106 global $DB;
107
108 if($this->CheckFields($arFields))
109 {
110 unset($arFields["ID"]);
111
112 CLearnHelper::FireEvent('OnBeforeTestAdd', $arFields);
113
114 $ID = $DB->Add("b_learn_test", $arFields, Array("DESCRIPTION"), "learning");
115
116 $arFields['ID'] = $ID;
117 CLearnHelper::FireEvent('OnAfterTestAdd', $arFields);
118
119 return $ID;
120 }
121
122 return false;
123 }
124
125 public function Update($ID, $arFields)
126 {
127 global $DB;
128
129 $ID = intval($ID);
130 if ($ID < 1) return false;
131
132 if ($this->CheckFields($arFields, $ID))
133 {
134 unset($arFields["ID"]);
135
136 $arBinds = array(
137 "DESCRIPTION" => $arFields["DESCRIPTION"] ?? ''
138 );
139
140 foreach(GetModuleEvents('learning', 'OnBeforeTestUpdate', true) as $arEvent)
142
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);
146
147 foreach(GetModuleEvents('learning', 'OnAfterTestUpdate', true) as $arEvent)
149
150 return true;
151 }
152
153 return false;
154 }
155
156 public static function Delete($ID)
157 {
158 global $DB;
159
160 $ID = intval($ID);
161 if ($ID < 1) return false;
162
163 CLearnHelper::FireEvent('OnBeforeTestDelete', $ID);
164
165 //Gradebook
166 $records = CGradeBook::GetList(Array(), Array("TEST_ID" => $ID));
167 while($arRecord = $records->Fetch())
168 {
169 if(!CGradeBook::Delete($arRecord["ID"]))
170 return false;
171 }
172
173 //Attempts
174 $attempts = CTestAttempt::GetList(Array(), Array("TEST_ID" => $ID));
175 while($arAttempt = $attempts->Fetch())
176 {
177 if(!CTestAttempt::Delete($arAttempt["ID"]))
178 return false;
179 }
180
181 //Marks
182 $marks = CLTestMark::GetList(Array(), Array("TEST_ID" => $ID));
183 while($arMark = $marks->Fetch())
184 {
185 if(!CLTestMark::Delete($arMark["ID"]))
186 return false;
187 }
188
189 //Previous tests
190 $previousTests = CTest::GetList([], ["PREVIOUS_TEST_ID" => $ID]);
191 while ($previousTest = $previousTests->Fetch())
192 {
193 $test = new CTest;
194 $test->Update($previousTest["ID"], ["PREVIOUS_TEST_ID" => 0]);
195 }
196
197 $strSql = "DELETE FROM b_learn_test WHERE ID = ".$ID;
198
199 if (!$DB->Query($strSql))
200 return false;
201
202 CEventLog::add(array(
203 'AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM',
204 'MODULE_ID' => 'learning',
205 'ITEM_ID' => 'T #' . $ID,
206 'DESCRIPTION' => 'test removed'
207 ));
208
209 CLearnHelper::FireEvent('OnAfterTestDelete', $ID);
210
211 return true;
212 }
213
214
215 public static function GetFilter($arFilter)
216 {
217 if (!is_array($arFilter))
218 $arFilter = Array();
219
220 $arSqlSearch = Array();
221
222 foreach ($arFilter as $key => $val)
223 {
225 $key = $res["FIELD"];
226 $cOperationType = $res["OPERATION"];
227
228 $key = mb_strtoupper($key);
229
230 switch ($key)
231 {
232 case "ID":
233 case "SORT":
234 case "COURSE_ID":
235 case "ATTEMPT_LIMIT":
236 case "TIME_LIMIT":
237 case "PREVIOUS_TEST_ID":
238 $arSqlSearch[] = CLearnHelper::FilterCreate("LT.".$key, $val, "number", $bFullJoin, $cOperationType);
239 break;
240
241 case "NAME":
242 case "DESCRIPTION":
243 $arSqlSearch[] = CLearnHelper::FilterCreate("LT.".$key, $val, "string", $bFullJoin, $cOperationType);
244 break;
245
246 case "ACTIVE":
247 case "APPROVED":
248 case "INCLUDE_SELF_TEST":
249 case "RANDOM_ANSWERS":
250 case "RANDOM_QUESTIONS":
251 case "QUESTIONS_FROM":
252 case "QUESTIONS_FROM_ID":
253 case "PASSAGE_TYPE":
254 $arSqlSearch[] = CLearnHelper::FilterCreate("LT.".$key, $val, "string_equal", $bFullJoin, $cOperationType);
255 break;
256 }
257
258 }
259
260 return $arSqlSearch;
261 }
262
263
264 public static function GetByID($ID)
265 {
266 return CTest::GetList($arOrder=Array(), $arFilter=Array("ID" => $ID));
267 }
268
269
270 public static function GetCount($arFilter = Array())
271 {
272 global $DB, $USER, $APPLICATION;
273
274 if (!is_array($arFilter))
275 $arFilter = Array();
276
277 $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter);
278
279 $arSqlSearch = array_filter(CTest::GetFilter($arFilter));
280
281 $strSqlSearch = "";
282
283 if ( ! empty($arSqlSearch) )
284 $strSqlSearch .= ' AND ' . implode(' AND ', $arSqlSearch) . ' ';
285
286 $strSql =
287 "SELECT COUNT(*) as CNT
288 FROM b_learn_test LT
289 INNER JOIN b_learn_course C
290 ON LT.COURSE_ID = C.ID
291 WHERE 1=1";
292
293 if ($oPermParser->IsNeedCheckPerm())
294 $strSql .= " AND C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") ";
295
296 $strSql .= $strSqlSearch;
297
298 $res = $DB->Query($strSql);
299
300 if ($ar = $res->Fetch())
301 return intval($ar["CNT"]);
302 else
303 return 0;
304 }
305
306
307 public static function isPrevPassed($ID, $SCORE)
308 {
309 global $DB, $USER;
310 $ID = intval($ID);
311 $SCORE = intval($SCORE);
312 $strSql = "
313 SELECT *
314 FROM b_learn_gradebook
315 WHERE
316 STUDENT_ID = ".$USER->GetID()." AND
317 COMPLETED='Y' AND
318 TEST_ID = ".$ID." AND
319 1.0*RESULT/MAX_RESULT*100 >= ".$SCORE
320 ;
321
322 $res = $DB->Query($strSql);
323
324 if ($res->Fetch())
325 return true;
326 else
327 return false;
328 }
329
330
331 public static function GetStats($ID)
332 {
333 global $DB;
334
335 $ID = intval($ID);
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())
339 {
340 return array("ALL_CNT" => intval($arStat["ALL_CNT"]), "CORRECT_CNT" => intval($arStat["CORRECT_CNT"]));
341 }
342 else
343 {
344 return array("ALL_CNT" => 0, "CORRECT_CNT" => 0);
345 }
346 }
347
348
349 public static function GetList($arOrder = array(), $arFilter = array(), $arNavParams = array())
350 {
351 global $DB, $USER;
352
353 if (!is_array($arFilter))
354 $arFilter = Array();
355
356 $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter);
357 $arSqlSearch = CTest::GetFilter($arFilter);
358
359 // Remove empty strings from array
360 $arSqlSearch = array_filter($arSqlSearch);
361
362 if ($oPermParser->IsNeedCheckPerm())
363 $arSqlSearch[] = " C.LINKED_LESSON_ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") ";
364
365 $strSqlSearch = ' ';
366 if ( ! empty($arSqlSearch) )
367 {
368 $strSqlSearch = ' WHERE ';
369 $strSqlSearch .= implode(' AND ', $arSqlSearch);
370 }
371
372 $strSqlFrom = "FROM b_learn_test LT ".
373 "INNER JOIN b_learn_course C ON LT.COURSE_ID = C.ID "
374 . $strSqlSearch;
375
376 $strSql =
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 "
387 . $strSqlFrom;
388
389 if (!is_array($arOrder))
390 $arOrder = Array();
391
392 foreach($arOrder as $by=>$order)
393 {
394 $by = mb_strtolower($by);
395 $order = mb_strtolower($order);
396
397 if ($order!="asc")
398 $order = "desc";
399
400 if ($by == "id")
401 $arSqlOrder[] = " LT.ID ".$order." ";
402 elseif ($by == "name")
403 $arSqlOrder[] = " LT.NAME ".$order." ";
404 elseif ($by == "active")
405 $arSqlOrder[] = " LT.ACTIVE ".$order." ";
406 elseif ($by == "sort")
407 $arSqlOrder[] = " LT.SORT ".$order." ";
408 else
409 {
410 $arSqlOrder[] = " LT.TIMESTAMP_X ".$order." ";
411 $by = "timestamp_x";
412 }
413 }
414
415 $strSqlOrder = "";
416 DelDuplicateSort($arSqlOrder);
417
418 if ( ! empty($arSqlOrder) )
419 $strSqlOrder .= ' ORDER BY ' . implode(', ', $arSqlOrder) . ' ';
420
421 $strSql .= $strSqlOrder;
422
423 if (is_array($arNavParams) && ( ! empty($arNavParams) ) )
424 {
425 if (isset($arNavParams['nTopCount']) && ((int) $arNavParams['nTopCount'] > 0))
426 {
427 $strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
428 $res = $DB->Query($strSql);
429 }
430 else
431 {
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);
436 }
437 }
438 else
439 $res = $DB->Query($strSql);
440
441 return $res;
442 }
443}
global $APPLICATION
Определения include.php:80
static Delete($ID)
Определения gradebook.php:111
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
Определения gradebook.php:295
static Delete($ID)
Определения attempt.php:140
static GetList($arOrder=array(), $arFilter=array(), $arSelect=array(), $arNavParams=array())
Определения attempt.php:501
Определения test.php:4
static Delete($ID)
Определения test.php:156
CheckFields(&$arFields, $ID=false)
Определения test.php:5
static GetByID($ID)
Определения test.php:264
static GetStats($ID)
Определения test.php:331
static isPrevPassed($ID, $SCORE)
Определения test.php:307
static GetCount($arFilter=Array())
Определения test.php:270
Add($arFields)
Определения test.php:104
static GetFilter($arFilter)
Определения test.php:215
Update($ID, $arFields)
Определения test.php:125
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
Определения test.php:349
static GetByID($ID)
Определения course.php:307
static Delete($ID)
Определения testmark.php:93
static GetList($arOrder=Array(), $arFilter=Array())
Определения testmark.php:179
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
Определения clearnhelper.php:214
static MkOperationFilter($key)
Определения clearnhelper.php:143
static FireEvent($eventName, $eventParams)
Определения clearnhelper.php:65
Определения test.php:6
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
if($ajaxMode) $ID
Определения get_user.php:27
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
DelDuplicateSort(&$arSort)
Определения tools.php:2055
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$ar
Определения options.php:199
if(empty($signedUserToken)) $key
Определения quickway.php:257
$val
Определения options.php:1793
$GLOBALS['_____370096793']
Определения update_client.php:1
$arFilter
Определения user_search.php:106