courses_categories.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * View (MVC patter) for courses categories
  5. * @author Christian Fasanando <christian1827@gmail.com> - Beeznest
  6. * @package chamilo.auth
  7. */
  8. if (isset($_REQUEST['action']) && Security::remove_XSS($_REQUEST['action']) !== 'subscribe') {
  9. $stok = Security::get_token();
  10. } else {
  11. $stok = $_SESSION['sec_token'];
  12. }
  13. $showCourses = CoursesAndSessionsCatalog::showCourses();
  14. $showSessions = CoursesAndSessionsCatalog::showSessions();
  15. $pageCurrent = isset($pageCurrent) ? $pageCurrent : isset($_GET['pageCurrent']) ? intval($_GET['pageCurrent']) : 1;
  16. $pageLength = isset($pageLength) ? $pageLength : isset($_GET['pageLength']) ? intval($_GET['pageLength']) : 12;
  17. $pageTotal = intval(ceil(intval($countCoursesInCategory) / $pageLength));
  18. $cataloguePagination = $pageTotal > 1 ? CourseCategory::getCatalogPagination($pageCurrent, $pageLength, $pageTotal) : '';
  19. $search_term = isset($search_term) ? $search_term : null;
  20. if ($showSessions && isset($_POST['date'])) {
  21. $date = $_POST['date'];
  22. } else {
  23. $date = date('Y-m-d');
  24. }
  25. $userInfo = api_get_user_info();
  26. $code = isset($code) ? $code : null;
  27. ?>
  28. <script>
  29. $(document).ready( function() {
  30. $('.star-rating li a').on('click', function(event) {
  31. var id = $(this).parents('ul').attr('id');
  32. $('#vote_label2_' + id).html("<?php echo get_lang('Loading'); ?>");
  33. $.ajax({
  34. url: $(this).attr('data-link'),
  35. success: function(data) {
  36. $("#rating_wrapper_"+id).html(data);
  37. if(data == 'added') {
  38. //$('#vote_label2_' + id).html("{'Saved'|get_lang}");
  39. }
  40. if(data == 'updated') {
  41. //$('#vote_label2_' + id).html("{'Saved'|get_lang}");
  42. }
  43. }
  44. });
  45. });
  46. var getSessionId = function (el) {
  47. var parts = el.id.split('_');
  48. return parseInt(parts[1], 10);
  49. };
  50. <?php if ($showSessions) { ?>
  51. $('#date').datepicker({
  52. dateFormat: 'yy-mm-dd'
  53. });
  54. <?php } ?>
  55. });
  56. </script>
  57. <div class="row">
  58. <div class="col-md-4">
  59. <h5><?php echo get_lang('Search'); ?></h5>
  60. <?php
  61. if ($showCourses) {
  62. if (!isset($_GET['hidden_links']) || intval($_GET['hidden_links']) != 1) { ?>
  63. <form class="form-horizontal" method="post" action="<?php echo CourseCategory::getCourseCategoryUrl(1, $pageLength, 'ALL', 0, 'subscribe'); ?>">
  64. <input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
  65. <input type="hidden" name="search_course" value="1" />
  66. <div class="input-group">
  67. <input class="form-control" type="text" name="search_term" value="<?php echo (empty($_POST['search_term']) ? '' : api_htmlentities(Security::remove_XSS($_POST['search_term']))); ?>" />
  68. <div class="input-group-btn">
  69. <button class="btn btn-default" type="submit">
  70. <em class="fa fa-search"></em> <?php echo get_lang('Search'); ?>
  71. </button>
  72. </div>
  73. </div>
  74. </form>
  75. <?php } ?>
  76. </div>
  77. <div class="col-md-4">
  78. <h5><?php echo get_lang('CourseCategories'); ?></h5>
  79. <?php
  80. $webAction = api_get_path(WEB_CODE_PATH).'auth/courses.php';
  81. $action = (!empty($_REQUEST['action']) ? Security::remove_XSS($_REQUEST['action']) : 'display_courses');
  82. $pageLength = (!empty($_REQUEST['pageLength']) ? intval($_REQUEST['pageLength']) : 10);
  83. $pageCurrent = (!empty($_REQUEST['pageCurrent']) ? intval($_REQUEST['pageCurrent']) : 1);
  84. $form = '<form action="'.$webAction.'" method="GET" class="form-horizontal">';
  85. $form .= '<input type="hidden" name="action" value="' . $action . '">';
  86. $form .= '<input type="hidden" name="pageCurrent" value="' . $pageCurrent . '">';
  87. $form .= '<input type="hidden" name="pageLength" value="' . $pageLength . '">';
  88. $form .= '<div class="form-group">';
  89. $form .= '<div class="col-sm-12">';
  90. $form .= '<select name="category_code" onchange="submit();" class="selectpicker show-tick form-control">';
  91. $codeType = isset($_REQUEST['category_code']) ? Security::remove_XSS($_REQUEST['category_code']) : '';
  92. foreach ($browse_course_categories[0] as $category) {
  93. $categoryCode = $category['code'];
  94. $countCourse = $category['count_courses'];
  95. $form .= '<option '. ($categoryCode == $codeType? 'selected="selected" ':'') .' value="' . $category['code'] . '">' . $category['name'] . ' ( '. $countCourse .' ) </option>';
  96. if (!empty($browse_course_categories[$categoryCode])) {
  97. foreach ($browse_course_categories[$categoryCode] as $subCategory){
  98. $subCategoryCode = $subCategory['code'];
  99. $form .= '<option '. ($subCategoryCode == $codeType ? 'selected="selected" ':'') .' value="' . $subCategory['code'] . '"> ---' . $subCategory['name'] . ' ( '. $subCategory['count_courses'] .' ) </option>';
  100. }
  101. }
  102. }
  103. $form .= '</select>';
  104. $form .= '</div>';
  105. $form .= '</form>';
  106. echo $form;
  107. ?>
  108. </div>
  109. </div>
  110. <?php
  111. if ($showSessions) { ?>
  112. <div class="col-md-4">
  113. <h5><?php echo get_lang('Sessions'); ?></h5>
  114. <a class="btn btn-default btn-block" href="<?php echo CourseCategory::getCourseCategoryUrl(1, $pageLength, null, 0, 'display_sessions'); ?>">
  115. <?php echo get_lang('SessionList'); ?>
  116. </a>
  117. </div>
  118. <?php } ?>
  119. </div>
  120. <?php } ?>
  121. <div class="grid-courses">
  122. <div class="row">
  123. <?php
  124. if ($showCourses && $action != 'display_sessions') {
  125. if (!empty($message)) {
  126. Display::display_confirmation_message($message, false);
  127. }
  128. if (!empty($error)) {
  129. Display::display_error_message($error, false);
  130. }
  131. if (!empty($content)) {
  132. echo $content;
  133. }
  134. if (!empty($search_term)) {
  135. echo "<p><strong>".get_lang('SearchResultsFor')." ".Security::remove_XSS($_POST['search_term'])."</strong><br />";
  136. }
  137. $ajax_url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=add_course_vote';
  138. $user_id = api_get_user_id();
  139. $categoryList = CourseManager::getCategoriesList();
  140. if (!empty($browse_courses_in_category)) {
  141. foreach ($browse_courses_in_category as $course) {
  142. $course_hidden = $course['visibility'] == COURSE_VISIBILITY_HIDDEN;
  143. if ($course_hidden) {
  144. continue;
  145. }
  146. $user_registerd_in_course = CourseManager::is_user_subscribed_in_course($user_id, $course['code']);
  147. $user_registerd_in_course_as_teacher = CourseManager::is_course_teacher($user_id, $course['code']);
  148. $user_registerd_in_course_as_student = ($user_registerd_in_course && !$user_registerd_in_course_as_teacher);
  149. $course_public = ($course['visibility'] == COURSE_VISIBILITY_OPEN_WORLD);
  150. $course_open = ($course['visibility'] == COURSE_VISIBILITY_OPEN_PLATFORM);
  151. $course_private = ($course['visibility'] == COURSE_VISIBILITY_REGISTERED);
  152. $course_closed = ($course['visibility'] == COURSE_VISIBILITY_CLOSED);
  153. $course_subscribe_allowed = ($course['subscribe'] == 1);
  154. $course_unsubscribe_allowed = ($course['unsubscribe'] == 1);
  155. $count_connections = $course['count_connections'];
  156. $creation_date = substr($course['creation_date'], 0, 10);
  157. $html = null;
  158. // display the course bloc
  159. $html .= '<div class="col-xs-6 col-sm-6 col-md-3"><div class="items items-courses">';
  160. $course['category_title'] = '';
  161. if (isset($course['category'])) {
  162. $course['category_title'] = isset($categoryList[$course['category']]) ? $categoryList[$course['category']] : '';
  163. }
  164. // display thumbnail
  165. $html .= returnThumbnail($course);
  166. $separator = '<div class="separator">&nbsp;</div>';
  167. $subscribeButton = return_register_button($course, $stok, $code, $search_term);
  168. // start buycourse validation
  169. // display the course price and buy button if the buycourses plugin is enabled and this course is configured
  170. $plugin = BuyCoursesPlugin::create();
  171. $isThisCourseInSale = $plugin->buyCoursesForGridCatalogVerificator(
  172. $course['real_id'],
  173. BuyCoursesPlugin::PRODUCT_TYPE_COURSE
  174. );
  175. if ($isThisCourseInSale) {
  176. // set the Price label
  177. $separator = $isThisCourseInSale['html'];
  178. // set the Buy button instead register.
  179. if ($isThisCourseInSale['verificator']) {
  180. $subscribeButton = $plugin->returnBuyCourseButton(
  181. $course['real_id'],
  182. BuyCoursesPlugin::PRODUCT_TYPE_COURSE
  183. );
  184. }
  185. }
  186. // end buycourse validation
  187. // display course title and button bloc
  188. $html .= '<div class="description">';
  189. $html .= return_title($course);
  190. // display button line
  191. $html .= '<div class="toolbar">';
  192. $html .= '<div class="left">';
  193. $html .= $separator;
  194. $html .= '</div>';
  195. $html .= '<div class="right">';
  196. $html .= '<div class="btn-group">';
  197. // if user registered as student
  198. if ($user_registerd_in_course_as_student) {
  199. $html .= return_already_registered_label('student');
  200. if (!$course_closed) {
  201. if ($course_unsubscribe_allowed) {
  202. $html .= return_unregister_button($course, $stok, $search_term, $code);
  203. }
  204. }
  205. } elseif ($user_registerd_in_course_as_teacher) {
  206. // if user registered as teacher
  207. if ($course_unsubscribe_allowed) {
  208. $html .= return_unregister_button($course, $stok, $search_term, $code);
  209. }
  210. $html .= return_already_registered_label('teacher');
  211. } else {
  212. // if user not registered in the course
  213. if (!$course_closed) {
  214. if (!$course_private) {
  215. if ($course_subscribe_allowed) {
  216. $html .= $subscribeButton;
  217. }
  218. }
  219. }
  220. }
  221. $html .= '</div>';
  222. $html .= '</div>';
  223. $html .= '</div>';
  224. $html .= '</div>';
  225. $html .= '</div>';
  226. $html .= '</div>';
  227. echo $html;
  228. }
  229. } else {
  230. if (!isset($_REQUEST['subscribe_user_with_password']) &&
  231. !isset($_REQUEST['subscribe_course'])
  232. ) {
  233. Display::display_warning_message(get_lang('ThereAreNoCoursesInThisCategory'));
  234. }
  235. }
  236. }
  237. ?>
  238. </div>
  239. </div>
  240. <?php
  241. echo $cataloguePagination;
  242. /**
  243. * Display the course catalog image of a course
  244. * @param array $course
  245. *
  246. * @return string HTML string
  247. */
  248. function returnThumbnail($course)
  249. {
  250. $html = '';
  251. $title = cut($course['title'], 70);
  252. // course path
  253. $course_path = api_get_path(SYS_COURSE_PATH).$course['directory'];
  254. if (file_exists($course_path.'/course-pic.png')) {
  255. $course_medium_image = api_get_path(WEB_COURSE_PATH).$course['directory'].'/course-pic.png'; // redimensioned image 85x85
  256. } else {
  257. // without picture
  258. $course_medium_image = Display::return_icon('session_default.png', null, null, null, null, true);
  259. }
  260. $html .= '<div class="image">';
  261. $html .= '<img class="img-responsive" src="'.$course_medium_image.'" alt="'.api_htmlentities($title).'"/>';
  262. $categoryTitle = isset($course['category_title']) ? $course['category_title'] : '';
  263. if (!empty($categoryTitle)) {
  264. $html .= '<span class="category">'. $categoryTitle.'</span>';
  265. $html .= '<div class="cribbon"></div>';
  266. }
  267. $courseInfo = api_get_course_info($course['code']);
  268. $teachers = CourseManager::getTeachersFromCourse($courseInfo['real_id']);
  269. $html .= '<div class="black-shadow">';
  270. $html .= '<div class="author-card">';
  271. $count = 0;
  272. foreach ($teachers as $value) {
  273. if ($count > 2) {
  274. break;
  275. }
  276. $name = $value['firstname'].' ' . $value['lastname'];
  277. $html .= '<a href="'.$value['url'].'" class="ajax" data-title="'.$name.'">
  278. <img src="'.$value['avatar'].'"/></a>';
  279. $html .= '<div class="teachers-details"><h5>
  280. <a href="'.$value['url'].'" class="ajax" data-title="'.$name.'">'
  281. . $name . '</a></h5></div>';
  282. $count ++;
  283. }
  284. $html .= '</div></div>';
  285. $html .= '<div class="user-actions">';
  286. $html .= return_description_button($course);
  287. $html .= '</div></div>';
  288. return $html;
  289. }
  290. /**
  291. * Display the title of a course in course catalog
  292. * @param $course
  293. * @return string HTML string
  294. */
  295. function return_title($course)
  296. {
  297. $html = '';
  298. $linkCourse = api_get_course_url($course['code']);
  299. $title = cut($course['title'], 70);
  300. $ajax_url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=add_course_vote';
  301. $rating = Display::return_rating_system('star_'.$course['real_id'], $ajax_url.'&course_id='.$course['real_id'], $course['point_info']);
  302. $html .= '<h4 class="title"><a href="' . $linkCourse . '">' . cut($title, 60) . '</a></h4>';
  303. $html .= '<div class="ranking">'. $rating . '</div>';
  304. return $html;
  305. }
  306. /**
  307. * Display the description button of a course in the course catalog
  308. * @param $course
  309. * @return string HTML string
  310. */
  311. function return_description_button($course)
  312. {
  313. $title = $course['title'];
  314. $html = '';
  315. if (api_get_setting('show_courses_descriptions_in_catalog') == 'true') {
  316. $html = '<a data-title="' . $title . '" class="ajax btn btn-default btn-sm" href="'.api_get_path(WEB_CODE_PATH).'inc/ajax/course_home.ajax.php?a=show_course_information&code='.$course['code'].'" title="' . get_lang('Description') . '">' .
  317. Display::returnFontAwesomeIcon('info-circle') . '</a>';
  318. }
  319. return $html;
  320. }
  321. /**
  322. * Display the goto course button of a course in the course catalog
  323. * @param $course
  324. * @return string HTML string
  325. */
  326. function return_goto_button($course)
  327. {
  328. $html = ' <a class="btn btn-default btn-sm" title="' . get_lang('GoToCourse') . '" href="'.api_get_course_url($course['code']).'">'.
  329. Display::returnFontAwesomeIcon('share').'</a>';
  330. return $html;
  331. }
  332. /**
  333. * Display the already registerd text in a course in the course catalog
  334. * @param $in_status
  335. *
  336. * @return string HTML string
  337. */
  338. function return_already_registered_label($in_status)
  339. {
  340. $icon = '<em class="fa fa-suitcase"></em>';
  341. $title = get_lang("YouAreATeacherOfThisCourse");
  342. if ($in_status == 'student') {
  343. $icon = '<em class="fa fa-graduation-cap"></em>';
  344. $title = get_lang("AlreadyRegisteredToCourse");
  345. }
  346. $html = Display::tag(
  347. 'button',
  348. $icon,
  349. array('id' => 'register', 'class' => 'btn btn-default btn-sm', 'title' => $title)
  350. );
  351. return $html;
  352. }
  353. /**
  354. * Display the register button of a course in the course catalog
  355. * @param $course
  356. * @param $stok
  357. * @param $code
  358. * @param $search_term
  359. *
  360. * @return string
  361. */
  362. function return_register_button($course, $stok, $code, $search_term)
  363. {
  364. $html = ' <a class="btn btn-success btn-sm" title="' . get_lang('Subscribe') . '" href="'.api_get_self().'?action=subscribe_course&sec_token='.$stok.'&subscribe_course='.$course['code'].'&search_term='.$search_term.'&category_code='.$code.'">' .
  365. Display::returnFontAwesomeIcon('sign-in') . '</a>';
  366. return $html;
  367. }
  368. /**
  369. * Display the unregister button of a course in the course catalog
  370. * @param $course
  371. * @param $stok
  372. * @param $search_term
  373. * @param $code
  374. *
  375. * @return string
  376. */
  377. function return_unregister_button($course, $stok, $search_term, $code)
  378. {
  379. $html = ' <a class="btn btn-danger btn-sm" title="' . get_lang('Unsubscribe') . '" href="'. api_get_self().'?action=unsubscribe&sec_token='.$stok.'&unsubscribe='.$course['code'].'&search_term='.$search_term.'&category_code='.$code.'">' .
  380. Display::returnFontAwesomeIcon('sign-out') . '</a>';
  381. return $html;
  382. }