1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
task.php
См. документацию.
1<?php
2
9
14
16{
17 protected static $TASK_OPERATIONS_CACHE = [];
18
19 public static function CheckFields(&$arFields, $ID = false)
20 {
21 global $APPLICATION;
22
23 if ($ID > 0)
24 {
25 unset($arFields["ID"]);
26 }
27
28 $arMsg = [];
29
30 if (($ID === false || isset($arFields["NAME"])) && $arFields["NAME"] == '')
31 {
32 $arMsg[] = ["id" => "NAME", "text" => GetMessage('MAIN_ERROR_STRING_ID_EMPTY')];
33 }
34
35 $filter = ['=NAME' => $arFields['NAME']];
36 if ($ID !== false)
37 {
38 $filter['!=ID'] = $ID;
39 }
40 if (TaskTable::getList(['select' => ['ID'], 'filter' => $filter])->fetch())
41 {
42 $arMsg[] = ["id" => "NAME", "text" => GetMessage('MAIN_ERROR_STRING_ID_DOUBLE')];
43 }
44
45 if (isset($arFields['LETTER']))
46 {
47 if (preg_match("/[^A-Z]/i", $arFields['LETTER']) || strlen($arFields['LETTER']) > 1)
48 {
49 $arMsg[] = ["id" => "LETTER", "text" => GetMessage('MAIN_TASK_WRONG_LETTER')];
50 }
51 $arFields['LETTER'] = strtoupper($arFields['LETTER']);
52 }
53 else
54 {
55 $arFields['LETTER'] = '';
56 }
57
58 if (!empty($arMsg))
59 {
60 $e = new CAdminException($arMsg);
61 $APPLICATION->ThrowException($e);
62 return false;
63 }
64 if (!isset($arFields['SYS']) || $arFields['SYS'] != "Y")
65 {
66 $arFields['SYS'] = "N";
67 }
68 if (!isset($arFields['BINDING']))
69 {
70 $arFields['BINDING'] = 'module';
71 }
72
73 return true;
74 }
75
76 protected static function getOwnFields(array $arFields): array
77 {
78 $entity = TaskTable::getEntity();
79 $fields = [];
80 foreach ($arFields as $field => $value)
81 {
82 if ($entity->hasField($field))
83 {
84 $fields[$field] = $value;
85 }
86 }
87 return $fields;
88 }
89
90 public static function Add($arFields)
91 {
92 if (!static::CheckFields($arFields))
93 {
94 return false;
95 }
96
97 $result = TaskTable::add(static::getOwnFields($arFields));
98
99 return $result->isSuccess() ? $result->getId() : false;
100 }
101
102 public static function Update($arFields, $ID)
103 {
104 if (!static::CheckFields($arFields, $ID))
105 {
106 return false;
107 }
108
109 $result = TaskTable::update($ID, static::getOwnFields($arFields));
110
111 return $result->isSuccess();
112 }
113
114 public static function UpdateModuleRights($id, $moduleId, $letter, $site_id = false)
115 {
116 global $DB;
117
118 if (!isset($id, $moduleId))
119 {
120 return false;
121 }
122
123 $sql = "SELECT GT.GROUP_ID
124 FROM b_group_task GT
125 WHERE GT.TASK_ID=" . intval($id);
126 $z = $DB->Query($sql);
127
128 $arGroups = [];
129 while ($r = $z->Fetch())
130 {
131 $g = intval($r['GROUP_ID']);
132 if ($g > 0)
133 {
134 $arGroups[] = $g;
135 }
136 }
137 if (empty($arGroups))
138 {
139 return false;
140 }
141
142 $str_groups = implode(',', $arGroups);
143 $moduleId = $DB->ForSQL($moduleId);
144 $DB->Query(
145 "DELETE FROM b_module_group
146 WHERE
147 MODULE_ID = '" . $moduleId . "' AND
148 SITE_ID " . ($site_id ? "='" . $site_id . "'" : "IS NULL") . " AND
149 GROUP_ID IN (" . $str_groups . ")"
150 );
151
152 if ($letter != '')
153 {
154 $letter = $DB->ForSQL($letter);
155 $DB->Query(
156 "INSERT INTO b_module_group (MODULE_ID, GROUP_ID, G_ACCESS, SITE_ID) " .
157 "SELECT '" . $moduleId . "', G.ID, '" . $letter . "', " . ($site_id ? "'" . $site_id . "'" : "NULL") . " " .
158 "FROM b_group G " .
159 "WHERE G.ID IN (" . $str_groups . ")"
160 );
161 }
162
163 ModuleGroupTable::cleanCache();
164
165 return ($letter != '');
166 }
167
168 public static function Delete($ID, $protect = true)
169 {
170 $ID = intval($ID);
171
172 $delete = !$protect;
173 if ($protect)
174 {
175 $delete = TaskTable::getList(['select' => ['ID'], 'filter' => ['=ID' => $ID, '=SYS' => 'N']])->fetch();
176 }
177
178 if ($delete)
179 {
180 TaskTable::delete($ID);
181 TaskOperationTable::deleteByFilter(['=TASK_ID' => $ID]);
182 }
183 }
184
185 public static function GetList($arOrder = ['MODULE_ID' => 'asc', 'LETTER' => 'asc'], $arFilter = [])
186 {
187 $arOrder = static::getOwnFields((array)$arOrder);
188 $arFilter = static::getOwnFields((array)$arFilter);
189
190 $filter = [];
191 foreach ($arFilter as $field => $value)
192 {
193 if ((string)$value == '' || (string)$value == 'NOT_REF')
194 {
195 continue;
196 }
197 if (is_string($value) && str_contains($value, '|'))
198 {
199 $value = explode('|', $value);
200 }
201 $filter['=' . $field] = $value;
202 }
203
204 $order = [];
205 foreach ($arOrder as $field => $direction)
206 {
207 $order[strtoupper($field)] = (strtoupper($direction) == 'DESC' ? 'DESC' : 'ASC');
208 }
209
210 $res = TaskTable::getList([
211 'filter' => $filter,
212 'order' => $order,
213 'cache' => ['ttl' => 3600],
214 ]);
215
216 $arResult = [];
217 while ($arRes = $res->fetch())
218 {
219 $arRes['TITLE'] = static::GetLangTitle($arRes['NAME'], $arRes['MODULE_ID']);
220 $arRes['DESC'] = static::GetLangDescription($arRes['NAME'], $arRes['DESCRIPTION'], $arRes['MODULE_ID']);
221 $arResult[] = $arRes;
222 }
223
224 $result = new CDBResult();
225 $result->InitFromArray($arResult);
226
227 return $result;
228 }
229
230 public static function GetOperations($ID, $return_names = false)
231 {
232 $ID = intval($ID);
233
234 if (!isset(static::$TASK_OPERATIONS_CACHE[$ID]))
235 {
236 static::$TASK_OPERATIONS_CACHE[$ID] = [];
237
238 $operations = TaskOperationTable::getList([
239 'select' => ['OPERATION_ID', 'NAME' => 'OPERATION.NAME'],
240 'filter' => ['=TASK_ID' => $ID],
241 'cache' => ['ttl' => 3600, 'cache_joins' => true],
242 ]);
243
244 while ($operation = $operations->fetch())
245 {
246 static::$TASK_OPERATIONS_CACHE[$ID]['ids'][] = $operation['OPERATION_ID'];
247 static::$TASK_OPERATIONS_CACHE[$ID]['names'][] = $operation['NAME'];
248 }
249 }
250
251 return static::$TASK_OPERATIONS_CACHE[$ID][$return_names ? 'names' : 'ids'] ?? [];
252 }
253
254 public static function SetOperations($ID, $arr, $bOpNames = false)
255 {
256 global $DB;
257
258 $ID = intval($ID);
259
260 //get old operations
261 $aPrevOp = [];
262 $operations = TaskOperationTable::getList([
263 'select' => ['NAME' => 'OPERATION.NAME'],
264 'filter' => ['=TASK_ID' => $ID],
265 'order' => ['OPERATION_ID' => 'ASC'],
266 ]);
267 while ($operation = $operations->fetch())
268 {
269 $aPrevOp[] = $operation['NAME'];
270 }
271
272 TaskOperationTable::deleteByFilter(['=TASK_ID' => $ID]);
273
274 if (is_array($arr) && !empty($arr))
275 {
276 $sID = '';
277 if ($bOpNames)
278 {
279 foreach ($arr as $op_id)
280 {
281 $sID .= ($sID != '' ? ', ' : '') . "'" . $DB->ForSQL($op_id) . "'";
282 }
283
284 $DB->Query(
285 "INSERT INTO b_task_operation (TASK_ID, OPERATION_ID) " .
286 "SELECT '" . $ID . "', O.ID " .
287 "FROM b_operation O, b_task T " .
288 "WHERE O.NAME IN (" . $sID . ") AND T.MODULE_ID=O.MODULE_ID AND T.ID=" . $ID
289 );
290 }
291 else
292 {
293 foreach ($arr as $op_id)
294 {
295 $sID .= ($sID != '' ? ', ' : '') . intval($op_id);
296 }
297
298 $DB->Query(
299 "INSERT INTO b_task_operation (TASK_ID, OPERATION_ID) " .
300 "SELECT '" . $ID . "', ID " .
301 "FROM b_operation " .
302 "WHERE ID IN (" . $sID . ") "
303 );
304 }
305 }
306
307 unset(static::$TASK_OPERATIONS_CACHE[$ID]);
308
309 TaskOperationTable::cleanCache();
310
311 //get new operations
312 $aNewOp = [];
313 $operations = TaskOperationTable::getList([
314 'select' => ['NAME' => 'OPERATION.NAME'],
315 'filter' => ['=TASK_ID' => $ID],
316 'order' => ['OPERATION_ID' => 'ASC'],
317 ]);
318 while ($operation = $operations->fetch())
319 {
320 $aNewOp[] = $operation['NAME'];
321 }
322
323 //compare with old one
324 $aDiff = array_diff($aNewOp, $aPrevOp);
325 if (empty($aDiff))
326 {
327 $aDiff = array_diff($aPrevOp, $aNewOp);
328 }
329 if (!empty($aDiff))
330 {
331 if (COption::GetOptionString("main", "event_log_task", "N") === "Y")
332 {
333 CEventLog::Log(CEventLog::SEVERITY_SECURITY, "TASK_CHANGED", "main", $ID, ['before' => $aPrevOp, 'after' => $aNewOp]);
334 }
335 foreach (GetModuleEvents("main", "OnTaskOperationsChanged", true) as $arEvent)
336 {
337 ExecuteModuleEventEx($arEvent, [$ID, $aPrevOp, $aNewOp]);
338 }
339 }
340 }
341
342 public static function GetTasksInModules($mode = false, $module_id = false, $binding = false)
343 {
344 $arFilter = [];
345 if ($module_id !== false)
346 {
347 $arFilter["MODULE_ID"] = $module_id;
348 }
349 if ($binding !== false)
350 {
351 $arFilter["BINDING"] = $binding;
352 }
353
354 $z = static::GetList(
355 [
356 "MODULE_ID" => "asc",
357 "LETTER" => "asc",
358 ],
360 );
361
362 $arr = [];
363 if ($mode)
364 {
365 while ($r = $z->Fetch())
366 {
367 $arr[$r['MODULE_ID']]['reference_id'][] = $r['ID'];
368 $arr[$r['MODULE_ID']]['reference'][] = '[' . ($r['LETTER'] ?: '..') . '] ' . static::GetLangTitle($r['NAME'], $r['MODULE_ID']);
369 }
370 }
371 else
372 {
373 while ($r = $z->Fetch())
374 {
375 $arr[$r['MODULE_ID']][] = $r;
376 }
377 }
378 return $arr;
379 }
380
381 public static function GetByID($ID)
382 {
383 return static::GetList([], ["ID" => intval($ID)]);
384 }
385
386 protected static function GetDescriptions($module)
387 {
388 static $descriptions = [];
389
390 if (preg_match("/[^a-z0-9._]/i", $module))
391 {
392 return [];
393 }
394
395 if (!isset($descriptions[$module]))
396 {
397 if (($path = getLocalPath("modules/" . $module . "/admin/task_description.php")) !== false)
398 {
399 $descriptions[$module] = include($_SERVER["DOCUMENT_ROOT"] . $path);
400 }
401 else
402 {
403 $descriptions[$module] = [];
404 }
405 }
406
407 return $descriptions[$module];
408 }
409
410 public static function GetLangTitle($name, $module = "main")
411 {
412 $descriptions = static::GetDescriptions($module);
413
414 $nameUpper = strtoupper($name);
415
416 if (isset($descriptions[$nameUpper]["title"]))
417 {
418 return $descriptions[$nameUpper]["title"];
419 }
420
421 return $name;
422 }
423
424 public static function GetLangDescription($name, $desc, $module = "main")
425 {
426 $descriptions = static::GetDescriptions($module);
427
428 $nameUpper = strtoupper($name);
429
430 if (isset($descriptions[$nameUpper]["description"]))
431 {
432 return $descriptions[$nameUpper]["description"];
433 }
434
435 return $desc;
436 }
437
438 public static function GetLetter($ID)
439 {
440 $z = static::GetById($ID);
441 if ($r = $z->Fetch())
442 {
443 if ($r['LETTER'])
444 {
445 return $r['LETTER'];
446 }
447 }
448 return false;
449 }
450
451 public static function GetIdByLetter($letter, $module, $binding = 'module')
452 {
453 static $TASK_LETTER_CACHE = [];
454 if (!$letter)
455 {
456 return false;
457 }
458
459 $k = strtoupper($letter . '_' . $module . '_' . $binding);
460 if (isset($TASK_LETTER_CACHE[$k]))
461 {
462 return $TASK_LETTER_CACHE[$k];
463 }
464
465 $z = static::GetList(
466 [],
467 [
468 "LETTER" => $letter,
469 "MODULE_ID" => $module,
470 "BINDING" => $binding,
471 "SYS" => "Y",
472 ]
473 );
474
475 if ($r = $z->Fetch())
476 {
477 $TASK_LETTER_CACHE[$k] = $r['ID'];
478 if ($r['ID'])
479 {
480 return $r['ID'];
481 }
482 }
483
484 return false;
485 }
486
487 public static function AddFromArray(string $module, array $tasks)
488 {
489 global $DB;
490
491 $existingOperations = [];
492 $records = OperationTable::getList([
493 'select' => ['NAME'],
494 'filter' => ['=MODULE_ID' => $module],
495 ]);
496 while ($record = $records->fetch())
497 {
498 $existingOperations[$record['NAME']] = $record['NAME'];
499 }
500
501 $existingTasks = [];
502 $records = TaskTable::getList([
503 'select' => ['NAME'],
504 'filter' => ['=MODULE_ID' => $module, '=SYS' => 'Y'],
505 ]);
506 while ($record = $records->fetch())
507 {
508 $existingTasks[$record['NAME']] = $record['NAME'];
509 }
510
511 foreach ($tasks as $taskName => $arTask)
512 {
513 $binding = empty($arTask["BINDING"]) ? 'module' : $arTask["BINDING"];
514 $sqlTaskOperations = [];
515
516 if (isset($arTask["OPERATIONS"]) && is_array($arTask["OPERATIONS"]))
517 {
518 foreach ($arTask["OPERATIONS"] as $operationName)
519 {
520 $operationName = mb_substr($operationName, 0, 50);
521
522 if (!isset($existingOperations[$operationName]))
523 {
524 OperationTable::add([
525 'NAME' => $operationName,
526 'MODULE_ID' => $module,
527 'BINDING' => $binding,
528 ]);
529 $existingOperations[$operationName] = $operationName;
530 }
531
532 $sqlTaskOperations[] = $DB->ForSQL($operationName);
533 }
534 }
535
536 $taskName = mb_substr($taskName, 0, 100);
537
538 if (!isset($existingTasks[$taskName]) && $taskName != '')
539 {
540 TaskTable::add([
541 'NAME' => $taskName,
542 'LETTER' => $arTask["LETTER"] ?? null,
543 'MODULE_ID' => $module,
544 'SYS' => 'Y',
545 'BINDING' => $binding,
546 ]);
547 }
548
549 if (!empty($sqlTaskOperations) && $taskName != '')
550 {
551 $sqlTaskName = $DB->ForSQL($taskName);
552
553 $DB->Query("
554 INSERT INTO b_task_operation (TASK_ID, OPERATION_ID)
555 SELECT T.ID TASK_ID, O.ID OPERATION_ID
556 FROM b_task T, b_operation O
557 WHERE T.SYS='Y'
558 AND T.NAME='$sqlTaskName'
559 AND O.NAME in ('" . implode("','", $sqlTaskOperations) . "')
560 AND O.NAME not in (
561 SELECT O2.NAME
562 FROM b_task T2
563 inner join b_task_operation TO2 on TO2.TASK_ID = T2.ID
564 inner join b_operation O2 on O2.ID = TO2.OPERATION_ID
565 WHERE T2.SYS='Y'
566 AND T2.NAME='$sqlTaskName'
567 )
568 ");
569 }
570 }
571
572 TaskOperationTable::cleanCache();
573 }
574}
575
576class CTask extends CAllTask
577{
578}
$path
Определения access_edit.php:21
global $APPLICATION
Определения include.php:80
$module_id
Определения options.php:6
$arResult
Определения generate_coupon.php:16
Определения task.php:24
Определения task.php:16
static GetLangTitle($name, $module="main")
Определения task.php:410
static Update($arFields, $ID)
Определения task.php:102
static GetOperations($ID, $return_names=false)
Определения task.php:230
static GetTasksInModules($mode=false, $module_id=false, $binding=false)
Определения task.php:342
static CheckFields(&$arFields, $ID=false)
Определения task.php:19
static GetLangDescription($name, $desc, $module="main")
Определения task.php:424
static Add($arFields)
Определения task.php:90
static GetLetter($ID)
Определения task.php:438
static GetByID($ID)
Определения task.php:381
static AddFromArray(string $module, array $tasks)
Определения task.php:487
static GetIdByLetter($letter, $module, $binding='module')
Определения task.php:451
static SetOperations($ID, $arr, $bOpNames=false)
Определения task.php:254
static UpdateModuleRights($id, $moduleId, $letter, $site_id=false)
Определения task.php:114
static getOwnFields(array $arFields)
Определения task.php:76
static $TASK_OPERATIONS_CACHE
Определения task.php:17
static Delete($ID, $protect=true)
Определения task.php:168
static GetDescriptions($module)
Определения task.php:386
static GetList($arOrder=['MODULE_ID'=> 'asc', 'LETTER'=> 'asc'], $arFilter=[])
Определения task.php:185
Определения dbresult.php:88
const SEVERITY_SECURITY
Определения event_log.php:22
static Log($SEVERITY, $AUDIT_TYPE_ID, $MODULE_ID, $ITEM_ID, $DESCRIPTION=false, $SITE_ID=false)
Определения event_log.php:32
Определения task.php:577
$arFields
Определения dblapprove.php:5
$arr
Определения file_new.php:624
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$arGroups
Определения options.php:1766
$res
Определения filter_act.php:7
$result
Определения get_property_values.php:14
if($ajaxMode) $ID
Определения get_user.php:27
$entity
$moduleId
$filter
Определения iblock_catalog_list.php:54
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$z
Определения options.php:31
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
GetMessage($name, $aReplace=null)
Определения tools.php:3397
getLocalPath($path, $baseFolder="/bitrix")
Определения tools.php:5092
$name
Определения menu_edit.php:35
$order
Определения payment.php:8
if(mb_strlen($order)< 6) $desc
Определения payment.php:44
$direction
Определения prolog_auth_admin.php:25
$arRes
Определения options.php:104
$site_id
Определения sonet_set_content_view.php:9
$k
Определения template_pdf.php:567
$arFilter
Определения user_search.php:106
$fields
Определения yandex_run.php:501