PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/main/classes/general/task.php

https://gitlab.com/alexprowars/bitrix
PHP | 534 lines | 429 code | 90 blank | 15 comment | 72 complexity | f1a6f717ac153fc96b219a5e14948f5e MD5 | raw file
  1. <?php
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage main
  6. * @copyright 2001-2020 Bitrix
  7. */
  8. use Bitrix\Main;
  9. /**
  10. * @deprecated Use CTask
  11. */
  12. class CAllTask
  13. {
  14. protected static $TASK_OPERATIONS_CACHE = array();
  15. public static function err_mess()
  16. {
  17. return "<br>Class: CTask<br>File: ".__FILE__;
  18. }
  19. public static function CheckFields(&$arFields, $ID = false)
  20. {
  21. /** @global CMain $APPLICATION */
  22. global $DB, $APPLICATION;
  23. if($ID>0)
  24. unset($arFields["ID"]);
  25. $arMsg = array();
  26. if(($ID===false || is_set($arFields, "NAME")) && $arFields["NAME"] == '')
  27. $arMsg[] = array("id"=>"NAME", "text"=> GetMessage('MAIN_ERROR_STRING_ID_EMPTY'));
  28. $sql_str = "SELECT T.ID
  29. FROM b_task T
  30. WHERE T.NAME='".$DB->ForSQL($arFields['NAME'])."'";
  31. if ($ID !== false)
  32. $sql_str .= " AND T.ID <> ".intval($ID);
  33. $z = $DB->Query($sql_str, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
  34. if ($r = $z->Fetch())
  35. $arMsg[] = array("id"=>"NAME", "text"=> GetMessage('MAIN_ERROR_STRING_ID_DOUBLE'));
  36. if (isset($arFields['LETTER']))
  37. {
  38. if (preg_match("/[^A-Z]/i", $arFields['LETTER']) || strlen($arFields['LETTER']) > 1)
  39. $arMsg[] = array("id"=>"LETTER", "text"=> GetMessage('MAIN_TASK_WRONG_LETTER'));
  40. $arFields['LETTER'] = strtoupper($arFields['LETTER']);
  41. }
  42. else
  43. {
  44. $arFields['LETTER'] = '';
  45. }
  46. if(count($arMsg)>0)
  47. {
  48. $e = new CAdminException($arMsg);
  49. $APPLICATION->ThrowException($e);
  50. return false;
  51. }
  52. if (!isset($arFields['SYS']) || $arFields['SYS'] != "Y")
  53. $arFields['SYS'] = "N";
  54. if (!isset($arFields['BINDING']))
  55. $arFields['BINDING'] = 'module';
  56. return true;
  57. }
  58. public static function Add($arFields)
  59. {
  60. global $CACHE_MANAGER, $DB;
  61. if(!static::CheckFields($arFields))
  62. return false;
  63. if(CACHED_b_task !== false)
  64. $CACHE_MANAGER->CleanDir("b_task");
  65. $ID = $DB->Add("b_task", $arFields);
  66. return $ID;
  67. }
  68. public static function Update($arFields,$ID)
  69. {
  70. global $DB, $CACHE_MANAGER;
  71. if(!static::CheckFields($arFields,$ID))
  72. return false;
  73. $strUpdate = $DB->PrepareUpdate("b_task", $arFields);
  74. if($strUpdate)
  75. {
  76. if(CACHED_b_task !== false)
  77. $CACHE_MANAGER->CleanDir("b_task");
  78. $strSql =
  79. "UPDATE b_task SET ".
  80. $strUpdate.
  81. " WHERE ID=".intval($ID);
  82. $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
  83. }
  84. return true;
  85. }
  86. public static function UpdateModuleRights($id, $moduleId, $letter, $site_id = false)
  87. {
  88. global $DB;
  89. if (!isset($id, $moduleId))
  90. return false;
  91. $sql = "SELECT GT.GROUP_ID
  92. FROM b_group_task GT
  93. WHERE GT.TASK_ID=".intval($id);
  94. $z = $DB->Query($sql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
  95. $arGroups = array();
  96. while($r = $z->Fetch())
  97. {
  98. $g = intval($r['GROUP_ID']);
  99. if ($g > 0)
  100. $arGroups[] = $g;
  101. }
  102. if (count($arGroups) == 0)
  103. return false;
  104. $str_groups = implode(',', $arGroups);
  105. $moduleId = $DB->ForSQL($moduleId);
  106. $DB->Query(
  107. "DELETE FROM b_module_group
  108. WHERE
  109. MODULE_ID = '".$moduleId."' AND
  110. SITE_ID ".($site_id ? "='".$site_id."'" : "IS NULL")." AND
  111. GROUP_ID IN (".$str_groups.")",
  112. false, "FILE: ".__FILE__."<br> LINE: ".__LINE__
  113. );
  114. if ($letter == '')
  115. return false;
  116. $letter = $DB->ForSQL($letter);
  117. $DB->Query(
  118. "INSERT INTO b_module_group (MODULE_ID, GROUP_ID, G_ACCESS, SITE_ID) ".
  119. "SELECT '".$moduleId."', G.ID, '".$letter."', ".($site_id ? "'".$site_id."'" : "NULL")." ".
  120. "FROM b_group G ".
  121. "WHERE G.ID IN (".$str_groups.")"
  122. , false, "File: ".__FILE__."<br>Line: ".__LINE__
  123. );
  124. return true;
  125. }
  126. public static function Delete($ID, $protect = true)
  127. {
  128. global $DB, $CACHE_MANAGER;
  129. $ID = intval($ID);
  130. if(CACHED_b_task !== false)
  131. $CACHE_MANAGER->CleanDir("b_task");
  132. $sql_str = "DELETE FROM b_task WHERE ID=".$ID;
  133. if ($protect)
  134. $sql_str .= " AND SYS='N'";
  135. $DB->Query($sql_str, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
  136. if (!$protect)
  137. {
  138. if(CACHED_b_task_operation !== false)
  139. $CACHE_MANAGER->CleanDir("b_task_operation");
  140. $DB->Query("DELETE FROM b_task_operation WHERE TASK_ID=".$ID, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
  141. }
  142. }
  143. public static function GetList($arOrder = array('MODULE_ID'=>'asc','LETTER'=>'asc'), $arFilter = array())
  144. {
  145. global $DB, $CACHE_MANAGER;
  146. if(CACHED_b_task !== false)
  147. {
  148. $context = Main\Context::getCurrent();
  149. $cacheId = "b_task".md5(serialize($arOrder).".".serialize($arFilter).".".$context->getLanguage());
  150. if($CACHE_MANAGER->Read(CACHED_b_task, $cacheId, "b_task"))
  151. {
  152. $arResult = $CACHE_MANAGER->Get($cacheId);
  153. $res = new CDBResult;
  154. $res->InitFromArray($arResult);
  155. return $res;
  156. }
  157. }
  158. static $arFields = array(
  159. "ID" => array("FIELD_NAME" => "T.ID", "FIELD_TYPE" => "int"),
  160. "NAME" => array("FIELD_NAME" => "T.NAME", "FIELD_TYPE" => "string"),
  161. "LETTER" => array("FIELD_NAME" => "T.LETTER", "FIELD_TYPE" => "string"),
  162. "MODULE_ID" => array("FIELD_NAME" => "T.MODULE_ID", "FIELD_TYPE" => "string"),
  163. "SYS" => array("FIELD_NAME" => "T.SYS", "FIELD_TYPE" => "string"),
  164. "BINDING" => array("FIELD_NAME" => "T.BINDING", "FIELD_TYPE" => "string")
  165. );
  166. $err_mess = (static::err_mess())."<br>Function: GetList<br>Line: ";
  167. $arSqlSearch = array();
  168. if(is_array($arFilter))
  169. {
  170. foreach($arFilter as $n => $val)
  171. {
  172. $n = strtoupper($n);
  173. if((string)$val == '' || strval($val) == "NOT_REF")
  174. continue;
  175. if(isset($arFields[$n]))
  176. {
  177. $arSqlSearch[] = GetFilterQuery($arFields[$n]["FIELD_NAME"], $val, ($n == 'NAME'? "Y" : "N"));
  178. }
  179. }
  180. }
  181. $strOrderBy = '';
  182. foreach($arOrder as $by=>$order)
  183. if(isset($arFields[strtoupper($by)]))
  184. $strOrderBy .= $arFields[strtoupper($by)]["FIELD_NAME"].' '.(strtolower($order) == 'desc'?'desc':'asc').',';
  185. if($strOrderBy <> '')
  186. $strOrderBy = "ORDER BY ".rtrim($strOrderBy, ",");
  187. $strSqlSearch = GetFilterSqlSearch($arSqlSearch);
  188. $strSql = "
  189. SELECT
  190. T.ID, T.NAME, T.DESCRIPTION, T.MODULE_ID, T.LETTER, T.SYS, T.BINDING
  191. FROM
  192. b_task T
  193. WHERE
  194. ".$strSqlSearch."
  195. ".$strOrderBy;
  196. $res = $DB->Query($strSql, false, $err_mess.__LINE__);
  197. $arResult = array();
  198. while($arRes = $res->Fetch())
  199. {
  200. $arRes['TITLE'] = static::GetLangTitle($arRes['NAME'], $arRes['MODULE_ID']);
  201. $arRes['DESC'] = static::GetLangDescription($arRes['NAME'], $arRes['DESCRIPTION'], $arRes['MODULE_ID']);
  202. $arResult[] = $arRes;
  203. }
  204. $res->InitFromArray($arResult);
  205. if(CACHED_b_task !== false)
  206. {
  207. /** @noinspection PhpUndefinedVariableInspection */
  208. $CACHE_MANAGER->Set($cacheId, $arResult);
  209. }
  210. return $res;
  211. }
  212. public static function GetOperations($ID, $return_names = false)
  213. {
  214. global $DB, $CACHE_MANAGER;
  215. $ID = intval($ID);
  216. if (!isset(static::$TASK_OPERATIONS_CACHE[$ID]))
  217. {
  218. if(CACHED_b_task_operation !== false)
  219. {
  220. $cacheId = "b_task_operation_".$ID;
  221. if($CACHE_MANAGER->Read(CACHED_b_task_operation, $cacheId, "b_task_operation"))
  222. {
  223. static::$TASK_OPERATIONS_CACHE[$ID] = $CACHE_MANAGER->Get($cacheId);
  224. }
  225. }
  226. }
  227. if (!isset(static::$TASK_OPERATIONS_CACHE[$ID]))
  228. {
  229. $sql_str = '
  230. SELECT T_O.OPERATION_ID, O.NAME
  231. FROM b_task_operation T_O
  232. INNER JOIN b_operation O ON T_O.OPERATION_ID = O.ID
  233. WHERE T_O.TASK_ID = '.$ID.'
  234. ';
  235. static::$TASK_OPERATIONS_CACHE[$ID] = array(
  236. 'names' => array(),
  237. 'ids' => array(),
  238. );
  239. $z = $DB->Query($sql_str, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
  240. while($r = $z->Fetch())
  241. {
  242. static::$TASK_OPERATIONS_CACHE[$ID]['names'][] = $r['NAME'];
  243. static::$TASK_OPERATIONS_CACHE[$ID]['ids'][] = $r['OPERATION_ID'];
  244. }
  245. if(CACHED_b_task_operation !== false)
  246. {
  247. /** @noinspection PhpUndefinedVariableInspection */
  248. $CACHE_MANAGER->Set($cacheId, static::$TASK_OPERATIONS_CACHE[$ID]);
  249. }
  250. }
  251. return static::$TASK_OPERATIONS_CACHE[$ID][$return_names ? 'names' : 'ids'];
  252. }
  253. public static function SetOperations($ID, $arr, $bOpNames=false)
  254. {
  255. global $DB, $CACHE_MANAGER;
  256. $ID = intval($ID);
  257. //get old operations
  258. $aPrevOp = array();
  259. $res = $DB->Query("
  260. SELECT O.NAME
  261. FROM b_operation O
  262. INNER JOIN b_task_operation T_OP ON O.ID = T_OP.OPERATION_ID
  263. WHERE T_OP.TASK_ID = ".$ID."
  264. ORDER BY O.ID
  265. ");
  266. while(($res_arr = $res->Fetch()))
  267. $aPrevOp[] = $res_arr["NAME"];
  268. $sql_str = 'DELETE FROM b_task_operation WHERE TASK_ID='.$ID;
  269. $DB->Query($sql_str, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
  270. if(is_array($arr) && count($arr)>0)
  271. {
  272. if($bOpNames)
  273. {
  274. $sID = "";
  275. foreach($arr as $op_id)
  276. $sID .= ",'".$DB->ForSQL($op_id)."'";
  277. $sID = LTrim($sID, ",");
  278. $DB->Query(
  279. "INSERT INTO b_task_operation (TASK_ID, OPERATION_ID) ".
  280. "SELECT '".$ID."', O.ID ".
  281. "FROM b_operation O, b_task T ".
  282. "WHERE O.NAME IN (".$sID.") AND T.MODULE_ID=O.MODULE_ID AND T.ID=".$ID." "
  283. , false, "File: ".__FILE__."<br>Line: ".__LINE__
  284. );
  285. }
  286. else
  287. {
  288. $sID = "0";
  289. foreach($arr as $op_id)
  290. $sID .= ",".intval($op_id);
  291. $DB->Query(
  292. "INSERT INTO b_task_operation (TASK_ID, OPERATION_ID) ".
  293. "SELECT '".$ID."', ID ".
  294. "FROM b_operation ".
  295. "WHERE ID IN (".$sID.") "
  296. , false, "File: ".__FILE__."<br>Line: ".__LINE__
  297. );
  298. }
  299. }
  300. unset(static::$TASK_OPERATIONS_CACHE[$ID]);
  301. if(CACHED_b_task_operation !== false)
  302. $CACHE_MANAGER->CleanDir("b_task_operation");
  303. //get new operations
  304. $aNewOp = array();
  305. $res = $DB->Query("
  306. SELECT O.NAME
  307. FROM b_operation O
  308. INNER JOIN b_task_operation T_OP ON O.ID = T_OP.OPERATION_ID
  309. WHERE T_OP.TASK_ID = ".$ID."
  310. ORDER BY O.ID
  311. ");
  312. while(($res_arr = $res->Fetch()))
  313. $aNewOp[] = $res_arr["NAME"];
  314. //compare with old one
  315. $aDiff = array_diff($aNewOp, $aPrevOp);
  316. if(empty($aDiff))
  317. $aDiff = array_diff($aPrevOp, $aNewOp);
  318. if(!empty($aDiff))
  319. {
  320. if(COption::GetOptionString("main", "event_log_task", "N") === "Y")
  321. CEventLog::Log("SECURITY", "TASK_CHANGED", "main", $ID, "(".implode(", ", $aPrevOp).") => (".implode(", ", $aNewOp).")");
  322. foreach(GetModuleEvents("main", "OnTaskOperationsChanged", true) as $arEvent)
  323. ExecuteModuleEventEx($arEvent, array($ID, $aPrevOp, $aNewOp));
  324. }
  325. }
  326. public static function GetTasksInModules($mode=false, $module_id=false, $binding = false)
  327. {
  328. $arFilter = array();
  329. if ($module_id !== false)
  330. $arFilter["MODULE_ID"] = $module_id;
  331. if ($binding !== false)
  332. $arFilter["BINDING"] = $binding;
  333. $z = static::GetList(
  334. array(
  335. "MODULE_ID" => "asc",
  336. "LETTER" => "asc"
  337. ),
  338. $arFilter
  339. );
  340. $arr = array();
  341. if ($mode)
  342. {
  343. while($r = $z->Fetch())
  344. {
  345. if (!is_array($arr[$r['MODULE_ID']]))
  346. $arr[$r['MODULE_ID']] = array('reference_id'=>array(),'reference'=>array());
  347. $arr[$r['MODULE_ID']]['reference_id'][] = $r['ID'];
  348. $arr[$r['MODULE_ID']]['reference'][] = '['.($r['LETTER'] ? $r['LETTER'] : '..').'] '.static::GetLangTitle($r['NAME'], $r['MODULE_ID']);
  349. }
  350. }
  351. else
  352. {
  353. while($r = $z->Fetch())
  354. {
  355. if (!is_array($arr[$r['MODULE_ID']]))
  356. $arr[$r['MODULE_ID']] = array();
  357. $arr[$r['MODULE_ID']][] = $r;
  358. }
  359. }
  360. return $arr;
  361. }
  362. public static function GetByID($ID)
  363. {
  364. return static::GetList(array(), array("ID" => intval($ID)));
  365. }
  366. protected static function GetDescriptions($module)
  367. {
  368. static $descriptions = array();
  369. if(preg_match("/[^a-z0-9._]/i", $module))
  370. {
  371. return array();
  372. }
  373. if(!isset($descriptions[$module]))
  374. {
  375. if(($path = getLocalPath("modules/".$module."/admin/task_description.php")) !== false)
  376. {
  377. $descriptions[$module] = include($_SERVER["DOCUMENT_ROOT"].$path);
  378. }
  379. else
  380. {
  381. $descriptions[$module] = array();
  382. }
  383. }
  384. return $descriptions[$module];
  385. }
  386. public static function GetLangTitle($name, $module = "main")
  387. {
  388. $descriptions = static::GetDescriptions($module);
  389. $nameUpper = strtoupper($name);
  390. if(isset($descriptions[$nameUpper]["title"]))
  391. {
  392. return $descriptions[$nameUpper]["title"];
  393. }
  394. return $name;
  395. }
  396. public static function GetLangDescription($name, $desc, $module = "main")
  397. {
  398. $descriptions = static::GetDescriptions($module);
  399. $nameUpper = strtoupper($name);
  400. if(isset($descriptions[$nameUpper]["description"]))
  401. {
  402. return $descriptions[$nameUpper]["description"];
  403. }
  404. return $desc;
  405. }
  406. public static function GetLetter($ID)
  407. {
  408. $z = static::GetById($ID);
  409. if ($r = $z->Fetch())
  410. if ($r['LETTER'])
  411. return $r['LETTER'];
  412. return false;
  413. }
  414. public static function GetIdByLetter($letter, $module, $binding='module')
  415. {
  416. static $TASK_LETTER_CACHE = array();
  417. if (!$letter)
  418. return false;
  419. if (!isset($TASK_LETTER_CACHE))
  420. $TASK_LETTER_CACHE = array();
  421. $k = strtoupper($letter.'_'.$module.'_'.$binding);
  422. if (isset($TASK_LETTER_CACHE[$k]))
  423. return $TASK_LETTER_CACHE[$k];
  424. $z = static::GetList(
  425. array(),
  426. array(
  427. "LETTER" => $letter,
  428. "MODULE_ID" => $module,
  429. "BINDING" => $binding,
  430. "SYS"=>"Y"
  431. )
  432. );
  433. if ($r = $z->Fetch())
  434. {
  435. $TASK_LETTER_CACHE[$k] = $r['ID'];
  436. if ($r['ID'])
  437. return $r['ID'];
  438. }
  439. return false;
  440. }
  441. }
  442. class CTask extends CAllTask
  443. {
  444. }