1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
testresult.php
См. документацию.
1<?php
2
4{
5 public function CheckFields(&$arFields, $ID = false)
6 {
7 global $DB, $APPLICATION;
8
9 if ($ID===false)
10 {
11 if (is_set($arFields, "ATTEMPT_ID"))
12 {
13 $r = CTestAttempt::GetByID($arFields["ATTEMPT_ID"]);
14 if(!$r->Fetch())
15 {
16 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_ATTEMPT_ID_EX"), "ERROR_NO_ATTEMPT_ID");
17 return false;
18 }
19 }
20 else
21 {
22 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_ATTEMPT_ID"), "EMPTY_ATTEMPT_ID");
23 return false;
24 }
25
26 if (is_set($arFields, "QUESTION_ID"))
27 {
28 $r = CLQuestion::GetByID($arFields["QUESTION_ID"]);
29 if(!$r->Fetch())
30 {
31 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_QUESTION_ID"), "EMPTY_QUESTION_ID");
32 return false;
33 }
34 }
35 else
36 {
37 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_QUESTION_ID"), "EMPTY_QUESTION_ID");
38 return false;
39 }
40 }
41
42 if (is_set($arFields, "RESPONSE") && is_array($arFields["RESPONSE"]))
43 {
44 $s = "";
45 foreach($arFields["RESPONSE"] as $val)
46 $s .= $val.",";
47 $arFields["RESPONSE"] = mb_substr($s, 0, -1);
48 }
49
50 /*
51 if (is_set($arFields, "ANSWERED") && is_set($arFields, "RESPONSE"))
52 {
53 if ($arFields["ANSWERED"]=="Y" && strlen($arFields["RESPONSE"]) <= 0)
54 {
55 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_NO_ANSWERS"), "EMPTY_ANSWERS");
56 return false;
57 }
58 }
59 */
60
61 if (is_set($arFields, "CORRECT") && $arFields["CORRECT"] != "Y")
62 $arFields["CORRECT"] = "N";
63
64 return true;
65 }
66
67 public function Add($arFields)
68 {
69 global $DB;
70
71 if($this->CheckFields($arFields))
72 {
73 unset($arFields["ID"]);
74
75 $ID = $DB->Add("b_learn_test_result", $arFields, Array("RESPONSE"), "learning");
76
77 return $ID;
78 }
79
80 return false;
81 }
82
83 public static function AddResponse($TEST_RESULT_ID, $RESPONSE)
84 {
85 global $DB;
86
87 $TEST_RESULT_ID = intval($TEST_RESULT_ID);
88 if ($TEST_RESULT_ID < 1) return false;
89
90 $rsTestResult = CTestResult::GetList(Array(), Array("ID" => $TEST_RESULT_ID, 'CHECK_PERMISSIONS' => 'N'));
91
92 if ($arTestResult = $rsTestResult->GetNext())
93 {
94 if ($arTestResult["QUESTION_TYPE"] == "T")
95 {
96 $arFields = Array(
97 "ANSWERED" => "Y",
98 "RESPONSE" => $RESPONSE,
99 "POINT"=> 0,
100 "CORRECT"=> "N",
101 );
102 }
103 else
104 {
105 if (!is_array($RESPONSE))
106 $RESPONSE = Array($RESPONSE);
107
108 $strSql =
109 "SELECT A.ID, Q.POINT ".
110 "FROM b_learn_test_result TR ".
111 "INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID ".
112 "INNER JOIN b_learn_answer A ON Q.ID = A.QUESTION_ID ".
113 "WHERE TR.ID = '".$TEST_RESULT_ID."' ".
114 ($arTestResult["QUESTION_TYPE"] != "R" ? "AND A.CORRECT = 'Y' " : "").
115 "ORDER BY A.SORT ASC, A.ID ASC";
116
117 if (!$res = $DB->Query($strSql))
118 return false;
119
120 $arAnswer = Array();
121 while ($arRes = $res->Fetch())
122 {
123 $arAnswer[] = $arRes["ID"];
124 $str_POINT = $arRes["POINT"];
125 }
126
127 if ($arTestResult["QUESTION_TYPE"] == "R")
128 {
129 if ($arAnswer != $RESPONSE)
130 $str_POINT = "0";
131 }
132 else
133 {
134 $t1 = array_diff($arAnswer,$RESPONSE);
135 $t2 = array_diff($RESPONSE,$arAnswer);
136 if ($t1!=$t2 || $t2 != Array())
137 $str_POINT = "0";
138 }
139
140 //echo "!".$str_POINT."!";
141
142 $arFields = Array(
143 "ANSWERED" => "Y",
144 "RESPONSE" => $RESPONSE,
145 "POINT"=> $str_POINT,
146 "CORRECT"=> ($str_POINT == "0" ? "N" : "Y"),
147 );
148 }
149
150 $tr = new CTestResult;
151 if (!$res = $tr->Update($TEST_RESULT_ID, $arFields))
152 return false;
153
154 return $arFields;
155 }
156 else
157 {
158 return false;
159 }
160 }
161
162 public function Update($ID, $arFields)
163 {
164 global $DB;
165
166 $ID = intval($ID);
167 if ($ID < 1) return false;
168
169 if ($this->CheckFields($arFields, $ID))
170 {
171 unset($arFields["ID"]);
172 unset($arFields["QUESTION_ID"]);
173 unset($arFields["ATTEMPT_ID"]);
174
175 $arBinds=Array(
176 "RESPONSE"=>$arFields["RESPONSE"]
177 );
178
179 $strUpdate = $DB->PrepareUpdate("b_learn_test_result", $arFields, "learning");
180 $strSql = "UPDATE b_learn_test_result SET ".$strUpdate." WHERE ID=".$ID;
181 $DB->QueryBind($strSql, $arBinds);
182 return true;
183 }
184
185 return false;
186 }
187
188 public static function Delete($ID)
189 {
190 global $DB;
191
192 $ID = intval($ID);
193 if ($ID < 1) return false;
194
195 $strSql = "DELETE FROM b_learn_test_result WHERE ID = ".$ID;
196
197 if (!$DB->Query($strSql))
198 return false;
199
200 return true;
201 }
202
203 public static function GetList($arOrder=array(), $arFilter=array(), $arNavParams = array())
204 {
205 global $DB, $USER, $APPLICATION;
206
207 if (!is_array($arFilter))
208 $arFilter = Array();
209
210 $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter);
211 $arSqlSearch = CTestResult::GetFilter($arFilter);
212
213 // Remove empty strings from array
214 $arSqlSearch = array_filter($arSqlSearch);
215
216 if ($oPermParser->IsNeedCheckPerm())
217 $arSqlSearch[] = " L.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") ";
218
219 $strSqlSearch = ' ';
220 if ( ! empty($arSqlSearch) )
221 {
222 $strSqlSearch = ' WHERE ';
223 $strSqlSearch .= implode(' AND ', $arSqlSearch);
224 }
225
226 $strSqlFrom = "FROM b_learn_test_result TR
227 INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID
228 INNER JOIN b_learn_lesson L ON Q.LESSON_ID = L.ID "
229 . $strSqlSearch;
230
231 $strSql = "SELECT TR.*, Q.QUESTION_TYPE, Q.NAME as QUESTION_NAME,
232 Q.POINT as QUESTION_POINT, Q.LESSON_ID "
233 . $strSqlFrom;
234
235 if (!is_array($arOrder))
236 $arOrder = Array();
237
238 $arSqlOrder = [];
239 foreach($arOrder as $by=>$order)
240 {
241 $by = mb_strtolower($by);
242 $order = mb_strtolower($order);
243 if ($order!="asc")
244 $order = "desc";
245
246 if ($by == "id")
247 $arSqlOrder[] = " TR.ID ".$order." ";
248 elseif ($by == "attempt_id")
249 $arSqlOrder[] = " TR.ATTEMPT_ID ".$order." ";
250 elseif ($by == "question_id")
251 $arSqlOrder[] = " TR.QUESTION_ID ".$order." ";
252 elseif ($by == "point")
253 $arSqlOrder[] = " TR.POINT ".$order." ";
254 elseif ($by == "correct")
255 $arSqlOrder[] = " TR.CORRECT ".$order." ";
256 elseif ($by == "answered")
257 $arSqlOrder[] = " TR.ANSWERED ".$order." ";
258 elseif ($by == "question_point")
259 $arSqlOrder[] = " QUESTION_POINT ".$order." ";
260 elseif ($by == "question_name")
261 $arSqlOrder[] = " QUESTION_NAME ".$order." ";
262 elseif ($by == "rand")
263 $arSqlOrder[] = CTest::GetRandFunction();
264 else
265 {
266 $arSqlOrder[] = " TR.ID ".$order." ";
267 $by = "id";
268 }
269 }
270
271 $strSqlOrder = "";
272 DelDuplicateSort($arSqlOrder);
273 $arSqlOrderCnt = count($arSqlOrder);
274 for ($i=0; $i<$arSqlOrderCnt; $i++)
275 {
276 if($i==0)
277 $strSqlOrder = " ORDER BY ";
278 else
279 $strSqlOrder .= ",";
280
281 $strSqlOrder .= $arSqlOrder[$i];
282 }
283
284 $strSql .= $strSqlOrder;
285
286 if (is_array($arNavParams) && ( ! empty($arNavParams) ) )
287 {
288 if (isset($arNavParams['nTopCount']) && ((int) $arNavParams['nTopCount'] > 0))
289 {
290 $strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
291 $res = $DB->Query($strSql);
292 }
293 else
294 {
295 $res_cnt = $DB->Query("SELECT COUNT(TR.ID) as C " . $strSqlFrom);
296 $res_cnt = $res_cnt->fetch();
297 $res = new CDBResult();
298 $res->NavQuery($strSql, $res_cnt['C'], $arNavParams);
299 }
300 }
301 else
302 $res = $DB->Query($strSql);
303
304 return $res;
305 }
306
307 public static function GetByID($ID)
308 {
309 return CTestResult::GetList(Array(), Array("ID"=>$ID));
310 }
311
312 public static function GetFilter($arFilter)
313 {
314 if (!is_array($arFilter))
315 $arFilter = Array();
316
317 $arSqlSearch = Array();
318
319 foreach ($arFilter as $key => $val)
320 {
322 $key = $res["FIELD"];
323 $cOperationType = $res["OPERATION"];
324
325 $key = mb_strtoupper($key);
326
327 switch ($key)
328 {
329 case "ID":
330 case "ATTEMPT_ID":
331 case "QUESTION_ID":
332 case "POINT":
333 $arSqlSearch[] = CLearnHelper::FilterCreate("TR.".$key, $val, "number", $bFullJoin, $cOperationType);
334 break;
335
336 case "RESPONSE":
337 $arSqlSearch[] = CLearnHelper::FilterCreate("TR.".$key, $val, "string", $bFullJoin, $cOperationType);
338 break;
339
340 case "QUESTION_NAME":
341 $arSqlSearch[] = CLearnHelper::FilterCreate("Q.NAME", $val, "string", $bFullJoin, $cOperationType);
342 break;
343
344 case "ANSWERED":
345 case "CORRECT":
346 $arSqlSearch[] = CLearnHelper::FilterCreate("TR.".$key, $val, "string_equal", $bFullJoin, $cOperationType);
347 break;
348 }
349 }
350
351 return $arSqlSearch;
352 }
353
354 public static function OnTestResultChange($TEST_RESULT_ID)
355 {
356 global $DB;
357
358 $TEST_RESULT_ID = intval($TEST_RESULT_ID);
359
360 if ($TEST_RESULT_ID < 1)
361 return false;
362
363 $strSql =
364 "SELECT TR.* ".
365 "FROM b_learn_test_result TR ".
366 "WHERE TR.ID = '".$TEST_RESULT_ID."'";
367
368 $res = $DB->Query($strSql);
369 if (!$arAttemptResult = $res->Fetch())
370 return false;
371
372 $strSql =
373 "SELECT SUM(TR.POINT) as SUM_POINT, SUM( Q.POINT ) MAX_POINT ".
374 "FROM b_learn_test_result TR ".
375 "INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID ".
376 "WHERE TR.ATTEMPT_ID = '".$arAttemptResult["ATTEMPT_ID"]."'";
377
378 $res = $DB->Query($strSql);
379 if (!$arSum = $res->Fetch())
380 return false;
381
382 $strSql =
383 "UPDATE b_learn_attempt SET SCORE = '".$arSum["SUM_POINT"]."', MAX_SCORE ='".$arSum["MAX_POINT"]."' ".
384 "WHERE ID = '".$arAttemptResult["ATTEMPT_ID"]."'";
385
386 if (!$res = $DB->Query($strSql))
387 return false;
388
389 return CTestAttempt::OnAttemptChange($arAttemptResult["ATTEMPT_ID"]);
390 }
391
392 public static function GetProgress($ATTEMPT_ID)
393 {
394 global $DB;
395 $ATTEMPT_ID = intval($ATTEMPT_ID);
396 $res=array("DONE"=>0, "TODO"=>0);
397 $strSql = "SELECT ANSWERED,COUNT(*) C ".
398 "FROM b_learn_test_result ".
399 "WHERE ATTEMPT_ID = ".$ATTEMPT_ID." ".
400 "GROUP BY ANSWERED";
401 $rs=$DB->Query($strSql);
402 while($ar=$rs->Fetch())
403 {
404 if($ar["ANSWERED"]=="Y")
405 $res["DONE"]=$ar["C"];
406 elseif($ar["ANSWERED"]=="N")
407 $res["TODO"]=$ar["C"];
408 }
409 return $res;
410 }
411
412 public static function GetCount($ATTEMPT_ID)
413 {
414 global $DB;
415
416 $strSql =
417 "SELECT COUNT(*) as C ".
418 "FROM b_learn_test_result TR ".
419 "WHERE TR.ATTEMPT_ID = '".intval($ATTEMPT_ID)."'";
420
421 $res = $DB->Query($strSql);
422 $res_cnt = $res->Fetch();
423
424 return intval($res_cnt["C"]);
425
426 /*$strSql =
427 "SELECT COUNT(*) as CNT, SUM(Q.POINT) MAX_SCORE ".
428 "FROM b_learn_test_result TR ".
429 "INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID ".
430 "WHERE TR.ATTEMPT_ID = '".intval($ATTEMPT_ID)."'";
431 */
432 }
433
434 public static function GetPercent($ATTEMPT_ID)
435 {
436 global $DB;
437
438 $strSql =
439 "SELECT ROUND(SUM(CASE WHEN TR.CORRECT = 'Y' THEN Q.POINT ELSE 0 END) * 100 / SUM(Q.POINT), 4) as PCNT ".
440 "FROM b_learn_test_result TR, b_learn_question Q ".
441 "WHERE TR.ATTEMPT_ID = '".intval($ATTEMPT_ID)."' AND TR.QUESTION_ID = Q.ID";
442
443 if (!$res = $DB->Query($strSql))
444 return false;
445
446 if (!$arStat = $res->Fetch())
447 return false;
448
449 // Round bottom in right way, some magic due to IEEE 754
450 return ( (int) (floor($arStat["PCNT"] + 0.00001) + 0.00001) );
451 }
452
453 public static function GetCorrectCount($ATTEMPT_ID)
454 {
455 global $DB;
456
457 $strSql = "SELECT SUM(CASE WHEN TR.CORRECT = 'Y' THEN 1 ELSE 0 END) AS CNT FROM b_learn_test_result TR WHERE TR.ATTEMPT_ID = ".intval($ATTEMPT_ID)." GROUP BY ATTEMPT_ID";
458
459 if (!$res = $DB->Query($strSql))
460 return 0;
461
462 if (!$arStat = $res->Fetch())
463 return 0;
464
465 return $arStat["CNT"];
466 }
467}
global $APPLICATION
Определения include.php:80
static GetByID($ID)
Определения attempt.php:226
static OnAttemptChange($ATTEMPT_ID, $bCOMPLETED=false)
Определения attempt.php:298
static GetByID($ID)
Определения question.php:242
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
Определения clearnhelper.php:214
static MkOperationFilter($key)
Определения clearnhelper.php:143
static GetRandFunction()
Определения test.php:7
Определения testresult.php:4
static Delete($ID)
Определения testresult.php:188
CheckFields(&$arFields, $ID=false)
Определения testresult.php:5
static GetPercent($ATTEMPT_ID)
Определения testresult.php:434
static GetByID($ID)
Определения testresult.php:307
static OnTestResultChange($TEST_RESULT_ID)
Определения testresult.php:354
static GetCorrectCount($ATTEMPT_ID)
Определения testresult.php:453
static GetCount($ATTEMPT_ID)
Определения testresult.php:412
static GetProgress($ATTEMPT_ID)
Определения testresult.php:392
static AddResponse($TEST_RESULT_ID, $RESPONSE)
Определения testresult.php:83
Add($arFields)
Определения testresult.php:67
static GetFilter($arFilter)
Определения testresult.php:312
Update($ID, $arFields)
Определения testresult.php:162
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
Определения testresult.php:203
$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
DelDuplicateSort(&$arSort)
Определения tools.php:2055
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
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
$val
Определения options.php:1793
$arRes
Определения options.php:104
$rs
Определения action.php:82
$arFilter
Определения user_search.php:106