1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
question.php
См. документацию.
1<?
2// 2012-04-11 Checked/modified for compatibility with new data model
4{
5 function CheckFields(&$arFields, $ID = false)
6 {
7 global $DB, $USER;
8 $arMsg = Array();
9
10 if ( (is_set($arFields, "NAME") || $ID === false) && trim($arFields["NAME"]) == '')
11 $arMsg[] = array("id"=>"NAME", "text"=> GetMessage("LEARNING_BAD_NAME"));
12
13
14 if (is_set($arFields, "FILE_ID"))
15 {
16 $error = CFile::CheckImageFile($arFields["FILE_ID"]);
17 if ($error <> '')
18 $arMsg[] = array("id"=>"FILE_ID", "text"=> $error);
19 }
20
21 if(empty($this->LAST_ERROR))
22 {
23 if (
24 ($ID === false && !is_set($arFields, "LESSON_ID"))
25 ||
26 (is_set($arFields, "LESSON_ID") && intval($arFields["LESSON_ID"]) < 1)
27 )
28 {
29 $arMsg[] = array("id"=>"LESSON_ID", "text"=> GetMessage("LEARNING_BAD_LESSON_ID"));
30 }
31 elseif (is_set($arFields, "LESSON_ID"))
32 {
33 $res = CLearnLesson::GetByID($arFields["LESSON_ID"]);
34 if($arRes = $res->Fetch())
35 {
37
38 $bAccessLessonModify =
40 || $oAccess->IsLessonAccessible ($arFields["LESSON_ID"], CLearnAccess::OP_LESSON_WRITE);
41
42 if ( ! $bAccessLessonModify )
43 $arMsg[] = array("id"=>"LESSON_ID", "text"=> GetMessage("LEARNING_BAD_LESSON_ID_EX"));
44 }
45 else
46 {
47 $arMsg[] = array("id"=>"LESSON_ID", "text"=> GetMessage("LEARNING_BAD_LESSON_ID_EX"));
48 }
49 }
50 }
51
52 if(!empty($arMsg))
53 {
54 $e = new CAdminException($arMsg);
55 $GLOBALS["APPLICATION"]->ThrowException($e);
56 return false;
57 }
58
59 if (is_set($arFields, "QUESTION_TYPE") && !in_array($arFields["QUESTION_TYPE"], Array("S", "M", "T", "R")))
60 $arFields["QUESTION_TYPE"] = "S";
61
62 if (is_set($arFields, "DESCRIPTION_TYPE") && $arFields["DESCRIPTION_TYPE"] != "html")
63 $arFields["DESCRIPTION_TYPE"] = "text";
64
65 if (is_set($arFields, "DIRECTION") && $arFields["DIRECTION"] != "H")
66 $arFields["DIRECTION"] = "V";
67
68 if (is_set($arFields, "SELF") && $arFields["SELF"] != "Y")
69 $arFields["SELF"] = "N";
70
71 if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
72 $arFields["ACTIVE"] = "N";
73
74 if (is_set($arFields, "EMAIL_ANSWER") && $arFields["EMAIL_ANSWER"] != "Y")
75 $arFields["EMAIL_ANSWER"] = "N";
76
77 if (is_set($arFields, "CORRECT_REQUIRED") && $arFields["CORRECT_REQUIRED"] != "Y")
78 $arFields["CORRECT_REQUIRED"] = "N";
79
80 return true;
81 }
82
83
84 function Add($arFields)
85 {
87
88 if (
90 && $USER_FIELD_MANAGER->CheckFields('LEARNING_QUESTIONS', 0, $arFields)
91 )
92 {
93 unset($arFields["ID"]);
94
95 if (
96 array_key_exists("FILE_ID", $arFields)
97 && is_array($arFields["FILE_ID"])
98 && (
99 !array_key_exists("MODULE_ID", $arFields["FILE_ID"])
100 || $arFields["FILE_ID"]["MODULE_ID"] == ''
101 )
102 )
103 $arFields["FILE_ID"]["MODULE_ID"] = "learning";
104
105 CFile::SaveForDB($arFields, "FILE_ID", "learning");
106
107 $ID = $DB->Add("b_learn_question", $arFields, array("DESCRIPTION", 'COMMENT_TEXT', 'INCORRECT_MESSAGE'));
108
109 if ($ID)
110 $USER_FIELD_MANAGER->Update('LEARNING_QUESTIONS', $ID, $arFields);
111
112 foreach(GetModuleEvents('learning', 'OnAfterQuestionAdd', true) as $arEvent)
114
115 return $ID;
116 }
117
118 return false;
119 }
120
121
123 {
124 global $DB, $USER_FIELD_MANAGER;
125
126 $ID = intval($ID);
127 if ($ID < 1) return false;
128
129 if (is_set($arFields, "FILE_ID"))
130 {
131 if($arFields["FILE_ID"]["name"] == '' && $arFields["FILE_ID"]["del"] == '' && $arFields["FILE_ID"]["description"] == '')
132 unset($arFields["FILE_ID"]);
133 else
134 {
135 $pic_res = $DB->Query("SELECT FILE_ID FROM b_learn_question WHERE ID=".$ID);
136 if($pic_res = $pic_res->Fetch())
137 $arFields["FILE_ID"]["old_file"]=$pic_res["FILE_ID"];
138 }
139 }
140
141 if (
142 $this->CheckFields($arFields, $ID)
143 && $USER_FIELD_MANAGER->CheckFields('LEARNING_QUESTIONS', $ID, $arFields)
144 )
145 {
146 unset($arFields["ID"]);
147
148 $arBinds=Array(
149 "DESCRIPTION" => $arFields["DESCRIPTION"] ?? '',
150 'COMMENT_TEXT' => $arFields['COMMENT_TEXT'] ?? '',
151 'INCORRECT_MESSAGE' => $arFields['INCORRECT_MESSAGE'] ?? ''
152 );
153
154 if (
155 array_key_exists("FILE_ID", $arFields)
156 && is_array($arFields["FILE_ID"])
157 && (
158 !array_key_exists("MODULE_ID", $arFields["FILE_ID"])
159 || $arFields["FILE_ID"]["MODULE_ID"] == ''
160 )
161 )
162 $arFields["FILE_ID"]["MODULE_ID"] = "learning";
163
164 CFile::SaveForDB($arFields, "FILE_ID", "learning");
165
166 $USER_FIELD_MANAGER->Update('LEARNING_QUESTIONS', $ID, $arFields);
167 $strUpdate = $DB->PrepareUpdate("b_learn_question", $arFields);
168 if ($strUpdate !== '')
169 {
170 $strSql = "UPDATE b_learn_question SET ".$strUpdate." WHERE ID=".$ID;
171 $DB->QueryBind($strSql, $arBinds);
172 }
173
174 foreach(GetModuleEvents('learning', 'OnAfterQuestionUpdate', true) as $arEvent)
176
177 return true;
178 }
179 return false;
180 }
181
182
183 public static function Delete($ID)
184 {
185 global $DB, $USER_FIELD_MANAGER;
186
187 $ID = intval($ID);
188 if ($ID < 1) return false;
189
190 $strSql = "SELECT FILE_ID FROM b_learn_question WHERE ID = ".$ID;
191 $r = $DB->Query($strSql);
192 if (!$arQuestion = $r->Fetch())
193 return false;
194
195 $answers = CLAnswer::GetList(Array(), Array("QUESTION_ID" => $ID));
196 while($arAnswer = $answers->Fetch())
197 {
198 if(!CLAnswer::Delete($arAnswer["ID"]))
199 return false;
200 }
201
202 $arAttempts = Array();
203 $strSql = "SELECT ATTEMPT_ID FROM b_learn_test_result WHERE QUESTION_ID = ".$ID;
204 $res = $DB->Query($strSql);
205 while($ar = $res->Fetch())
206 $arAttempts[] = $ar["ATTEMPT_ID"]; //Attempts to recount
207
208 //Results
209 $strSql = "DELETE FROM b_learn_test_result WHERE QUESTION_ID = ".$ID;
210 if (!$DB->Query($strSql))
211 return false;
212
213 foreach($arAttempts as $ATTEMPT_ID)
214 {
217 }
218
219 $strSql = "DELETE FROM b_learn_question WHERE ID = ".$ID;
220
221 if (!$DB->Query($strSql))
222 return false;
223
224 $USER_FIELD_MANAGER->delete('LEARNING_QUESTIONS', $ID);
225
226 CFile::Delete($arQuestion["FILE_ID"]);
227
228 CEventLog::add(array(
229 'AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM',
230 'MODULE_ID' => 'learning',
231 'ITEM_ID' => 'Q #' . $ID,
232 'DESCRIPTION' => 'question removed'
233 ));
234
235 foreach(GetModuleEvents('learning', 'OnAfterQuestionDelete', true) as $arEvent)
236 ExecuteModuleEventEx($arEvent, array($ID, $arQuestion));
237
238 return true;
239 }
240
241
242 public static function GetByID($ID)
243 {
244 return CLQuestion::GetList($arOrder=Array(), $arFilter=Array("ID" => $ID));
245 }
246
247
248 public static function GetFilter($arFilter)
249 {
250 if (!is_array($arFilter))
251 $arFilter = Array();
252
253 $arSqlSearch = Array();
254
255 foreach ($arFilter as $key => $val)
256 {
258 $key = $res["FIELD"];
259 $cOperationType = $res["OPERATION"];
260
261 $key = mb_strtoupper($key);
262
263 switch ($key)
264 {
265 case "ID":
266 case "SORT":
267 case "LESSON_ID":
268 case "POINT":
269 $arSqlSearch[] = CLearnHelper::FilterCreate("CQ.".$key, $val, "number", $bFullJoin, $cOperationType);
270 break;
271
272 case "COURSE_ID":
273 // was: $arSqlSearch[] = CLearnHelper::FilterCreate("C.".$key, $val, "number", $bFullJoin, $cOperationType);
274
275 $courseLessonId = CCourse::CourseGetLinkedLesson ($val);
276 if ($courseLessonId === false)
277 break; // it is not a course, so skipping
278
279 // MySQL & MSSQL supports "WHERE IN(...)" clause for more than 10 000 elements
280
281 // add to sql "WHERE" constraint: lessons id only from given array
282 $sqlCourseLessonsIdsList = '';
283
284 $oTree = CLearnLesson::GetTree($courseLessonId);
285 $arChildLessonForCourse = $oTree->GetLessonsIdListInTree();
286
287 // root lesson not in tree, so add it
288 $arChildLessonForCourse[] = $courseLessonId;
289
290 // We need escape data for SQL
291 $arChildLessonForCourseEscaped = array_map('intval', $arChildLessonForCourse);
292
293 $sqlCourseLessonsIdsList = implode (', ', $arChildLessonForCourseEscaped);
294
295 if ($sqlCourseLessonsIdsList <> '')
296 $arSqlSearch[] = 'CQ.LESSON_ID IN (' . $sqlCourseLessonsIdsList . ')';
297
298 break;
299
300 case "NAME":
301 $arSqlSearch[] = CLearnHelper::FilterCreate("CQ.".$key, $val, "string", $bFullJoin, $cOperationType);
302 break;
303
304 case "QUESTION_TYPE":
305 case "ACTIVE":
306 case "SELF":
307 case "CORRECT_REQUIRED":
308 $arSqlSearch[] = CLearnHelper::FilterCreate("CQ.".$key, $val, "string_equal", $bFullJoin, $cOperationType);
309 break;
310 }
311
312 }
313
314 return $arSqlSearch;
315 }
316
317
318 public static function GetList($arOrder = array(), $arFilter = array(), $bHz = false, $arNavParams = array(), $arSelect = array())
319 {
321
322 $obUserFieldsSql = new CUserTypeSQL();
323 $obUserFieldsSql->SetEntity('LEARNING_QUESTIONS', "CQ.ID");
324 $obUserFieldsSql->SetSelect($arSelect);
325 $obUserFieldsSql->SetFilter($arFilter);
326 $obUserFieldsSql->SetOrder($arOrder);
327
328 $arSqlSearch = array_filter(CLQuestion::GetFilter($arFilter));
329
330 $strSqlFrom = "FROM b_learn_question CQ "
331 . "INNER JOIN b_learn_lesson CL ON CQ.LESSON_ID = CL.ID "
332 . $obUserFieldsSql->GetJoin("CQ.ID")
333 . " WHERE ";
334
335 $r = $obUserFieldsSql->GetFilter();
336 if ($r <> '')
337 $arSqlSearch[] = "(".$r.")";
338
339 if ( ! empty($arSqlSearch) )
340 $strSqlFrom .= implode(' AND ', $arSqlSearch);
341 else
342 $strSqlFrom .= ' 1=1 ';
343
344 $strSql = "SELECT CQ.ID, CQ.ACTIVE, CQ.LESSON_ID, CQ.QUESTION_TYPE,
345 CQ.NAME, CQ.SORT, CQ.DESCRIPTION, CQ.DESCRIPTION_TYPE,
346 CQ.COMMENT_TEXT, CQ.FILE_ID, CQ.SELF, CQ.POINT, CQ.DIRECTION,
347 CQ.CORRECT_REQUIRED, CQ.EMAIL_ANSWER, CQ.INCORRECT_MESSAGE,"
348 . $DB->DateToCharFunction("CQ.TIMESTAMP_X")." as TIMESTAMP_X "
349 . $obUserFieldsSql->GetSelect()
350 . " "
351 . $strSqlFrom;
352
353 if (!is_array($arOrder))
354 $arOrder = Array();
355
356 $arSqlOrder = [];
357 foreach($arOrder as $by=>$order)
358 {
359 $by = mb_strtolower($by);
360 $order = mb_strtolower($order);
361 if ($order!="asc")
362 $order = "desc";
363
364 if ($by == "id")
365 $arSqlOrder[] = " CQ.ID ".$order." ";
366 elseif ($by == "name")
367 $arSqlOrder[] = " CQ.NAME ".$order." ";
368 elseif ($by == "sort")
369 $arSqlOrder[] = " CQ.SORT ".$order." ";
370 elseif ($by == "point")
371 $arSqlOrder[] = " CQ.POINT ".$order." ";
372 elseif ($by == "type")
373 $arSqlOrder[] = " CQ.QUESTION_TYPE ".$order." ";
374 elseif ($by == "self")
375 $arSqlOrder[] = " CQ.SELF ".$order." ";
376 elseif ($by == "active")
377 $arSqlOrder[] = " CQ.ACTIVE ".$order." ";
378 elseif ($by == "correct_required")
379 $arSqlOrder[] = " CQ.CORRECT_REQUIRED ".$order." ";
380 elseif ($s = $obUserFieldsSql->getOrder($by))
381 $arSqlOrder[] = ' ' . $s . ' ' . $order . ' ';
382 else
383 $arSqlOrder[] = " CQ.TIMESTAMP_X ".$order." ";
384 }
385
386 $strSqlOrder = "";
387 DelDuplicateSort($arSqlOrder);
388 $cnt = count($arSqlOrder);
389 for ($i=0; $i<$cnt; $i++)
390 {
391 if($i==0)
392 $strSqlOrder = " ORDER BY ";
393 else
394 $strSqlOrder .= ",";
395
396 $strSqlOrder .= $arSqlOrder[$i];
397 }
398
399 $strSql .= $strSqlOrder;
400
401 if (is_array($arNavParams) && ( ! empty($arNavParams) ) )
402 {
403 if (isset($arNavParams['nTopCount']) && ((int) $arNavParams['nTopCount'] > 0))
404 {
405 $strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
406 $res = $DB->Query($strSql);
407 }
408 else
409 {
410 $res_cnt = $DB->Query("SELECT COUNT(CQ.ID) as C " . $strSqlFrom);
411 $res_cnt = $res_cnt->fetch();
412 $res = new CDBResult();
413 $res->NavQuery($strSql, $res_cnt['C'], $arNavParams);
414 }
415 }
416 else
417 $res = $DB->Query($strSql);
418
419 $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields('LEARNING_QUESTIONS'));
420
421 return $res;
422 }
423
424
425 public static function GetCount($arFilter=Array())
426 {
427 global $DB;
428
429 $arSqlSearch = CLQuestion::GetFilter($arFilter);
430
431 $strSqlSearch = "";
432 $cnt = count($arSqlSearch);
433 for($i=0; $i<$cnt; $i++)
434 if($arSqlSearch[$i] <> '')
435 $strSqlSearch .= " AND ".$arSqlSearch[$i]." ";
436
437 $strSql =
438 "SELECT COUNT(DISTINCT CQ.ID) as C ".
439 "FROM b_learn_question CQ ".
440 "INNER JOIN b_learn_lesson CL ON CQ.LESSON_ID = CL.ID ".
441 "WHERE 1=1 ".
442 $strSqlSearch;
443
444 $res = $DB->Query($strSql);
445 $res_cnt = $res->Fetch();
446
447 return intval($res_cnt["C"]);
448 }
449}
static RecountQuestions($ATTEMPT_ID)
Определения attempt.php:418
static OnAttemptChange($ATTEMPT_ID, $bCOMPLETED=false)
Определения attempt.php:298
static CourseGetLinkedLesson($courseId)
Определения course.php:55
static Delete($ID)
Определения answer.php:88
static GetList($arOrder=Array(), $arFilter=Array())
Определения answer.php:148
Определения question.php:4
static Delete($ID)
Определения question.php:183
CheckFields(&$arFields, $ID=false)
Определения question.php:5
static GetByID($ID)
Определения question.php:242
static GetList($arOrder=array(), $arFilter=array(), $bHz=false, $arNavParams=array(), $arSelect=array())
Определения question.php:318
static GetCount($arFilter=Array())
Определения question.php:425
Add($arFields)
Определения question.php:84
static GetFilter($arFilter)
Определения question.php:248
Update($ID, $arFields)
Определения question.php:122
static GetInstance($in_userId)
Определения clearnaccess.php:171
const OP_LESSON_WRITE
Определения clearnaccess.php:140
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
Определения clearnhelper.php:214
static MkOperationFilter($key)
Определения clearnhelper.php:143
static GetByID($id)
Определения clearnlesson.php:1148
static GetTree( $lessonId, $arOrder=array('EDGE_SORT'=> 'asc'), $arFilter=array(), $publishProhibitionMode=true, $arSelectFields=array())
Определения clearnlesson.php:1867
Определения usertypesql.php:4
$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
global $USER_FIELD_MANAGER
Определения attempt.php:6
if($ajaxMode) $ID
Определения get_user.php:27
$oAccess
Определения options.php:19
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
$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
$error
Определения subscription_card_product.php:20
$GLOBALS['_____370096793']
Определения update_client.php:1
$arFilter
Определения user_search.php:106