PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/components/bitrix/learning.lesson.detail/component.php

https://gitlab.com/alexprowars/bitrix
PHP | 322 lines | 267 code | 42 blank | 13 comment | 44 complexity | e58b91e47f42d3ee6e0e50c1703b8dcd MD5 | raw file
  1. <?
  2. if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
  3. if ( ! CModule::IncludeModule('learning') )
  4. return (false);
  5. //Params
  6. $arParams["COURSE_ID"] = (isset($arParams["COURSE_ID"]) && intval($arParams["COURSE_ID"]) > 0 ? intval($arParams["COURSE_ID"]) : intval($_REQUEST["COURSE_ID"]));
  7. $arParams["LESSON_ID"] = (isset($arParams["LESSON_ID"]) && intval($arParams["LESSON_ID"]) > 0 ? intval($arParams["LESSON_ID"]) : intval($_REQUEST["LESSON_ID"]));
  8. $arParams["SELF_TEST_TEMPLATE"] = ($arParams["SELF_TEST_TEMPLATE"] <> '' ? htmlspecialcharsbx($arParams["SELF_TEST_TEMPLATE"]) : "self.php?SELF_TEST_ID=#SELF_TEST_ID#");
  9. $arParams["CHECK_PERMISSIONS"] = (isset($arParams["CHECK_PERMISSIONS"]) && $arParams["CHECK_PERMISSIONS"]=="N" ? "N" : "Y");
  10. if ( ! (isset($arParams['LESSON_PATH']) && mb_strlen($arParams['LESSON_PATH']) ) )
  11. {
  12. $arParams['LESSON_PATH'] = '';
  13. if (isset($_REQUEST['LESSON_PATH']) && mb_strlen($_REQUEST['LESSON_PATH']))
  14. $arParams['LESSON_PATH'] = $_REQUEST['LESSON_PATH'];
  15. }
  16. $strUrlencodedLessonPath = '';
  17. if ($arParams['LESSON_PATH'] <> '')
  18. $strUrlencodedLessonPath = 'LESSON_PATH=' . $arParams['LESSON_PATH'];
  19. $ratingTransistor = '';
  20. if ($arParams['LESSON_ID'] > 0)
  21. {
  22. $arRatingData = CRatings::GetRatingVoteResult('LEARN_LESSON', $arParams['LESSON_ID']);
  23. $ratingTransistor = serialize($arRatingData);
  24. }
  25. $delayed = false;
  26. $courseLessonId = CCourse::CourseGetLinkedLesson($arParams['COURSE_ID']);
  27. $arGroupsPeriods = CLearnAccessMacroses::getActiveLearningGroupsPeriod($courseLessonId, $USER->getId());
  28. if ($arGroupsPeriods['IS_EXISTS'])
  29. {
  30. $arResult['LEARNING_GROUP_ACTIVE_FROM'] = $arGroupsPeriods['ACTIVE_FROM'];
  31. $arResult['LEARNING_GROUP_ACTIVE_TO'] = $arGroupsPeriods['ACTIVE_TO'];
  32. $activeFromMap = CLearnAccessMacroses::getActiveLearningChaptersPeriod($courseLessonId, $USER->getId());
  33. if ($activeFromMap !== false)
  34. $arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'] = $activeFromMap;
  35. $oPath = new CLearnPath();
  36. $oPath->ImportUrlencoded ($arParams['LESSON_PATH']);
  37. $arPath = $oPath->GetPathAsArray();
  38. if (count($arPath) >= 2)
  39. {
  40. $secondLevelLesson = $arPath[1];
  41. if (isset($arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'][$secondLevelLesson]))
  42. {
  43. $activeFrom = $arResult['LEARNING_GROUP_CHAPTERS_ACTIVE_FROM'][$secondLevelLesson];
  44. if (time() < MakeTimeStamp($activeFrom))
  45. {
  46. $delayed = $activeFrom;
  47. }
  48. }
  49. }
  50. }
  51. $lastDirtyCacheTS = COption::GetOptionString(
  52. 'learning',
  53. CLearnCacheOfLessonTreeComponent::OPTION_TS,
  54. time()
  55. );
  56. // was: if($this->StartResultCache(false, $USER->GetGroups()))
  57. $additionalCacheID = CLearnAccess::GetAccessSymbolsHashForSiteUser()
  58. . '|' . $ratingTransistor . '|' . $lastDirtyCacheTS . '|' . ($delayed === false ? 'ND' : 'D');
  59. if ($this->StartResultCache(false, $additionalCacheID))
  60. {
  61. // Module
  62. if (!CModule::IncludeModule("learning"))
  63. {
  64. $this->AbortResultCache();
  65. ShowError(GetMessage("LEARNING_MODULE_NOT_FOUND"));
  66. return;
  67. }
  68. if ($arParams["CHECK_PERMISSIONS"] !== 'N')
  69. {
  70. try
  71. {
  72. $arPermissionsParams = array(
  73. 'COURSE_ID' => $arParams['COURSE_ID'],
  74. 'LESSON_ID' => $arParams['LESSON_ID']
  75. );
  76. $isAccessible = CLearnAccessMacroses::CanUserViewLessonAsPublic ($arPermissionsParams);
  77. }
  78. catch (Exception $e)
  79. {
  80. $isAccessible = false; // access denied
  81. }
  82. if ( ! $isAccessible )
  83. {
  84. ShowError(GetMessage('LEARNING_COURSE_DENIED'));
  85. return;
  86. }
  87. }
  88. // Course
  89. $rsCourse = CCourse::GetList(
  90. Array(),
  91. Array(
  92. "ID" => $arParams["COURSE_ID"],
  93. "ACTIVE" => "Y",
  94. "ACTIVE_DATE" => "Y",
  95. "SITE_ID" => LANG,
  96. "CHECK_PERMISSIONS" => 'N'
  97. )
  98. );
  99. if (!$arCourse = $rsCourse->GetNext())
  100. {
  101. $this->AbortResultCache();
  102. ShowError(GetMessage("LEARNING_COURSE_DENIED"));
  103. return;
  104. }
  105. // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour
  106. // can be changed in future without any notifications.
  107. if (isset($arCourse['DETAIL_TEXT']))
  108. {
  109. $arCourse['DETAIL_TEXT'] = CLearnHelper::PatchLessonContentLinks(
  110. $arCourse['DETAIL_TEXT'],
  111. $arParams['COURSE_ID']
  112. );
  113. }
  114. if (isset($arCourse['PREVIEW_TEXT']))
  115. {
  116. $arCourse['PREVIEW_TEXT'] = CLearnHelper::PatchLessonContentLinks(
  117. $arCourse['PREVIEW_TEXT'],
  118. $arParams['COURSE_ID']
  119. );
  120. }
  121. // Lesson
  122. $rsLesson = CLearnLesson::GetList(
  123. array(),
  124. array(
  125. 'LESSON_ID' => $arParams['LESSON_ID'],
  126. 'ACTIVE' => 'Y',
  127. 'CHECK_PERMISSIONS' => 'N'
  128. )
  129. );
  130. if (!$arLesson = $rsLesson->GetNext())
  131. {
  132. $this->AbortResultCache();
  133. ShowError(GetMessage("LEARNING_LESSON_DENIED"));
  134. return;
  135. }
  136. // Images
  137. $arLesson["PREVIEW_PICTURE_ARRAY"] = CFile::GetFileArray($arLesson["PREVIEW_PICTURE"]);
  138. $arLesson["DETAIL_PICTURE_ARRAY"] = CFile::GetFileArray($arLesson["DETAIL_PICTURE"]);
  139. // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour
  140. // can be changed in future without any notifications.
  141. if (isset($arLesson['DETAIL_TEXT']))
  142. {
  143. $arLesson['DETAIL_TEXT'] = CLearnHelper::PatchLessonContentLinks(
  144. $arLesson['DETAIL_TEXT'],
  145. $arParams['COURSE_ID']
  146. );
  147. }
  148. if (isset($arLesson['PREVIEW_TEXT']))
  149. {
  150. $arLesson['PREVIEW_TEXT'] = CLearnHelper::PatchLessonContentLinks(
  151. $arLesson['PREVIEW_TEXT'],
  152. $arParams['COURSE_ID']
  153. );
  154. }
  155. // Self test page URL
  156. $arLesson["SELF_TEST_URL"] = CComponentEngine::MakePathFromTemplate(
  157. $arParams["SELF_TEST_TEMPLATE"],
  158. Array(
  159. "LESSON_ID" => $arParams["LESSON_ID"],
  160. "SELF_TEST_ID" => $arParams["LESSON_ID"],
  161. "COURSE_ID" => $arParams["COURSE_ID"],
  162. )
  163. );
  164. //Self test exists?
  165. $rsQuestion = CLQuestion::GetList(
  166. Array(),
  167. Array(
  168. "LESSON_ID" => $arParams["LESSON_ID"],
  169. "ACTIVE" => "Y",
  170. "SELF" => "Y",
  171. )
  172. );
  173. $arLesson["SELF_TEST_EXISTS"] = (bool)($rsQuestion->Fetch());
  174. $urlInfo = parse_url($arLesson["LAUNCH"]);
  175. $path = $_SERVER["DOCUMENT_ROOT"].$urlInfo["path"];
  176. if ($arLesson["DETAIL_TEXT_TYPE"] == "file" && !file_exists($path))
  177. {
  178. $arLesson["LAUNCH"] = "";
  179. }
  180. if ($delayed === false)
  181. {
  182. $arResult = array(
  183. 'DELAYED' => $delayed,
  184. "COURSE" => $arCourse,
  185. "LESSON" => $arLesson
  186. );
  187. }
  188. else
  189. {
  190. $arResult = array(
  191. 'DELAYED' => $delayed,
  192. "COURSE" => $arCourse,
  193. 'LESSON' => null,
  194. "DELAYED_LESSON" => $arLesson
  195. );
  196. }
  197. global $CACHE_MANAGER;
  198. $CACHE_MANAGER->RegisterTag('LEARN_COURSE_'.$arCourse["ID"]);
  199. $CACHE_MANAGER->RegisterTag('LEARN_LESSON_'.$arLesson["ID"]);
  200. unset($arLesson);
  201. unset($rsLesson);
  202. unset($arCourse);
  203. unset($rsCourse);
  204. unset($rsQuestion);
  205. $APPLICATION->AddHeadScript('/bitrix/js/learning/scorm.js');
  206. $this->IncludeComponentTemplate();
  207. }
  208. //Set Title
  209. $arParams["SET_TITLE"] = ($arParams["SET_TITLE"] == "N" ? "N" : "Y" );
  210. if ($arParams["SET_TITLE"] == "Y")
  211. $APPLICATION->SetTitle($arResult["LESSON"]["NAME"]);
  212. $bCanUserEdit = CLearnAccessMacroses::CanUserEditLesson(array('lesson_id' => $arParams['LESSON_ID'])) || $USER->IsAdmin();
  213. $bCanUserRemove = CLearnAccessMacroses::CanUserRemoveLesson(array('lesson_id' => $arParams['LESSON_ID'])) || $USER->IsAdmin();
  214. if ($bCanUserEdit || $bCanUserRemove)
  215. {
  216. $arAreaButtons = array();
  217. $deleteReturnUrl = "";
  218. if ($bCanUserRemove)
  219. {
  220. if ($parent = $this->GetParent())
  221. {
  222. $parentLessonId = 0;
  223. $lessonPath = "";
  224. if ($arParams["LESSON_PATH"] <> '')
  225. {
  226. $path = new CLearnPath();
  227. $path->ImportUrlencoded($arParams["LESSON_PATH"]);
  228. $path->PopBottom();
  229. $lessonPath = $path->ExportUrlencoded();
  230. $lessonId = $path->PopBottom();
  231. $edgesToParents = CLearnLesson::ListImmediateParents($arParams["LESSON_ID"]);
  232. foreach ($edgesToParents as $arEdgeToParent)
  233. {
  234. if ( (int) $arEdgeToParent['PARENT_LESSON'] === (int) $lessonId )
  235. {
  236. $parentLessonId = $lessonId;
  237. break;
  238. }
  239. }
  240. }
  241. if ($parentLessonId)
  242. {
  243. $deleteReturnUrl = CComponentEngine::MakePathFromTemplate($parent->arResult["FOLDER"].$parent->arResult["URL_TEMPLATES"]["chapter.detail"], Array("CHAPTER_ID" => "0".$parentLessonId,"COURSE_ID" => $arParams['COURSE_ID']));
  244. $deleteReturnUrl .= mb_strpos($deleteReturnUrl, "?") !== false ? "&" : "?";
  245. $deleteReturnUrl .= "LESSON_PATH=".$lessonPath;
  246. }
  247. else
  248. {
  249. $deleteReturnUrl = CComponentEngine::MakePathFromTemplate($parent->arResult["FOLDER"].$parent->arResult["URL_TEMPLATES"]["course.detail"], Array("COURSE_ID" => $arParams['COURSE_ID']));
  250. }
  251. }
  252. $arAreaButtons[] = array(
  253. "TEXT" => GetMessage("LEARNING_COURSES_LESSON_EDIT"),
  254. "TITLE" => GetMessage("LEARNING_COURSES_LESSON_EDIT"),
  255. "URL" => 'javascript:'.$APPLICATION->GetPopupLink(
  256. array(
  257. "URL" => "/bitrix/admin/learn_unilesson_edit.php?LESSON_ID=" . $arParams["LESSON_ID"]
  258. . '&' . $strUrlencodedLessonPath
  259. . "&lang=" . LANGUAGE_ID . "&bxpublic=Y&from_module=learning",
  260. "PARAMS" => array(
  261. "width" => 700, 'height' => 500, 'resize' => true,
  262. ),
  263. )
  264. ),
  265. "ICON" => "bx-context-toolbar-edit-icon",
  266. "ID" => "bx-context-toolbar-edit-lesson",
  267. );
  268. }
  269. if ($bCanUserEdit)
  270. {
  271. $arAreaButtons[] = array(
  272. "TEXT" => GetMessage("LEARNING_COURSES_LESSON_DELETE"),
  273. "TITLE" => GetMessage("LEARNING_COURSES_LESSON_DELETE"),
  274. "URL" => "javascript:if(confirm('".GetMessage("LEARNING_COURSES_LESSON_DELETE_CONF")."'))jsUtils.Redirect([], '".CUtil::JSEscape("/bitrix/admin/learn_unilesson_admin.php?ID=".$arParams["LESSON_ID"]."&action=delete&lang=".LANGUAGE_ID."&".bitrix_sessid_get()."&COURSE_ID=".$arParams["COURSE_ID"]).($deleteReturnUrl <> ''? "&return_url=".urlencode($deleteReturnUrl) : "")."')",
  275. "ICON" => "bx-context-toolbar-delete-icon",
  276. "ID" => "bx-context-toolbar-delete-lesson",
  277. );
  278. }
  279. $this->AddIncludeAreaIcons($arAreaButtons);
  280. }