PageRenderTime 37ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/learning/admin/menu.php

https://gitlab.com/alexprowars/bitrix
PHP | 470 lines | 386 code | 53 blank | 31 comment | 34 complexity | efa9cd59ff5c393f8c630df9255996c8 MD5 | raw file
  1. <?php
  2. if ( ! CModule::IncludeModule('learning') )
  3. return (false);
  4. if (!($USER->GetID() > 0))
  5. return (false);
  6. IncludeModuleLangFile(__FILE__);
  7. $arSubMenu = $arSubCourse = Array();
  8. function __learning_admin_get_menu ($THIS, $arPath = array(), $deep = 0, &$immediateChildsIds, $loadOnlySpecialEntities = false)
  9. {
  10. $immediateChildsIds = array(); // puts here ids of all immediate childs
  11. $deep = (int) $deep;
  12. // Index in path for current parentLessonId
  13. $indexInPath = $deep - 1; // Path doesn't include top root element ('all courses' or 'all unilessons')
  14. $arMenu = array();
  15. //$urlPath = $oPath->ExportUrlencoded();
  16. // current lesson id (not exists only for top root)
  17. if (isset($arPath[$deep]))
  18. $currentLessonIdInPath = (int) $arPath[$deep];
  19. else
  20. $currentLessonIdInPath = false;
  21. // Path to current element
  22. $arCurrentDeepPath = array();
  23. foreach ($arPath as $key => $value)
  24. {
  25. if ($key === $deep)
  26. break;
  27. $arCurrentDeepPath[] = $value;
  28. }
  29. if ($deep === 0)
  30. {
  31. // We are at the top level, so we must get list of all courses
  32. $CDBResult = CCourse::GetList (array('COURSE_SORT' => 'ASC'));
  33. }
  34. else
  35. {
  36. // If not parent with such indexInPath => we are deep too much.
  37. if ( ! isset($arPath[$indexInPath]) )
  38. return ($arMenu); // no items
  39. $parentLessonId = $arPath[$indexInPath];
  40. $oCurrentDeepPath = new CLearnPath();
  41. $oCurrentDeepPath->SetPathFromArray(array_merge($arCurrentDeepPath));
  42. $urlPath = $oCurrentDeepPath->ExportUrlencoded();
  43. $arMenu[] = array(
  44. "text" => GetMessage("LEARNING_QUESTION"),
  45. "url" => "learn_question_admin.php?lang=" . LANG
  46. . '&PARENT_LESSON_ID=' . ($parentLessonId + 0)
  47. . '&LESSON_PATH=' . $urlPath
  48. . "&from=learn_menu",
  49. "icon" => "learning_icon_question",
  50. //"page_icon" => "learning_page_icon_question",
  51. "more_url" =>
  52. array(
  53. "learn_question_admin.php?lang=" . LANG
  54. . '&PARENT_LESSON_ID=' . ($parentLessonId + 0)
  55. . '&LESSON_PATH=' . $urlPath
  56. . "&from=learn_menu",
  57. "learn_question_edit.php?lang=" . LANG
  58. . '&LESSON_PATH=' . $urlPath
  59. . "&from=learn_menu",
  60. "learn_question_admin.php?lang=" . LANG
  61. . '&PARENT_LESSON_ID=' . ($parentLessonId + 0)
  62. . '&LESSON_PATH=' . $urlPath,
  63. "learn_question_edit.php?lang=" . LANG
  64. . '&LESSON_PATH=' . $urlPath,
  65. "learn_question_admin.php?lang=" . LANG
  66. . '&LESSON_PATH=' . $urlPath,
  67. ),
  68. "title" => GetMessage("LEARNING_QUESTION_LIST"),
  69. );
  70. $CDBResult = CLearnLesson::GetListOfImmediateChilds (
  71. $parentLessonId,
  72. array('EDGE_SORT' => 'ASC')
  73. );
  74. // determine, is parent a course (only for courses in subroot level)?
  75. if ($deep === 1)
  76. {
  77. $immediateParentCourse = CLearnLesson::GetLinkedCourse ($parentLessonId);
  78. if ($immediateParentCourse !== false)
  79. {
  80. // immediate parent is a course, so we must add entity 'Tests'
  81. $arMenu[] = array(
  82. 'text' => GetMessage('LEARNING_TESTS'),
  83. 'url' => 'learn_test_admin.php?lang=' . LANG
  84. . '&filter=Y&set_filter=Y'
  85. . '&COURSE_ID=' . ($immediateParentCourse + 0)
  86. . '&PARENT_LESSON_ID=' . ($parentLessonId + 0)
  87. . '&LESSON_PATH=' . $urlPath,
  88. 'icon' => 'learning_icon_tests',
  89. //'page_icon' => 'learning_page_icon_tests',
  90. 'more_url' =>
  91. array(
  92. 'learn_test_admin.php?lang=' . LANG
  93. . '&set_filter=Y'
  94. . '&COURSE_ID=' . ($immediateParentCourse + 0)
  95. . '&PARENT_LESSON_ID=' . ($parentLessonId + 0)
  96. . '&LESSON_PATH=' . $urlPath,
  97. 'learn_test_edit.php?lang=' . LANG
  98. . '&filter=Y&set_filter=Y'
  99. . '&COURSE_ID=' . ($immediateParentCourse + 0)
  100. . '&PARENT_LESSON_ID=' . ($parentLessonId + 0)
  101. . '&LESSON_PATH=' . $urlPath
  102. ),
  103. 'title' => GetMessage('LEARNING_TESTS_LIST'),
  104. );
  105. unset ($urlPath);
  106. unset ($oCurrentDeepPath);
  107. }
  108. }
  109. }
  110. if ($loadOnlySpecialEntities)
  111. return ($arMenu);
  112. // When listing courses, limit it's count
  113. if ($deep === 0)
  114. {
  115. $items = 0;
  116. $learning_menu_max_courses = (int) COption::GetOptionString("learning", "menu_max_courses", "10");
  117. }
  118. while ($arData = $CDBResult->GetNext())
  119. {
  120. // When listing courses, limit it's count
  121. if ($deep === 0)
  122. {
  123. if ($items >= $learning_menu_max_courses)
  124. {
  125. // add element 'other courses'
  126. $arMenu[] = array(
  127. 'text' => GetMessage('LEARNING_MENU_COURSES_OTHER'),
  128. 'url' => 'learn_unilesson_admin.php?lang=' . LANG . '&PARENT_LESSON_ID=-1',
  129. 'title' => GetMessage('LEARNING_MENU_COURSES_ALT'),
  130. 'more_url' => array(
  131. 'learn_test_admin.php',
  132. 'learn_test_edit.php',
  133. 'learn_unilesson_admin.php',
  134. 'learn_unilesson_edit.php',
  135. 'learn_question_admin.php',
  136. 'learn_question_edit.php'
  137. )
  138. );
  139. // stop adding courses to menu
  140. break;
  141. }
  142. $items++;
  143. }
  144. $arSubImmediateChildsIds = false;
  145. $arCurItemPath = $arCurrentDeepPath;
  146. $arCurItemPath[] = ($arData['LESSON_ID'] + 0);
  147. // Remember all immediate childs
  148. $immediateChildsIds[] = ($arData['LESSON_ID'] + 0);
  149. $oCurItemPath = new CLearnPath();
  150. $oCurItemPath->SetPathFromArray ($arCurItemPath);
  151. $urlCurItemPath = $oCurItemPath->ExportUrlencoded();
  152. $arItem = array(
  153. 'text' => $arData['NAME'],
  154. 'url' => 'learn_unilesson_admin.php?lang=' . LANG
  155. . '&PARENT_LESSON_ID=' . ($arData['LESSON_ID'] + 0)
  156. . '&LESSON_PATH=' . $oCurItemPath->ExportUrlencoded(),
  157. 'title' => $arData['NAME'],
  158. 'items_id' => 'menu_learning_courses_new_' . implode ('_', $arCurItemPath),
  159. "icon" => "learning_icon_courses",
  160. 'module_id' => 'learning',
  161. 'more_url' => array(
  162. 'learn_unilesson_admin.php?lang=' . LANG
  163. . '&set_filter=Y'
  164. . '&PARENT_LESSON_ID=' . ($arData['LESSON_ID'] + 0)
  165. . '&LESSON_PATH=' . $urlCurItemPath,
  166. 'learn_unilesson_admin.php?lang=' . LANG
  167. . '&PARENT_LESSON_ID=' . ($arData['LESSON_ID'] + 0)
  168. . '&LESSON_PATH=' . $urlCurItemPath,
  169. 'learn_unilesson_admin.php?lang=' . LANG
  170. . '&set_filter=Y'
  171. . '&LESSON_PATH=' . $urlCurItemPath,
  172. 'learn_question_admin.php?lang=' . LANG
  173. . '&filter=Y&set_filter=Y'
  174. . '&LESSON_PATH=' . $urlCurItemPath,
  175. 'learn_question_edit.php?lang=' . LANG
  176. . '&set_filter=Y'
  177. . '&LESSON_PATH=' . $urlCurItemPath,
  178. 'learn_unilesson_edit.php?lang=' . LANG
  179. . '&LESSON_ID=' . ($arData['LESSON_ID'] + 0)
  180. . '&LESSON_PATH=' . $urlCurItemPath,
  181. 'learn_unilesson_edit.php?lang=' . LANG
  182. . '&PARENT_LESSON_ID=' . ($arData['LESSON_ID'] + 0)
  183. . '&LESSON_PATH=' . $urlCurItemPath
  184. )
  185. );
  186. $arItem['items'] = array();
  187. if ( ( $deep === 0) && isset($arData['LINKED_LESSON_ID']) && ($arData['LINKED_LESSON_ID'] > 0 ) )
  188. {
  189. $arItem['page_icon'] = $arItem['icon'] = 'learning_icon_courses';
  190. $arItem['dynamic'] = true;
  191. $loadOnlySpecialEntities = false;
  192. // Load child items only for lesson in current path
  193. if ($arData['LESSON_ID'] == $currentLessonIdInPath)
  194. $arItem['items'] = __learning_admin_get_menu ($THIS, $arPath, $deep + 1, $arSubImmediateChildsIds);
  195. }
  196. else
  197. {
  198. $loadOnlySpecialEntities = false;
  199. $childsCnt = CLearnLesson::CountImmediateChilds($arData['LESSON_ID']);
  200. $questionsCnt = CLQuestion::GetCount(array('LESSON_ID' => (int) $arData['LESSON_ID']));
  201. if ($childsCnt > 0)
  202. $arItem['page_icon'] = $arItem['icon'] = 'learning_icon_chapters';
  203. else
  204. $arItem['page_icon'] = $arItem['icon'] = 'learning_icon_lessons';
  205. $arItem['dynamic'] = true;
  206. // Load child items only for lesson in current path
  207. if ($arData['LESSON_ID'] == $currentLessonIdInPath)
  208. $arItem['items'] = __learning_admin_get_menu ($THIS, $arPath, $deep + 1, $arSubImmediateChildsIds);
  209. }
  210. // now, adds items into more_url (it needs when edit form for childs opened)
  211. if (is_array($arSubImmediateChildsIds))
  212. {
  213. $oSubItemPath = new CLearnPath();
  214. foreach ($arSubImmediateChildsIds as $k => $v)
  215. {
  216. // determine path for every child
  217. $arSubItemPath = $arCurItemPath;
  218. $arSubItemPath[] = $v; // child id added to current path
  219. $oSubItemPath->SetPathFromArray ($arSubItemPath);
  220. $arItem['more_url'][] =
  221. 'learn_unilesson_edit.php?lang=' . LANG
  222. . '&filter=Y&set_filter=Y'
  223. . '&LESSON_ID=' . ($v + 0)
  224. . '&LESSON_PATH=' . $oSubItemPath->ExportUrlencoded();
  225. }
  226. unset ($oSubItemPath);
  227. $arSubImmediateChildsIds = false;
  228. }
  229. $arMenu[] = $arItem;
  230. unset($oCurItemPath, $arCurItemPath, $urlCurItemPath, $arItem);
  231. }
  232. return ($arMenu);
  233. }
  234. $oAccess = CLearnAccess::GetInstance($USER->GetID());
  235. $module_id = "learning";
  236. if (\CLearnAccessMacroses::CanViewAdminMenu())
  237. {
  238. // Try to determine current path
  239. $oPath = new CLearnPath();
  240. if (isset($_GET['LESSON_PATH']))
  241. $oPath->ImportUrlencoded ($_GET['LESSON_PATH']);
  242. elseif (isset($_GET['admin_mnu_module_id'])
  243. && isset($_GET['admin_mnu_menu_id'])
  244. && ($_GET['admin_mnu_module_id'] === 'learning')
  245. )
  246. {
  247. $strLessonIds = mb_substr($_GET['admin_mnu_menu_id'], mb_strlen('menu_learning_courses_new_'));
  248. if ($strLessonIds <> '')
  249. {
  250. $arLessonIds = explode('_', $strLessonIds);
  251. if ( is_array($arLessonIds) && (count($arLessonIds) > 0) )
  252. $oPath->SetPathFromArray($arLessonIds);
  253. }
  254. }
  255. $arPath = $oPath->GetPathAsArray();
  256. $urlPath = $oPath->ExportUrlencoded();
  257. $arSubImmediateChildsIds = null;
  258. $aMenu = array(
  259. "parent_menu" => "global_menu_services",
  260. "section" => "learning",
  261. "sort" => 600,
  262. "text" => GetMessage("LEARNING_MENU_LEARNING"),
  263. "title" => GetMessage("LEARNING_MENU_LEARNING_TITLE"),
  264. "icon" => "learning_menu_icon",
  265. "page_icon" => "learning_page_icon",
  266. "items_id" => "menu_learning",
  267. //"url" => "learn_index.php?lang=" . LANG,
  268. "items" =>
  269. Array(
  270. // Courses in new data model
  271. array(
  272. "text" => GetMessage("LEARNING_MENU_COURSES"),
  273. "url" => "learn_unilesson_admin.php?lang=" . LANG
  274. . '&PARENT_LESSON_ID=-1', // '-1' means "List courses"
  275. "title" => GetMessage("LEARNING_MENU_COURSES_ALT"),
  276. "items_id" => "menu_learning_courses_new",
  277. "icon" => "learning_icon_courses",
  278. //"page_icon" => "learning_page_icon_courses",
  279. "dynamic" => true,
  280. "module_id" => "learning",
  281. "more_url" =>
  282. Array(
  283. "learn_course_edit.php",
  284. ),
  285. "items" => __learning_admin_get_menu($this, $arPath, $deep = 0, $arSubImmediateChildsIds) // Build menu from the top
  286. ),
  287. // List any lessons
  288. array(
  289. "text" => GetMessage("LEARNING_LESSONS_LIST"), // "List of all lessons"
  290. "url" => "learn_unilesson_admin.php?lang=" . LANG
  291. . '&set_filter=Y'
  292. . '&PARENT_LESSON_ID=-2', // '-2' means "List any lessons"
  293. "title" => GetMessage("LEARNING_LESSONS_LIST"), // "List of all lessons"
  294. "items_id" => "menu_learning_any_lessons36",
  295. "icon" => "learning_icon_lessons",
  296. //"page_icon" => "learning_icon_lessons",
  297. "module_id" => "learning",
  298. "more_url" =>
  299. Array(
  300. "learn_unilesson_admin.php",
  301. "learn_unilesson_edit.php",
  302. ),
  303. "dynamic" => false,
  304. "items" => array()
  305. ),
  306. //Certification
  307. array(
  308. "text" => GetMessage("LEARNING_MENU_CERTIFICATION"),
  309. "url" => "learn_certification_admin.php?lang=".LANG,
  310. "title" => GetMessage("LEARNING_MENU_CERTIFICATION_ALT"),
  311. "items_id" => "menu_learning_certification",
  312. "icon" => "learning_icon_certification",
  313. "page_icon" => "learning_page_icon_certification",
  314. "more_url" =>
  315. Array(
  316. "learn_certification_edit.php",
  317. ),
  318. ),
  319. //Gradebook
  320. array(
  321. "text" => GetMessage("LEARNING_MENU_GRADEBOOK"),
  322. "url" => "learn_gradebook_admin.php?lang=".LANG,
  323. "title" => GetMessage("LEARNING_MENU_GRADEBOOK_ALT"),
  324. "items_id" => "menu_learning_gradebook",
  325. "icon" => "learning_icon_gradebook",
  326. "page_icon" => "learning_page_icon_gradebook",
  327. "more_url" =>
  328. Array(
  329. "learn_gradebook_edit.php",
  330. ),
  331. ),
  332. //Attempts
  333. array(
  334. "text" => GetMessage("LEARNING_MENU_ATTEMPT"),
  335. "url" => "learn_attempt_admin.php?lang=".LANG,
  336. "title" => GetMessage("LEARNING_MENU_ATTEMPT_ALT"),
  337. "items_id" => "menu_learning_attempt",
  338. "icon" => "learning_icon_attempts",
  339. "page_icon" => "learning_page_icon_attempts",
  340. "more_url" =>
  341. Array(
  342. "learn_attempt_edit.php",
  343. "learn_test_result_edit.php",
  344. "learn_test_result_admin.php",
  345. ),
  346. )
  347. )
  348. );
  349. if ($oAccess->IsBaseAccess(CLearnAccess::OP_LESSON_MANAGE_RIGHTS))
  350. {
  351. $aMenu['items'][] = array(
  352. 'text' => GetMessage('LEARNING_MENU_GROUPS'),
  353. 'url' => 'learn_group_admin.php?lang=' . LANG,
  354. 'title' => GetMessage('LEARNING_MENU_GROUPS_ALT'),
  355. 'items_id' => 'menu_learning_groups',
  356. 'icon' => 'learning_icon_groups',
  357. //'page_icon' => 'learning_page_icon_export',
  358. 'more_url' => array(
  359. 'learn_group_edit.php'
  360. )
  361. );
  362. }
  363. // Export
  364. $aMenu['items'][] = array(
  365. "text" => GetMessage("LEARNING_MENU_EXPORT"),
  366. "url" => "learn_export.php?lang=" . LANG,
  367. "title" => GetMessage("LEARNING_MENU_EXPORT_ALT"),
  368. "items_id" => "menu_learning_export",
  369. "icon" => "learning_icon_export",
  370. "page_icon" => "learning_page_icon_export",
  371. "more_url" => array()
  372. );
  373. if ($oAccess->IsBaseAccess(
  374. CLearnAccess::OP_LESSON_CREATE
  375. | CLearnAccess::OP_LESSON_LINK_TO_PARENTS
  376. | CLearnAccess::OP_LESSON_LINK_DESCENDANTS
  377. )
  378. ||
  379. (
  380. $oAccess->IsBaseAccess (CLearnAccess::OP_LESSON_CREATE )
  381. && $oAccess->IsBaseAccessForCR (CLearnAccess::OP_LESSON_LINK_TO_PARENTS | CLearnAccess::OP_LESSON_LINK_DESCENDANTS)
  382. )
  383. )
  384. {
  385. $aMenu["items"][] = Array(
  386. "text" => GetMessage("LEARNING_MENU_IMPORT"),
  387. "url" => "learn_import.php?lang=".LANG,
  388. "title" => GetMessage("LEARNING_MENU_IMPORT_ALT"),
  389. "items_id" => "menu_learning_export",
  390. "icon" => "learning_icon_export",
  391. "page_icon" => "learning_page_icon_export",
  392. "more_url" =>
  393. Array(
  394. ),
  395. );
  396. }
  397. if ($USER->IsAdmin() && isset($_GET['easter_egg']))
  398. {
  399. $aMenu['items'][] = array(
  400. 'text' => 'Easter Egg',
  401. 'url' => 'learn_eegg.php?lang=' . LANG,
  402. 'title' => 'Utilities',
  403. 'items_id' => 'menu_learning_eegg_utils',
  404. //'icon' => 'util_page_icon',
  405. 'page_icon' => 'util_page_icon',
  406. 'more_url' =>
  407. Array(
  408. ),
  409. );
  410. }
  411. }
  412. else
  413. {
  414. define("LEARNING_ADMIN_ACCESS_DENIED","Y");
  415. return false;
  416. }
  417. return $aMenu;