1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
gradebook.php
См. документацию.
1<?php
2
4{
5 public static function LessonIdByGradeBookId ($certId)
6 {
7 $rc = CGradeBook::GetByID($certId);
8 if ($rc === false)
10
11 $row = $rc->Fetch();
12
13 if ( ! isset($row['LINKED_LESSON_ID']) )
15
16 return ( (int) $row['LINKED_LESSON_ID'] );
17 }
18
19 public static function CheckFields(&$arFields, $ID = false)
20 {
21 global $DB, $APPLICATION;
22
23 if ($ID===false && !is_set($arFields, "STUDENT_ID"))
24 {
25 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_USER_ID"), "EMPTY_STUDENT_ID");
26 return false;
27 }
28 elseif (is_set($arFields, "STUDENT_ID"))
29 {
30 $dbResult = CUser::GetByID($arFields["STUDENT_ID"]);
31 if (!$dbResult->Fetch())
32 {
33 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_USER_ID_EX"), "ERROR_NO_STUDENT_ID");
34 return false;
35 }
36 }
37
38 if ($ID===false && !is_set($arFields, "TEST_ID"))
39 {
40 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_ID"), "EMPTY_TEST_ID");
41 return false;
42 }
43 elseif (is_set($arFields, "TEST_ID"))
44 {
45 $r = CTest::GetByID($arFields["TEST_ID"]);
46 if(!$r->Fetch())
47 {
48 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_ID_EX"), "ERROR_NO_TEST_ID");
49 return false;
50 }
51 }
52
53 if (is_set($arFields, "STUDENT_ID") && is_set($arFields, "TEST_ID"))
54 {
55 $res = CGradeBook::GetList(Array(), Array("STUDENT_ID" => $arFields["STUDENT_ID"], "TEST_ID" => $arFields["TEST_ID"]));
56 if ($res->Fetch())
57 {
58 $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_GRADEBOOK_DUPLICATE"), "ERROR_GRADEBOOK_DUPLICATE");
59 return false;
60 }
61 }
62
63
64 if (is_set($arFields, "COMPLETED") && $arFields["COMPLETED"] != "Y")
65 $arFields["COMPLETED"] = "N";
66
67 return true;
68 }
69
70 public static function Add($arFields)
71 {
72 global $DB;
73
75 {
76 unset($arFields["ID"]);
77
78 $ID = $DB->Add("b_learn_gradebook", $arFields, Array(), "learning");
79
80 return $ID;
81 }
82
83 return false;
84 }
85
86 public static function Update($ID, $arFields)
87 {
88 global $DB;
89
90 $ID = intval($ID);
91 if ($ID < 1) return false;
92
94 {
95 unset($arFields["ID"]);
96 unset($arFields["STUDENT_ID"]);
97 unset($arFields["TEST_ID"]);
98
99 $arBinds=Array();
100
101 $strUpdate = $DB->PrepareUpdate("b_learn_gradebook", $arFields, "learning");
102 $strSql = "UPDATE b_learn_gradebook SET ".$strUpdate." WHERE ID=".$ID;
103 $DB->QueryBind($strSql, $arBinds);
104
105 return true;
106 }
107
108 return false;
109 }
110
111 public static function Delete($ID)
112 {
113 global $DB;
114
115 $ID = intval($ID);
116 if ($ID < 1) return false;
117
118 $strSql = "SELECT TEST_ID, STUDENT_ID FROM b_learn_gradebook WHERE ID = ".$ID;
119 $res = $DB->Query($strSql);
120 if (!$arGBook = $res->Fetch())
121 return false;
122
123 $attempts = CTestAttempt::GetList(Array(), Array("TEST_ID" => $arGBook["TEST_ID"], "STUDENT_ID" => $arGBook["STUDENT_ID"]));
124 while($arAttempt = $attempts->Fetch())
125 {
126 if(!CTestAttempt::Delete($arAttempt["ID"]))
127 return false;
128 }
129
130 $strSql = "DELETE FROM b_learn_gradebook WHERE ID = ".$ID;
131
132 if (!$DB->Query($strSql))
133 return false;
134
135 return true;
136 }
137
138 public static function GetFilter($arFilter)
139 {
140 if (!is_array($arFilter))
141 $arFilter = Array();
142
143 $arSqlSearch = Array();
144
145 foreach ($arFilter as $key => $val)
146 {
148 $key = $res["FIELD"];
149 $cOperationType = $res["OPERATION"];
150
151 $key = mb_strtoupper($key);
152
153 switch ($key)
154 {
155 case "ID":
156 case "STUDENT_ID":
157 case "TEST_ID":
158 case "RESULT":
159 case "MAX_RESULT":
160 $arSqlSearch[] = CLearnHelper::FilterCreate("G.".$key, $val, "number", $bFullJoin, $cOperationType);
161 break;
162 case "COMPLETED":
163 $arSqlSearch[] = CLearnHelper::FilterCreate("G.".$key, $val, "string_equal", $bFullJoin, $cOperationType);
164 break;
165 case "USER":
166 $arSqlSearch[] = GetFilterQuery("U.ID, U.LOGIN, U.NAME, U.LAST_NAME",$val);
167 break;
168 case "USER_LOGIN":
169 $arSqlSearch[] = CLearnHelper::FilterCreate("U.LOGIN", $val, "string_equal", $bFullJoin, $cOperationType);
170 break;
171
172 case "USER_NAME":
173 $arSqlSearch[] = CLearnHelper::FilterCreate("U.NAME", $val, "string_equal", $bFullJoin, $cOperationType);
174 break;
175
176 case "USER_LAST_NAME":
177 $arSqlSearch[] = CLearnHelper::FilterCreate("U.LAST_NAME", $val, "string_equal", $bFullJoin, $cOperationType);
178 break;
179 }
180
181 }
182
183 return $arSqlSearch;
184 }
185
186 public static function GetByID($ID)
187 {
188 return CGradeBook::GetList(Array(), Array("ID"=>$ID));
189 }
190
191 public static function RecountAttempts($STUDENT_ID,$TEST_ID)
192 {
193 global $DB;
194
195 $STUDENT_ID = intval($STUDENT_ID);
196 $TEST_ID = intval($TEST_ID);
197
198 if ($TEST_ID < 1 || $STUDENT_ID < 1)
199 return false;
200
201 $strSql = "SELECT ID FROM b_learn_gradebook G WHERE STUDENT_ID = '".$STUDENT_ID."' AND TEST_ID = '".$TEST_ID."' ";
202 $res = $DB->Query($strSql);
203 if (!$arG = $res->Fetch())
204 {
205
206 $ID = CGradeBook::Add(Array(
207 "STUDENT_ID" => $STUDENT_ID,
208 "TEST_ID" => $TEST_ID,
209 "RESULT" => "0",
210 "MAX_RESULT" => "0",
211 "COMPLETED" => "N"
212 ));
213
214 return ($ID > 0);
215 }
216
217 $strSql = "SELECT SCORE, MAX_SCORE, COMPLETED ".
218 "FROM b_learn_attempt ".
219 "WHERE STUDENT_ID = '".$STUDENT_ID."' AND TEST_ID = '".$TEST_ID."' ".
220 "ORDER BY COMPLETED DESC, SCORE DESC ";
221
222 $res = $DB->Query($strSql);
223 $res->NavStart();
224
225 if (intval($res->SelectedRowsCount()) == 0)
226 {
227 $strSql = "DELETE FROM b_learn_gradebook WHERE ID = ".$arG["ID"];
228
229 if (!$DB->Query($strSql))
230 return false;
231
232 return true;
233 }
234
235 if (!$ar = $res->Fetch())
236 return false;
237
238 $strSql = "UPDATE b_learn_gradebook SET ATTEMPTS = '".intval($res->SelectedRowsCount())."', COMPLETED = '".$ar["COMPLETED"]."', RESULT = '".intval($ar["SCORE"])."' , MAX_RESULT = '".intval($ar["MAX_SCORE"])."' WHERE STUDENT_ID = '".$STUDENT_ID."' AND TEST_ID = '".$TEST_ID."' ";
239 if (!$DB->Query($strSql))
240 return false;
241
242 return true;
243 }
244
245 public static function GetExtraAttempts($STUDENT_ID, $TEST_ID)
246 {
247 global $DB;
248
249 $STUDENT_ID = intval($STUDENT_ID);
250 $TEST_ID = intval($TEST_ID);
251
252 $strSql = "SELECT EXTRA_ATTEMPTS FROM b_learn_gradebook WHERE STUDENT_ID = ".$STUDENT_ID." AND TEST_ID = ".$TEST_ID."";
253 $rs = $DB->Query($strSql);
254 if (!$ar = $rs->Fetch())
255 {
256 return 0;
257 }
258 else
259 {
260 return $ar["EXTRA_ATTEMPTS"];
261 }
262 }
263
264 public static function AddExtraAttempts($STUDENT_ID, $TEST_ID, $COUNT = 1)
265 {
266 global $DB;
267
268 $STUDENT_ID = intval($STUDENT_ID);
269 $TEST_ID = intval($TEST_ID);
270 $COUNT = intval($COUNT);
271
272 $strSql = "SELECT ID, EXTRA_ATTEMPTS FROM b_learn_gradebook WHERE STUDENT_ID = ".$STUDENT_ID." AND TEST_ID = ".$TEST_ID."";
273 $rs = $DB->Query($strSql);
274 if ( ! ($ar = $rs->Fetch()) )
275 {
276 $ID = CGradeBook::Add(Array(
277 "STUDENT_ID" => $STUDENT_ID,
278 "TEST_ID" => $TEST_ID,
279 "RESULT" => "0",
280 "MAX_RESULT" => "0",
281 "COMPLETED" => "N",
282 "EXTRA_ATTEMPTS" => $COUNT
283 ));
284
285 return ($ID > 0);
286 }
287 else
288 {
289 $strSql = "UPDATE b_learn_gradebook SET EXTRA_ATTEMPTS = ".($ar["EXTRA_ATTEMPTS"] + $COUNT)." WHERE ID = ".$ar["ID"];
290 if (!$DB->Query($strSql))
291 return false;
292 }
293 }
294
295 public static function GetList($arOrder = array(), $arFilter = array(), $arNavParams = array())
296 {
297 global $DB;
298
299 $oPermParser = new CLearnParsePermissionsFromFilter ($arFilter);
300 $arSqlSearch = array_filter(CGradeBook::GetFilter($arFilter));
301
302 $strSqlSearch = '';
303 if ( ! empty($arSqlSearch) )
304 $strSqlSearch .= implode(' AND ', $arSqlSearch);
305
306 //Sites
307 $SqlSearchLang = "''";
308 if (array_key_exists("SITE_ID", $arFilter))
309 {
310 $arLID = Array();
311
312 if(is_array($arFilter["SITE_ID"]))
313 $arLID = $arFilter["SITE_ID"];
314 else
315 {
316 if ($arFilter["SITE_ID"] <> '')
317 $arLID[] = $arFilter["SITE_ID"];
318 }
319
320 foreach($arLID as $v)
321 $SqlSearchLang .= ", '".$DB->ForSql($v, 2)."'";
322 }
323
324 $strSqlFrom = static::__getSqlFromClause($SqlSearchLang);
325
326 if ($oPermParser->IsNeedCheckPerm())
327 $strSqlFrom .= " AND TUL.ID IN (" . $oPermParser->SQLForAccessibleLessons() . ") ";
328
329 if ($strSqlSearch !== '')
330 $strSqlFrom .= ' AND ' . $strSqlSearch;
331
332 $strSql =
333 "SELECT G.*, T.NAME as TEST_NAME, T.COURSE_ID as COURSE_ID,
334 T.APPROVED as TEST_APPROVED,
335 (T.ATTEMPT_LIMIT + G.EXTRA_ATTEMPTS) AS ATTEMPT_LIMIT, TUL.NAME as COURSE_NAME,
336 C.LINKED_LESSON_ID AS LINKED_LESSON_ID, ".
337 $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 ".
338 $strSqlFrom;
339
340 if (!is_array($arOrder))
341 $arOrder = array();
342
343 $arSqlOrder = [];
344
345 foreach($arOrder as $by=>$order)
346 {
347 $by = mb_strtolower($by);
348 $order = mb_strtolower($order);
349 if ($order!="asc")
350 $order = "desc";
351
352 if ($by == "id")
353 $arSqlOrder[] = " G.ID ".$order." ";
354 elseif ($by == "student_id")
355 $arSqlOrder[] = " G.STUDENT_ID ".$order." ";
356 elseif ($by == "test_id")
357 $arSqlOrder[] = " G.TEST_ID ".$order." ";
358 elseif ($by == "completed")
359 $arSqlOrder[] = " G.COMPLETED ".$order." ";
360 elseif ($by == "result")
361 $arSqlOrder[] = " G.RESULT ".$order." ";
362 elseif ($by == "max_result")
363 $arSqlOrder[] = " G.MAX_RESULT ".$order." ";
364 elseif ($by == "user_name")
365 $arSqlOrder[] = " USER_NAME ".$order." ";
366 elseif ($by == "test_name")
367 $arSqlOrder[] = " TEST_NAME ".$order." ";
368 else
369 $arSqlOrder[] = " G.ID ".$order." ";
370 }
371
372 $strSqlOrder = "";
373 DelDuplicateSort($arSqlOrder);
374
375 if (!empty($arSqlOrder))
376 {
377 for ($i=0, $len = count($arSqlOrder); $i < $len; $i++)
378 {
379 if($i==0)
380 $strSqlOrder = " ORDER BY ";
381 else
382 $strSqlOrder .= ",";
383
384 $strSqlOrder .= $arSqlOrder[$i];
385 }
386 }
387
388 $strSql .= $strSqlOrder;
389
390 if (is_array($arNavParams) && ( ! empty($arNavParams) ) )
391 {
392 if (isset($arNavParams['nTopCount']) && ((int) $arNavParams['nTopCount'] > 0))
393 {
394 $strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
395 $res = $DB->Query($strSql);
396 }
397 else
398 {
399 $res_cnt = $DB->Query("SELECT COUNT(G.ID) as C " . $strSqlFrom);
400 $res_cnt = $res_cnt->fetch();
401 $res = new CDBResult();
402 $res->NavQuery($strSql, $res_cnt['C'], $arNavParams);
403 }
404 }
405 else
406 $res = $DB->Query($strSql);
407
408 return $DB->Query($strSql);
409 }
410
418 protected static function __getSqlFromClause($SqlSearchLang)
419 {
420 $strSqlFrom =
421 "FROM b_learn_gradebook G ".
422 "INNER JOIN b_learn_test T ON G.TEST_ID = T.ID ".
423 "INNER JOIN b_user U ON U.ID = G.STUDENT_ID ".
424 "LEFT JOIN b_learn_course C ON C.ID = T.COURSE_ID ".
425 "LEFT JOIN b_learn_lesson TUL ON TUL.ID = C.LINKED_LESSON_ID ".
426 "LEFT JOIN b_learn_test_mark TM ON G.TEST_ID = TM.TEST_ID ".
427 "WHERE (TM.SCORE IS NULL
428 OR TM.SCORE =
429 (
430 SELECT MIN(SCORE) AS SCORE
431 FROM b_learn_test_mark
432 WHERE
433 TEST_ID = G.TEST_ID
434 AND
435 SCORE >=
436 CASE WHEN G.MAX_RESULT > 0
437 THEN
438 (G.RESULT/G.MAX_RESULT*100)
439 ELSE
440 0
441 END
442 )
443 ) ".
444 (mb_strlen($SqlSearchLang) <= 2?"":
445 "AND
446 EXISTS
447 ( SELECT 'x' FROM b_learn_course_site CS
448 WHERE C.ID = CS.COURSE_ID AND CS.SITE_ID IN (".$SqlSearchLang.") ) "
449 );
450
451 return ($strSqlFrom);
452 }
453}
global $APPLICATION
Определения include.php:80
Определения gradebook.php:4
static RecountAttempts($STUDENT_ID, $TEST_ID)
Определения gradebook.php:191
static LessonIdByGradeBookId($certId)
Определения gradebook.php:5
static Delete($ID)
Определения gradebook.php:111
static CheckFields(&$arFields, $ID=false)
Определения gradebook.php:19
static Add($arFields)
Определения gradebook.php:70
static GetByID($ID)
Определения gradebook.php:186
static GetExtraAttempts($STUDENT_ID, $TEST_ID)
Определения gradebook.php:245
static __getSqlFromClause($SqlSearchLang)
Определения gradebook.php:418
static AddExtraAttempts($STUDENT_ID, $TEST_ID, $COUNT=1)
Определения gradebook.php:264
static Update($ID, $arFields)
Определения gradebook.php:86
static GetFilter($arFilter)
Определения gradebook.php:138
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
static GetByID($ID)
Определения test.php:264
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
Определения clearnhelper.php:214
static MkOperationFilter($key)
Определения clearnhelper.php:143
Определения learnexception.php:4
const EXC_ERR_ALL_GIVEUP
Определения learnexception.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
GetFilterQuery($field, $val, $procent="Y", $ex_sep=array(), $clob="N", $div_fields="Y", $clob_upper="N")
Определения filter_tools.php:383
if($ajaxMode) $ID
Определения get_user.php:27
global $DB
Определения cron_frame.php:29
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
$rs
Определения action.php:82
$dbResult
Определения updtr957.php:3
$arFilter
Определения user_search.php:106