PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/learning/classes/general/group.php

https://gitlab.com/alexprowars/bitrix
PHP | 484 lines | 338 code | 95 blank | 51 comment | 64 complexity | 6e144c0ef4c49cea201ce034b3d962b8 MD5 | raw file
  1. <?php
  2. /**
  3. * Bitrix Framework
  4. * @package bitrix
  5. * @subpackage learning
  6. * @copyright 2001-2013 Bitrix
  7. */
  8. /*
  9. $arFields:
  10. ID int(11) unsigned not null auto_increment,
  11. ACTIVE char(1) not null default 'Y',
  12. TITLE varchar(255) not null default ' ',
  13. CODE varchar(50) NULL DEFAULT NULL,
  14. SORT int(11) not null default '500',
  15. ACTIVE_FROM datetime,
  16. ACTIVE_TO datetime,
  17. COURSE_LESSON_ID INT NOT NULL,
  18. PRIMARY KEY(ID)
  19. */
  20. class CLearningGroup
  21. {
  22. /**
  23. * Creates new learning group
  24. *
  25. * @param array $arFields
  26. *
  27. * @return mixed (int) id of just created group OR (bool) false on error
  28. */
  29. public static function add($arFields)
  30. {
  31. global $DB, $USER_FIELD_MANAGER, $APPLICATION;
  32. if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
  33. $arFields["ACTIVE"] = "N";
  34. if ( ! self::CheckFields($arFields) )
  35. return false;
  36. if ( ! $USER_FIELD_MANAGER->CheckFields("LEARNING_LGROUPS", 0, $arFields) )
  37. return (false);
  38. if (array_key_exists('ID', $arFields))
  39. unset($arFields['ID']);
  40. foreach(GetModuleEvents('learning', 'OnBeforeLearningGroupAdd', true) as $arEvent)
  41. {
  42. if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false)
  43. {
  44. IncludeModuleLangFile(__FILE__);
  45. $errmsg = GetMessage("LEARNING_GROUP_ADD_UNKNOWN_ERROR");
  46. $errno = 'LEARNING_GROUP_ADD_UNKNOWN_ERROR';
  47. if ($ex = $APPLICATION->getException())
  48. {
  49. $errmsg = $ex->getString();
  50. $errno = $ex->getId();
  51. }
  52. $e = new CAdminException(array('text' => $errmsg, 'id' => $errno));
  53. $APPLICATION->ThrowException($e);
  54. return false;
  55. }
  56. }
  57. $id = $DB->Add("b_learn_groups", $arFields, array(), "learning");
  58. if ($id)
  59. $USER_FIELD_MANAGER->Update("LEARNING_LGROUPS", $id, $arFields);
  60. if ($id > 0 && defined("BX_COMP_MANAGED_CACHE"))
  61. {
  62. global $CACHE_MANAGER;
  63. $CACHE_MANAGER->ClearByTag('LEARNING_GROUP_' . (int) ($id / 100));
  64. $CACHE_MANAGER->ClearByTag('LEARNING_GROUP');
  65. }
  66. foreach(GetModuleEvents('learning', 'OnAfterLearningGroupAdd', true) as $arEvent)
  67. ExecuteModuleEventEx($arEvent, array($id, &$arFields));
  68. return ($id);
  69. }
  70. /**
  71. * Updates existing learning group
  72. *
  73. * @param int $id
  74. * @param array $arFields
  75. *
  76. * @return bool false on error, or true - if no errors detected
  77. */
  78. public static function update($id, $arFields)
  79. {
  80. global $DB, $USER_FIELD_MANAGER, $APPLICATION;
  81. $id = (int) $id;
  82. if ($id < 1)
  83. return (false);
  84. if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y")
  85. $arFields["ACTIVE"] = "N";
  86. if ( ! self::CheckFields($arFields, $id) )
  87. return false;
  88. if ( ! $USER_FIELD_MANAGER->CheckFields("LEARNING_LGROUPS", $id, $arFields) )
  89. return (false);
  90. if (array_key_exists('ID', $arFields))
  91. unset($arFields['ID']);
  92. foreach(GetModuleEvents('learning', 'OnBeforeLearningGroupUpdate', true) as $arEvent)
  93. {
  94. if (ExecuteModuleEventEx($arEvent, array($id, &$arFields)) === false)
  95. {
  96. IncludeModuleLangFile(__FILE__);
  97. $errmsg = GetMessage("LEARNING_GROUP_UPDATE_UNKNOWN_ERROR");
  98. $errno = 'LEARNING_GROUP_UPDATE_UNKNOWN_ERROR';
  99. if ($ex = $APPLICATION->getException())
  100. {
  101. $errmsg = $ex->getString();
  102. $errno = $ex->getId();
  103. }
  104. $e = new CAdminException(array('text' => $errmsg, 'id' => $errno));
  105. $APPLICATION->ThrowException($e);
  106. return false;
  107. }
  108. }
  109. $USER_FIELD_MANAGER->Update('LEARNING_LGROUPS', $id, $arFields);
  110. $strUpdate = $DB->PrepareUpdate("b_learn_groups", $arFields, "learning");
  111. $strSql = "UPDATE b_learn_groups SET " . $strUpdate . " WHERE ID=" . $id;
  112. $rc = $DB->queryBind($strSql, $arBinds = array(), $bIgnoreErrors = true);
  113. if (defined("BX_COMP_MANAGED_CACHE"))
  114. {
  115. global $CACHE_MANAGER;
  116. $CACHE_MANAGER->ClearByTag('LEARNING_GROUP_' . (int) ($id / 100));
  117. $CACHE_MANAGER->ClearByTag('LEARNING_GROUP');
  118. }
  119. foreach(GetModuleEvents('learning', 'OnAfterLearningGroupUpdate', true) as $arEvent)
  120. ExecuteModuleEventEx($arEvent, array($id, &$arFields));
  121. return ($rc !== false);
  122. }
  123. /**
  124. * Get list of existing learning groups
  125. *
  126. * @param array $arOrder
  127. * @param array $arFilter
  128. * @param array $arSelect
  129. * @param array $arNavParams
  130. *
  131. * @return CDBResult
  132. */
  133. public static function getList($arOrder, $arFilter, $arSelect = array(), $arNavParams = array())
  134. {
  135. global $DB, $USER, $USER_FIELD_MANAGER;
  136. $obUserFieldsSql = new CUserTypeSQL();
  137. $obUserFieldsSql->SetEntity("LEARNING_LGROUPS", "LG.ID");
  138. $obUserFieldsSql->SetSelect($arSelect);
  139. $obUserFieldsSql->SetFilter($arFilter);
  140. $obUserFieldsSql->SetOrder($arOrder);
  141. $arFields = array(
  142. 'ID' => 'LG.ID',
  143. 'TITLE' => 'LG.TITLE',
  144. 'ACTIVE' => 'LG.ACTIVE',
  145. 'CODE' => 'LG.CODE',
  146. 'SORT' => 'LG.SORT',
  147. 'ACTIVE_FROM' => $DB->DateToCharFunction('LG.ACTIVE_FROM', 'FULL'),
  148. 'ACTIVE_TO' => $DB->DateToCharFunction('LG.ACTIVE_TO', 'FULL'),
  149. 'COURSE_LESSON_ID' => 'LG.COURSE_LESSON_ID',
  150. 'COURSE_TITLE' => 'LL.NAME',
  151. 'MEMBER_ID' => 'LGM.USER_ID'
  152. );
  153. $arFieldsSort = $arFields;
  154. $arFieldsSort["ACTIVE_FROM"] = "LG.ACTIVE_FROM";
  155. $arFieldsSort["ACTIVE_TO"] = "LG.ACTIVE_TO";
  156. if (count($arSelect) <= 0 || in_array("*", $arSelect))
  157. $arSelect = array_diff(array_keys($arFields), array('MEMBER_ID'));
  158. elseif (!in_array("ID", $arSelect))
  159. $arSelect[] = "ID";
  160. if (!is_array($arOrder))
  161. $arOrder = array();
  162. $arSqlOrder = [];
  163. foreach ($arOrder as $by => $order)
  164. {
  165. $by = (string) $by;
  166. $byUppercase = mb_strtoupper($by);
  167. $needle = null;
  168. $order = mb_strtolower($order);
  169. if ($order != "asc")
  170. $order = "desc";
  171. if (array_key_exists($byUppercase, $arFieldsSort))
  172. {
  173. $arSqlOrder[] = ' ' . $arFieldsSort[$byUppercase] . ' ' . $order . ' ';
  174. $needle = $byUppercase;
  175. }
  176. elseif ($s = $obUserFieldsSql->getOrder(mb_strtolower($by)))
  177. $arSqlOrder[] = ' ' . $s . ' ' . $order . ' ';
  178. if (
  179. ($needle !== null)
  180. && ( ! in_array($needle, $arSelect, true) )
  181. )
  182. {
  183. $arSelect[] = $needle;
  184. }
  185. }
  186. if (
  187. array_key_exists('MEMBER_ID', $arFilter)
  188. && ( ! in_array('MEMBER_ID', $arSelect, true) )
  189. )
  190. {
  191. $arSelect[] = 'MEMBER_ID';
  192. }
  193. $arSqlSelect = array();
  194. foreach ($arSelect as $field)
  195. {
  196. $field = mb_strtoupper($field);
  197. if (array_key_exists($field, $arFields))
  198. $arSqlSelect[$field] = $arFields[$field] . ' AS ' . $field;
  199. }
  200. if (!sizeof($arSqlSelect))
  201. $arSqlSelect = 'LG.ID AS ID';
  202. $arSqlSearch = self::getFilter($arFilter);
  203. $r = $obUserFieldsSql->GetFilter();
  204. if ($r <> '')
  205. $arSqlSearch[] = "(".$r.")";
  206. $strSql = "
  207. SELECT
  208. ".implode(",\n", $arSqlSelect)."
  209. ".$obUserFieldsSql->GetSelect();
  210. $strFrom = "
  211. FROM
  212. b_learn_groups LG
  213. ";
  214. if (in_array('COURSE_TITLE', $arSelect, true))
  215. $strFrom .= "LEFT OUTER JOIN b_learn_lesson LL ON LL.ID = LG.COURSE_LESSON_ID \n" ;
  216. if (in_array('MEMBER_ID', $arSelect, true))
  217. $strFrom .= "LEFT JOIN b_learn_groups_member LGM ON LGM.LEARNING_GROUP_ID = LG.ID \n" ;
  218. $strFrom .= $obUserFieldsSql->GetJoin("LG.ID") . " "
  219. . (sizeof($arSqlSearch) ? " WHERE " . implode(" AND ", $arSqlSearch) : "") . " ";
  220. $strSql .= $strFrom;
  221. $strSqlOrder = "";
  222. DelDuplicateSort($arSqlOrder);
  223. for ($i = 0, $arSqlOrderCnt = count($arSqlOrder); $i < $arSqlOrderCnt; $i++)
  224. {
  225. if ($i == 0)
  226. $strSqlOrder = " ORDER BY ";
  227. else
  228. $strSqlOrder .= ",";
  229. $strSqlOrder .= $arSqlOrder[$i];
  230. }
  231. $strSql .= $strSqlOrder;
  232. if (count($arNavParams))
  233. {
  234. if (isset($arNavParams['nTopCount']))
  235. {
  236. $strSql = $DB->TopSql($strSql, (int) $arNavParams['nTopCount']);
  237. $res = $DB->Query($strSql, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
  238. $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARNING_LGROUPS"));
  239. }
  240. else
  241. {
  242. $res_cnt = $DB->Query("SELECT COUNT(LG.ID) as C " . $strFrom);
  243. $res_cnt = $res_cnt->Fetch();
  244. $res = new CDBResult();
  245. $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARNING_LGROUPS"));
  246. $rc = $res->NavQuery($strSql, $res_cnt["C"], $arNavParams, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
  247. }
  248. }
  249. else
  250. {
  251. $res = $DB->Query($strSql, $bIgnoreErrors = false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
  252. $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARNING_LGROUPS"));
  253. }
  254. return $res;
  255. }
  256. /**
  257. * Removes existing learning group
  258. *
  259. * @param int $groupId
  260. *
  261. * @return bool false on error, or true - if no errors detected
  262. */
  263. public static function delete($groupId)
  264. {
  265. global $DB, $APPLICATION, $USER_FIELD_MANAGER;
  266. foreach(GetModuleEvents('learning', 'OnBeforeLearningGroupDelete', true) as $arEvent)
  267. {
  268. if (ExecuteModuleEventEx($arEvent, array($groupId)) === false)
  269. {
  270. IncludeModuleLangFile(__FILE__);
  271. $errmsg = GetMessage("LEARNING_GROUP_DELETE_UNKNOWN_ERROR");
  272. $errno = 'LEARNING_GROUP_DELETE_UNKNOWN_ERROR';
  273. if ($ex = $APPLICATION->getException())
  274. {
  275. $errmsg = $ex->getString();
  276. $errno = $ex->getId();
  277. }
  278. $e = new CAdminException(array('text' => $errmsg, 'id' => $errno));
  279. $APPLICATION->ThrowException($e);
  280. return false;
  281. }
  282. }
  283. $rc = $DB->Query(
  284. "DELETE FROM b_learn_groups WHERE ID = " . (int) $groupId,
  285. $bIgnoreErrors = true
  286. );
  287. if (defined("BX_COMP_MANAGED_CACHE"))
  288. {
  289. global $CACHE_MANAGER;
  290. $CACHE_MANAGER->ClearByTag('LEARNING_GROUP_' . (int) ($groupId / 100));
  291. $CACHE_MANAGER->ClearByTag('LEARNING_GROUP');
  292. }
  293. $USER_FIELD_MANAGER->delete('LEARNING_LGROUPS', $groupId);
  294. CEventLog::add(array(
  295. 'AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM',
  296. 'MODULE_ID' => 'learning',
  297. 'ITEM_ID' => 'LG #' . $groupId,
  298. 'DESCRIPTION' => 'learning group removed'
  299. ));
  300. foreach(GetModuleEvents('learning', 'OnAfterLearningGroupDelete', true) as $arEvent)
  301. ExecuteModuleEventEx($arEvent, array($groupId));
  302. return ($rc !== false);
  303. }
  304. private static function CheckFields($arFields, $id = false)
  305. {
  306. global $DB;
  307. $arMsg = array();
  308. if ( (is_set($arFields, "TITLE") || $id === false) && trim($arFields["TITLE"]) == '')
  309. $arMsg[] = array("id"=>"TITLE", "text"=> GetMessage("LEARNING_BAD_NAME"));
  310. if (is_set($arFields, "ACTIVE_FROM") && $arFields["ACTIVE_FROM"] <> '' && (!$DB->IsDate($arFields["ACTIVE_FROM"], false, LANG, "FULL")))
  311. $arMsg[] = array("id"=>"ACTIVE_FROM", "text"=> GetMessage("LEARNING_BAD_ACTIVE_FROM"));
  312. if (is_set($arFields, "ACTIVE_TO") && $arFields["ACTIVE_TO"] <> '' && (!$DB->IsDate($arFields["ACTIVE_TO"], false, LANG, "FULL")))
  313. $arMsg[] = array("id"=>"ACTIVE_TO", "text"=> GetMessage("LEARNING_BAD_ACTIVE_TO"));
  314. if ($id === false)
  315. {
  316. if (!array_key_exists('COURSE_LESSON_ID', $arFields) || intval($arFields["COURSE_LESSON_ID"]) < 1)
  317. {
  318. $arMsg[] = array("id"=>"COURSE_LESSON_ID", "text"=> GetMessage("LEARNING_BAD_COURSE_ID"));
  319. }
  320. }
  321. if(!empty($arMsg))
  322. {
  323. $e = new CAdminException($arMsg);
  324. $GLOBALS["APPLICATION"]->ThrowException($e);
  325. return false;
  326. }
  327. return true;
  328. }
  329. private static function getFilter($arFilter)
  330. {
  331. global $DB;
  332. if (!is_array($arFilter))
  333. $arFilter = Array();
  334. $arSqlSearch = Array();
  335. foreach ($arFilter as $key => $val)
  336. {
  337. $res = CLearnHelper::MkOperationFilter($key);
  338. $key = $res["FIELD"];
  339. $cOperationType = $res["OPERATION"];
  340. $key = mb_strtoupper($key);
  341. switch ($key)
  342. {
  343. case 'ID':
  344. case 'SORT':
  345. case 'COURSE_LESSON_ID':
  346. $arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'number', $bFullJoin, $cOperationType);
  347. break;
  348. case 'ACTIVE':
  349. $arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'string_equal', $bFullJoin, $cOperationType);
  350. break;
  351. case 'ACTIVE_FROM':
  352. case 'ACTIVE_TO':
  353. if ($val !== null)
  354. $arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'date', $bFullJoin, $cOperationType);
  355. break;
  356. case "ACTIVE_DATE":
  357. if($val <> '')
  358. {
  359. $arSqlSearch[] = ($cOperationType == "N" ? " NOT" : "")
  360. . "((LG.ACTIVE_TO >= " . $DB->GetNowFunction()
  361. ." OR LG.ACTIVE_TO IS NULL) AND (LG.ACTIVE_FROM <= " . $DB->GetNowFunction()
  362. . " OR LG.ACTIVE_FROM IS NULL))";
  363. }
  364. break;
  365. case 'TITLE':
  366. case 'CODE':
  367. $arSqlSearch[] = CLearnHelper::FilterCreate("LG." . $key, $val, "string", $bFullJoin, $cOperationType);
  368. break;
  369. case 'COURSE_TITLE':
  370. $arSqlSearch[] = CLearnHelper::FilterCreate("LL.NAME", $val, "string", $bFullJoin, $cOperationType);
  371. break;
  372. case 'MEMBER_ID':
  373. $arSqlSearch[] = CLearnHelper::FilterCreate('LGM.USER_ID', intval($val), 'number', $bFullJoin, $cOperationType);
  374. break;
  375. default:
  376. if (mb_substr($key, 0, 3) !== 'UF_')
  377. {
  378. throw new LearnException(
  379. 'Unknown field: ' . $key,
  380. LearnException::EXC_ERR_ALL_PARAMS
  381. );
  382. }
  383. break;
  384. }
  385. }
  386. return array_filter($arSqlSearch);
  387. }
  388. }