parent
401672da81
commit
ba458fedd4
@ -1,22 +0,0 @@ |
||||
<?php |
||||
/* For licensing terms, see /license.txt */ |
||||
/** |
||||
* Layout (principal view) used for structuring course/session catalog. |
||||
* |
||||
* @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com> |
||||
* |
||||
* @package chamilo.auth |
||||
*/ |
||||
if (api_get_setting('course_catalog_published') !== 'true') { |
||||
// Access rights: anonymous users can't do anything usefull here. |
||||
api_block_anonymous_users(); |
||||
} |
||||
|
||||
// Header |
||||
Display::display_header(''); |
||||
|
||||
// Display |
||||
echo $content; |
||||
|
||||
// Footer |
||||
Display::display_footer(); |
@ -1,523 +0,0 @@ |
||||
<?php |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
/** |
||||
* View (MVC patter) for courses categories. |
||||
* |
||||
* @author Christian Fasanando <christian1827@gmail.com> - Beeznest |
||||
*/ |
||||
if (isset($_REQUEST['action']) && Security::remove_XSS($_REQUEST['action']) !== 'subscribe') { |
||||
$stok = Security::get_token(); |
||||
} else { |
||||
$stok = Security::getTokenFromSession(); |
||||
} |
||||
|
||||
$action = !empty($_REQUEST['action']) ? Security::remove_XSS($_REQUEST['action']) : 'display_courses'; |
||||
global $actions; |
||||
$action = in_array($action, $actions) ? $action : 'display_courses'; |
||||
|
||||
$showCourses = CoursesAndSessionsCatalog::showCourses(); |
||||
$showSessions = CoursesAndSessionsCatalog::showSessions(); |
||||
$pageCurrent = isset($_GET['pageCurrent']) ? (int) $_GET['pageCurrent'] : 1; |
||||
$pageLength = isset($_GET['pageLength']) ? (int) $_GET['pageLength'] : CoursesAndSessionsCatalog::PAGE_LENGTH; |
||||
$pageTotal = (int) ceil((int) $countCoursesInCategory / $pageLength); |
||||
$cataloguePagination = $pageTotal > 1 ? CourseCategory::getCatalogPagination($pageCurrent, $pageLength, $pageTotal) : ''; |
||||
$searchTerm = isset($_REQUEST['search_term']) ? Security::remove_XSS($_REQUEST['search_term']) : ''; |
||||
$codeType = isset($_REQUEST['category_code']) ? Security::remove_XSS($_REQUEST['category_code']) : ''; |
||||
|
||||
$date = date('Y-m-d'); |
||||
if ($showSessions && isset($_POST['date'])) { |
||||
$date = $_POST['date']; |
||||
} |
||||
$userInfo = api_get_user_info(); |
||||
$code = isset($code) ? $code : null; |
||||
|
||||
?> |
||||
<script> |
||||
$(function() { |
||||
$('.star-rating li a').on('click', function(event) { |
||||
var id = $(this).parents('ul').attr('id'); |
||||
$('#vote_label2_' + id).html("<?php echo get_lang('Loading'); ?>");
|
||||
$.ajax({ |
||||
url: $(this).attr('data-link'), |
||||
success: function(data) { |
||||
$("#rating_wrapper_"+id).html(data); |
||||
|
||||
} |
||||
}); |
||||
}); |
||||
var getSessionId = function (el) { |
||||
var parts = el.id.split('_'); |
||||
return parseInt(parts[1], 10); |
||||
}; |
||||
|
||||
<?php if ($showSessions) { |
||||
?> |
||||
$('#date').datepicker({ |
||||
dateFormat: 'yy-mm-dd' |
||||
}); |
||||
<?php |
||||
} ?> |
||||
}); |
||||
</script> |
||||
<?php |
||||
|
||||
echo CoursesController::getTabList(1); |
||||
|
||||
echo '<div class="row"> |
||||
<div class="col-md-12"> |
||||
<div class="search-courses"> |
||||
<div class="row">'; |
||||
|
||||
if ($showCourses) { |
||||
echo '<div class="col-md-'.($showSessions ? '4' : '6').'">'; |
||||
if (!isset($_GET['hidden_links']) || intval($_GET['hidden_links']) != 1) { |
||||
?> |
||||
<form method="post" |
||||
action="<?php echo CourseCategory::getCourseCategoryUrl(1, $pageLength, 'ALL', 0, 'subscribe'); ?>">
|
||||
<input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
|
||||
<input type="hidden" name="search_course" value="1"/> |
||||
<label><?php echo get_lang('Search'); ?></label>
|
||||
<div class="input-group"> |
||||
<input class="form-control" type="text" name="search_term" |
||||
value="<?php echo empty($_POST['search_term']) ? '' : api_htmlentities($searchTerm); ?>"/>
|
||||
<div class="input-group-btn"> |
||||
<button class="btn btn-default" type="submit"> |
||||
<em class="fa fa-search"></em> <?php echo get_lang('Search'); ?> |
||||
</button> |
||||
</div> |
||||
</div> |
||||
</form> |
||||
<?php |
||||
} |
||||
echo '</div>'; |
||||
echo '<div class="col-md-'.($showSessions ? '4' : '6').'">'; |
||||
$listCategories = CoursesAndSessionsCatalog::getCourseCategoriesTree(); |
||||
$categoriesSelect = getOptionSelect($listCategories, $codeType); |
||||
|
||||
$webAction = api_get_path(WEB_CODE_PATH).'auth/courses.php'; |
||||
$form = '<form action="'.$webAction.'" method="GET">'; |
||||
$form .= '<input type="hidden" name="action" value="'.$action.'">'; |
||||
$form .= '<input type="hidden" name="pageCurrent" value="'.$pageCurrent.'">'; |
||||
$form .= '<input type="hidden" name="pageLength" value="'.$pageLength.'">'; |
||||
$form .= '<div class="form-group">'; |
||||
$form .= '<label>'.get_lang('CourseCategories').'</label>'; |
||||
$form .= $categoriesSelect; |
||||
$form .= '</div>'; |
||||
$form .= '</form>'; |
||||
echo $form; |
||||
echo '</div>'; |
||||
} |
||||
|
||||
echo '</div></div></div></div>'; |
||||
|
||||
if ($showCourses && $action != 'display_sessions') { |
||||
if (!empty($message)) { |
||||
echo Display::return_message($message, 'confirmation', false); |
||||
} |
||||
if (!empty($error)) { |
||||
echo Display::return_message($error, 'error', false); |
||||
} |
||||
|
||||
if (!empty($content)) { |
||||
echo $content; |
||||
} |
||||
|
||||
if (!empty($searchTerm)) { |
||||
echo "<p><strong>".get_lang('SearchResultsFor')." ".$searchTerm."</strong><br />"; |
||||
} |
||||
|
||||
$showTeacher = api_get_setting('display_teacher_in_courselist') === 'true'; |
||||
$ajax_url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=add_course_vote'; |
||||
$user_id = api_get_user_id(); |
||||
$categoryListFromDatabase = CourseCategory::getAllCategories(); |
||||
|
||||
$categoryList = []; |
||||
if (!empty($categoryListFromDatabase)) { |
||||
foreach ($categoryListFromDatabase as $categoryItem) { |
||||
$categoryList[$categoryItem['code']] = $categoryItem['name']; |
||||
} |
||||
} |
||||
|
||||
if (!empty($browse_courses_in_category)) { |
||||
echo '<div class="grid-courses row">'; |
||||
foreach ($browse_courses_in_category as $course) { |
||||
$course_hidden = $course['visibility'] == COURSE_VISIBILITY_HIDDEN; |
||||
|
||||
if ($course_hidden) { |
||||
continue; |
||||
} |
||||
|
||||
$userRegisteredInCourse = CourseManager::is_user_subscribed_in_course($user_id, $course['code']); |
||||
$userRegisteredInCourseAsTeacher = CourseManager::is_course_teacher($user_id, $course['code']); |
||||
$userRegistered = $userRegisteredInCourse && $userRegisteredInCourseAsTeacher; |
||||
|
||||
$course_public = $course['visibility'] == COURSE_VISIBILITY_OPEN_WORLD; |
||||
$course_open = $course['visibility'] == COURSE_VISIBILITY_OPEN_PLATFORM; |
||||
$course_private = $course['visibility'] == COURSE_VISIBILITY_REGISTERED; |
||||
$course_closed = $course['visibility'] == COURSE_VISIBILITY_CLOSED; |
||||
|
||||
$course_subscribe_allowed = $course['subscribe'] == 1; |
||||
$course_unsubscribe_allowed = $course['unsubscribe'] == 1; |
||||
$count_connections = $course['count_connections']; |
||||
$creation_date = substr($course['creation_date'], 0, 10); |
||||
|
||||
// display the course bloc |
||||
$html = '<div class="col-xs-12 col-sm-6 col-md-4"><div class="items items-courses">'; |
||||
|
||||
$course['category_title'] = ''; |
||||
if (isset($course['category'])) { |
||||
$course['category_title'] = isset($categoryList[$course['category']]) ? $categoryList[$course['category']] : ''; |
||||
} |
||||
|
||||
// Display thumbnail |
||||
$html .= returnThumbnail($course, $userRegistered); |
||||
|
||||
$separator = null; |
||||
$subscribeButton = return_register_button($course, $stok, $code, $searchTerm); |
||||
// Start buy course validation |
||||
// display the course price and buy button if the buycourses plugin is enabled and this course is configured |
||||
$plugin = BuyCoursesPlugin::create(); |
||||
$isThisCourseInSale = $plugin->buyCoursesForGridCatalogValidator( |
||||
$course['real_id'], |
||||
BuyCoursesPlugin::PRODUCT_TYPE_COURSE |
||||
); |
||||
|
||||
if ($isThisCourseInSale) { |
||||
// set the Price label |
||||
$separator = $isThisCourseInSale['html']; |
||||
// set the Buy button instead register. |
||||
if ($isThisCourseInSale['verificator']) { |
||||
$subscribeButton = $plugin->returnBuyCourseButton( |
||||
$course['real_id'], |
||||
BuyCoursesPlugin::PRODUCT_TYPE_COURSE |
||||
); |
||||
} |
||||
} |
||||
// end buy course validation |
||||
|
||||
// display course title and button bloc |
||||
$html .= '<div class="description">'; |
||||
$html .= return_title($course, $userRegisteredInCourse); |
||||
|
||||
if ($showTeacher) { |
||||
$html .= return_teacher($course); |
||||
} |
||||
|
||||
// display button line |
||||
$html .= '<div class="toolbar row">'; |
||||
$html .= $separator ? '<div class="col-sm-4">'.$separator.'</div>' : ''; |
||||
$html .= '<div class="col-sm-8">'; |
||||
// if user registered as student |
||||
if ($userRegisteredInCourse) { |
||||
$html .= return_already_registered_label('student'); |
||||
if (!$course_closed) { |
||||
if ($course_unsubscribe_allowed) { |
||||
$html .= return_unregister_button($course, $stok, $searchTerm, $code); |
||||
} |
||||
} |
||||
} elseif ($userRegisteredInCourseAsTeacher) { |
||||
// if user registered as teacher |
||||
if ($course_unsubscribe_allowed) { |
||||
$html .= return_unregister_button($course, $stok, $searchTerm, $code); |
||||
} |
||||
} else { |
||||
// if user not registered in the course |
||||
if (!$course_closed) { |
||||
if (!$course_private) { |
||||
if ($course_subscribe_allowed) { |
||||
$html .= $subscribeButton; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
$html .= '</div>'; |
||||
$html .= '</div>'; |
||||
$html .= '</div>'; |
||||
$html .= '</div>'; |
||||
$html .= '</div>'; |
||||
echo $html; |
||||
} |
||||
echo '</div>'; |
||||
} else { |
||||
if (!isset($_REQUEST['subscribe_user_with_password']) && |
||||
!isset($_REQUEST['subscribe_course']) |
||||
) { |
||||
echo Display::return_message( |
||||
get_lang('ThereAreNoCoursesInThisCategory'), |
||||
'warning' |
||||
); |
||||
} |
||||
} |
||||
} |
||||
|
||||
echo '<div class="col-md-12">'; |
||||
echo $cataloguePagination; |
||||
echo '</div>'; |
||||
|
||||
function getOptionSelect($categories, $codeType) |
||||
{ |
||||
$html = ''; |
||||
$html .= '<select name="category_code" onchange="submit();" class="selectpicker form-control">'; |
||||
foreach ($categories as $category) { |
||||
$categoryCode = Security::remove_XSS($category['code']); |
||||
$categoryName = Security::remove_XSS($category['name']); |
||||
$countCourse = (int) $category['number_courses']; |
||||
$level = $category['level']; |
||||
if (empty($countCourse)) { |
||||
continue; |
||||
} |
||||
if ($level > 0) { |
||||
$separate = str_repeat('--', $level); |
||||
} else { |
||||
$separate = ''; |
||||
} |
||||
$html .= '<option '.($categoryCode == $codeType ? 'selected="selected" ' : '') |
||||
.' value="'.$categoryCode.'">'.$separate.' '.$categoryName.' ('.$countCourse.') </option>'; |
||||
} |
||||
$html .= '</select>'; |
||||
|
||||
return $html; |
||||
} |
||||
/** |
||||
* Display the course catalog image of a course. |
||||
* |
||||
* @param array $course |
||||
* @param bool $registeredUser |
||||
* |
||||
* @return string HTML string |
||||
*/ |
||||
function returnThumbnail($course, $registeredUser) |
||||
{ |
||||
$html = ''; |
||||
$title = cut($course['title'], 70); |
||||
//$linkCourse = api_get_course_url($course['code']); |
||||
$linkCourse = api_get_path(WEB_PATH).'course/'.$course['real_id'].'/about'; |
||||
// course path |
||||
$course_path = api_get_path(SYS_COURSE_PATH).$course['directory']; |
||||
|
||||
if (file_exists($course_path.'/course-pic.png')) { |
||||
// redimensioned image 85x85 |
||||
$courseMediumImage = api_get_path(WEB_COURSE_PATH).$course['directory'].'/course-pic.png'; |
||||
} else { |
||||
// without picture |
||||
$courseMediumImage = Display::return_icon( |
||||
'session_default.png', |
||||
null, |
||||
null, |
||||
null, |
||||
null, |
||||
true |
||||
); |
||||
} |
||||
|
||||
$html .= '<div class="image">'; |
||||
$html .= '<a href="'.$linkCourse.'" title="'.$course['title'].'">' |
||||
.'<img class="img-responsive" src="'.$courseMediumImage.'" ' |
||||
.'alt="'.api_htmlentities($title).'"/></a>'; |
||||
|
||||
$categoryTitle = isset($course['category_title']) ? $course['category_title'] : ''; |
||||
if (!empty($categoryTitle)) { |
||||
$html .= '<span class="category">'.$categoryTitle.'</span>'; |
||||
$html .= '<div class="cribbon"></div>'; |
||||
} |
||||
|
||||
$html .= '<div class="user-actions">'; |
||||
$html .= CourseManager::returnDescriptionButton($course); |
||||
$html .= '</div></div>'; |
||||
|
||||
return $html; |
||||
} |
||||
|
||||
/** |
||||
* @param array $courseInfo |
||||
* |
||||
* @return string |
||||
*/ |
||||
function return_teacher($courseInfo) |
||||
{ |
||||
$teachers = CourseManager::getTeachersFromCourse($courseInfo['real_id']); |
||||
$length = count($teachers); |
||||
|
||||
if (!$length) { |
||||
return ''; |
||||
} |
||||
|
||||
$html = '<div class="block-author">'; |
||||
if ($length > 6) { |
||||
$html .= '<a |
||||
id="plist" |
||||
data-trigger="focus" |
||||
tabindex="0" role="button" |
||||
class="btn btn-default panel_popover" |
||||
data-toggle="popover" |
||||
title="'.addslashes(get_lang('CourseTeachers')).'" |
||||
data-html="true" |
||||
> |
||||
<i class="fa fa-graduation-cap" aria-hidden="true"></i> |
||||
</a>'; |
||||
$html .= '<div id="popover-content-plist" class="hide">'; |
||||
foreach ($teachers as $value) { |
||||
$name = $value['firstname'].' '.$value['lastname']; |
||||
$html .= '<div class="popover-teacher">'; |
||||
$html .= '<a href="'.$value['url'].'" class="ajax" data-title="'.$name.'" title="'.$name.'"> |
||||
<img src="'.$value['avatar'].'" title="'.$name.'" alt="'.get_lang('UserPicture').'"/></a>'; |
||||
$html .= '<div class="teachers-details"><h5> |
||||
<a href="'.$value['url'].'" class="ajax" data-title="'.$name.'" title="'.$name.'">' |
||||
.$name.'</a></h5></div>'; |
||||
$html .= '</div>'; |
||||
} |
||||
$html .= '</div>'; |
||||
} else { |
||||
foreach ($teachers as $value) { |
||||
$name = $value['firstname'].' '.$value['lastname']; |
||||
if ($length > 2) { |
||||
$html .= '<a href="'.$value['url'].'" class="ajax" data-title="'.$name.'" title="'.$name.'"> |
||||
<img src="'.$value['avatar'].'" title="'.$name.'" alt="'.get_lang('UserPicture').'"/></a>'; |
||||
} else { |
||||
$html .= '<a href="'.$value['url'].'" class="ajax" data-title="'.$name.'" title="'.$name.'"> |
||||
<img src="'.$value['avatar'].'" title="'.$name.'" alt="'.get_lang('UserPicture').'"/></a>'; |
||||
$html .= '<div class="teachers-details"><h5> |
||||
<a href="'.$value['url'].'" class="ajax" data-title="'.$name.'">' |
||||
.$name.'</a></h5><p>'.get_lang('Teacher').'</p></div>'; |
||||
} |
||||
} |
||||
} |
||||
$html .= '</div>'; |
||||
|
||||
return $html; |
||||
} |
||||
|
||||
/** |
||||
* Display the title of a course in course catalog. |
||||
* |
||||
* @param array $course |
||||
* @param bool $registeredUser |
||||
* |
||||
* @return string HTML string |
||||
*/ |
||||
function return_title($course, $registeredUser) |
||||
{ |
||||
//$linkCourse = api_get_course_url($course['code']); |
||||
$linkCourse = api_get_path(WEB_PATH).'course/'.$course['real_id'].'/about'; |
||||
$html = '<div class="block-title"><h4 class="title">'; |
||||
$html .= '<a title="'.$course['title'].'" href="'.$linkCourse.'">'.$course['title'].'</a>'; |
||||
$html .= '</h4></div>'; |
||||
|
||||
if (api_get_configuration_value('hide_course_rating') === false) { |
||||
$ajax_url = api_get_path(WEB_AJAX_PATH).'course.ajax.php?a=add_course_vote'; |
||||
$rating = Display::return_rating_system( |
||||
'star_'.$course['real_id'], |
||||
$ajax_url.'&course_id='.$course['real_id'], |
||||
$course['point_info'] |
||||
); |
||||
$html .= '<div class="ranking">'.$rating.'</div>'; |
||||
} |
||||
|
||||
return $html; |
||||
} |
||||
|
||||
/** |
||||
* Display the goto course button of a course in the course catalog. |
||||
* |
||||
* @param $course |
||||
* |
||||
* @return string HTML string |
||||
*/ |
||||
function return_goto_button($course) |
||||
{ |
||||
$title = get_lang('GoToCourse'); |
||||
$html = Display::url( |
||||
Display::returnFontAwesomeIcon('share'), |
||||
api_get_course_url($course['code']), |
||||
[ |
||||
'class' => 'btn btn-default btn-sm', |
||||
'title' => $title, |
||||
'aria-label' => $title, |
||||
] |
||||
); |
||||
|
||||
return $html.PHP_EOL; |
||||
} |
||||
|
||||
/** |
||||
* Display the already registerd text in a course in the course catalog. |
||||
* |
||||
* @param $in_status |
||||
* |
||||
* @return string HTML string |
||||
*/ |
||||
function return_already_registered_label($in_status) |
||||
{ |
||||
$icon = '<em class="fa fa-check"></em>'; |
||||
$title = get_lang("YouAreATeacherOfThisCourse"); |
||||
if ($in_status == 'student') { |
||||
$icon = '<em class="fa fa-check"></em>'; |
||||
$title = get_lang("AlreadySubscribed"); |
||||
} |
||||
|
||||
$html = Display::tag( |
||||
'span', |
||||
$icon.' '.$title, |
||||
[ |
||||
'id' => 'register', |
||||
'class' => 'label-subscribed text-success', |
||||
'title' => $title, |
||||
'aria-label' => $title, |
||||
] |
||||
); |
||||
|
||||
return $html.PHP_EOL; |
||||
} |
||||
|
||||
/** |
||||
* Display the register button of a course in the course catalog. |
||||
* |
||||
* @param $course |
||||
* @param $stok |
||||
* @param $code |
||||
* @param $search_term |
||||
* |
||||
* @return string |
||||
*/ |
||||
function return_register_button($course, $stok, $code, $search_term) |
||||
{ |
||||
$title = get_lang('Subscribe'); |
||||
$action = 'subscribe_course'; |
||||
if (!empty($course['registration_code'])) { |
||||
$action = 'subscribe_course_validation'; |
||||
} |
||||
|
||||
$html = Display::url( |
||||
Display::returnFontAwesomeIcon('check').' '.$title, |
||||
api_get_self().'?action='.$action.'&sec_token='.$stok. |
||||
'&subscribe_course='.$course['code'].'&search_term='.$search_term.'&category_code='.$code, |
||||
['class' => 'btn btn-success btn-sm', 'title' => $title, 'aria-label' => $title] |
||||
); |
||||
|
||||
return $html; |
||||
} |
||||
|
||||
/** |
||||
* Display the unregister button of a course in the course catalog. |
||||
* |
||||
* @param $course |
||||
* @param $stok |
||||
* @param $search_term |
||||
* @param $code |
||||
* |
||||
* @return string |
||||
*/ |
||||
function return_unregister_button($course, $stok, $search_term, $code) |
||||
{ |
||||
$title = get_lang('Unsubscription'); |
||||
$html = Display::url( |
||||
Display::returnFontAwesomeIcon('sign-in').' '.$title, |
||||
api_get_self().'?action=unsubscribe&sec_token='.$stok |
||||
.'&unsubscribe='.$course['code'].'&search_term='.$search_term.'&category_code='.$code, |
||||
['class' => 'btn btn-danger btn-sm', 'title' => $title, 'aria-label' => $title] |
||||
); |
||||
|
||||
return $html; |
||||
} |
@ -1,684 +0,0 @@ |
||||
<?php |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
use Chamilo\CoreBundle\Entity\Repository\SequenceResourceRepository; |
||||
use Chamilo\CoreBundle\Entity\SequenceResource; |
||||
use Chamilo\CoreBundle\Entity\SessionRelCourse; |
||||
use Chamilo\CoreBundle\Entity\Tag; |
||||
|
||||
/** |
||||
* Class CoursesController. |
||||
* |
||||
* This file contains class used like controller, |
||||
* it should be included inside a dispatcher file (e.g: index.php) |
||||
* |
||||
* @author Christian Fasanando <christian1827@gmail.com> - BeezNest |
||||
* |
||||
* @package chamilo.auth |
||||
*/ |
||||
class CoursesController |
||||
{ |
||||
private $toolname; |
||||
private $view; |
||||
private $model; |
||||
|
||||
/** |
||||
* Constructor. |
||||
*/ |
||||
public function __construct() |
||||
{ |
||||
$this->toolname = 'auth'; |
||||
//$actived_theme_path = api_get_template(); |
||||
$this->view = new View($this->toolname); |
||||
$this->model = new Auth(); |
||||
} |
||||
|
||||
/** |
||||
* It's used for listing courses with categories, |
||||
* render to courses_categories view. |
||||
* |
||||
* @param string $action |
||||
* @param string $category_code |
||||
* @param string $message |
||||
* @param string $error |
||||
* @param string $content |
||||
* @param array $limit will be used if $random_value is not set. |
||||
* This array should contains 'start' and 'length' keys |
||||
* |
||||
* @internal param \action $string |
||||
* @internal param \Category $string code (optional) |
||||
*/ |
||||
public function courses_categories( |
||||
$action, |
||||
$category_code = null, |
||||
$message = '', |
||||
$error = '', |
||||
$content = null, |
||||
$limit = [] |
||||
) { |
||||
$data = []; |
||||
$listCategories = CoursesAndSessionsCatalog::getCourseCategoriesTree(); |
||||
|
||||
$data['countCoursesInCategory'] = CourseCategory::countCoursesInCategory($category_code); |
||||
if ($action === 'display_random_courses') { |
||||
// Random value is used instead limit filter |
||||
$data['browse_courses_in_category'] = CoursesAndSessionsCatalog::getCoursesInCategory(null, 12); |
||||
$data['countCoursesInCategory'] = count($data['browse_courses_in_category']); |
||||
} else { |
||||
if (!isset($category_code)) { |
||||
$category_code = $listCategories['ALL']['code']; // by default first category |
||||
} |
||||
$limit = isset($limit) ? $limit : self::getLimitArray(); |
||||
$listCourses = CoursesAndSessionsCatalog::getCoursesInCategory($category_code, null, $limit); |
||||
|
||||
$data['browse_courses_in_category'] = $listCourses; |
||||
} |
||||
|
||||
$data['list_categories'] = $listCategories; |
||||
$data['code'] = Security::remove_XSS($category_code); |
||||
|
||||
// getting all the courses to which the user is subscribed to |
||||
$curr_user_id = api_get_user_id(); |
||||
$user_courses = $this->model->get_courses_of_user($curr_user_id); |
||||
$user_coursecodes = []; |
||||
|
||||
// we need only the course codes as these will be used to match against the courses of the category |
||||
if ($user_courses != '') { |
||||
foreach ($user_courses as $key => $value) { |
||||
$user_coursecodes[] = $value['code']; |
||||
} |
||||
} |
||||
|
||||
if (api_is_drh()) { |
||||
$courses = CourseManager::get_courses_followed_by_drh(api_get_user_id()); |
||||
foreach ($courses as $course) { |
||||
$user_coursecodes[] = $course['code']; |
||||
} |
||||
} |
||||
|
||||
$data['user_coursecodes'] = $user_coursecodes; |
||||
$data['action'] = $action; |
||||
$data['message'] = $message; |
||||
$data['content'] = $content; |
||||
$data['error'] = $error; |
||||
$data['catalogShowCoursesSessions'] = 0; |
||||
$showCoursesSessions = (int) api_get_setting('catalog_show_courses_sessions'); |
||||
if ($showCoursesSessions > 0) { |
||||
$data['catalogShowCoursesSessions'] = $showCoursesSessions; |
||||
} |
||||
|
||||
// render to the view |
||||
$this->view->set_data($data); |
||||
$this->view->set_layout('layout'); |
||||
$this->view->set_template('courses_categories'); |
||||
$this->view->render(); |
||||
} |
||||
|
||||
/** |
||||
* @param string $search_term |
||||
* @param string $message |
||||
* @param string $error |
||||
* @param string $content |
||||
* @param array $limit |
||||
* @param bool $justVisible Whether to search only in courses visibles in the catalogue |
||||
*/ |
||||
public function search_courses( |
||||
$search_term, |
||||
$message = '', |
||||
$error = '', |
||||
$content = null, |
||||
$limit = [], |
||||
$justVisible = false |
||||
) { |
||||
$data = []; |
||||
$limit = !empty($limit) ? $limit : self::getLimitArray(); |
||||
$browse_course_categories = CoursesAndSessionsCatalog::getCourseCategories(); |
||||
$data['countCoursesInCategory'] = CourseCategory::countCoursesInCategory('ALL', $search_term); |
||||
$data['browse_courses_in_category'] = CoursesAndSessionsCatalog::search_courses( |
||||
$search_term, |
||||
$limit, |
||||
$justVisible |
||||
); |
||||
$data['browse_course_categories'] = $browse_course_categories; |
||||
$data['search_term'] = Security::remove_XSS($search_term); //filter before showing in template |
||||
|
||||
// getting all the courses to which the user is subscribed to |
||||
$curr_user_id = api_get_user_id(); |
||||
$user_courses = $this->model->get_courses_of_user($curr_user_id); |
||||
$user_coursecodes = []; |
||||
|
||||
// we need only the course codes as these will be used to match against the courses of the category |
||||
if ($user_courses != '') { |
||||
foreach ($user_courses as $value) { |
||||
$user_coursecodes[] = $value['code']; |
||||
} |
||||
} |
||||
|
||||
$data['user_coursecodes'] = $user_coursecodes; |
||||
$data['message'] = $message; |
||||
$data['content'] = $content; |
||||
$data['error'] = $error; |
||||
$data['action'] = 'display_courses'; |
||||
|
||||
// render to the view |
||||
$this->view->set_data($data); |
||||
$this->view->set_layout('catalog_layout'); |
||||
$this->view->set_template('courses_categories'); |
||||
$this->view->render(); |
||||
} |
||||
|
||||
/** |
||||
* Unsubscribe user from a course |
||||
* render to listing view. |
||||
* |
||||
* @param string $course_code |
||||
* @param string $search_term |
||||
* @param string $category_code |
||||
*/ |
||||
public function unsubscribe_user_from_course( |
||||
$course_code, |
||||
$search_term = null, |
||||
$category_code = null |
||||
) { |
||||
$result = $this->model->remove_user_from_course($course_code); |
||||
$message = ''; |
||||
$error = ''; |
||||
|
||||
if ($result) { |
||||
Display::addFlash( |
||||
Display::return_message(get_lang('YouAreNowUnsubscribed')) |
||||
); |
||||
} |
||||
|
||||
if (!empty($search_term)) { |
||||
CoursesAndSessionsCatalog::search_courses($search_term, $message, $error); |
||||
} else { |
||||
$this->courses_categories( |
||||
'subcribe', |
||||
$category_code, |
||||
$message, |
||||
$error |
||||
); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Get a HTML button for subscribe to session. |
||||
* |
||||
* @param int $sessionId The session ID |
||||
* @param string $sessionName The session name |
||||
* @param bool $checkRequirements Optional. |
||||
* Whether the session has requirement. Default is false |
||||
* @param bool $includeText Optional. Whether show the text in button |
||||
* @param bool $btnBing |
||||
* |
||||
* @return string The button HTML |
||||
*/ |
||||
public function getRegisteredInSessionButton( |
||||
$sessionId, |
||||
$sessionName, |
||||
$checkRequirements = false, |
||||
$includeText = false, |
||||
$btnBing = false |
||||
) { |
||||
$sessionId = (int) $sessionId; |
||||
|
||||
if ($btnBing) { |
||||
$btnBing = 'btn-lg btn-block'; |
||||
} else { |
||||
$btnBing = 'btn-sm'; |
||||
} |
||||
|
||||
if ($checkRequirements) { |
||||
return $this->getRequirements($sessionId, SequenceResource::SESSION_TYPE, $includeText, $btnBing); |
||||
} |
||||
|
||||
$catalogSessionAutoSubscriptionAllowed = false; |
||||
if (api_get_setting('catalog_allow_session_auto_subscription') === 'true') { |
||||
$catalogSessionAutoSubscriptionAllowed = true; |
||||
} |
||||
|
||||
$url = api_get_path(WEB_CODE_PATH); |
||||
|
||||
if ($catalogSessionAutoSubscriptionAllowed) { |
||||
$url .= 'auth/courses.php?'; |
||||
$url .= http_build_query([ |
||||
'action' => 'subscribe_to_session', |
||||
'session_id' => $sessionId, |
||||
]); |
||||
|
||||
$result = Display::toolbarButton( |
||||
get_lang('Subscribe'), |
||||
$url, |
||||
'pencil', |
||||
'primary', |
||||
[ |
||||
'class' => $btnBing.' ajax', |
||||
'data-title' => get_lang('AreYouSureToSubscribe'), |
||||
'data-size' => 'md', |
||||
'title' => get_lang('Subscribe'), |
||||
], |
||||
$includeText |
||||
); |
||||
} else { |
||||
$url .= 'inc/email_editor.php?'; |
||||
$url .= http_build_query([ |
||||
'action' => 'subscribe_me_to_session', |
||||
'session' => Security::remove_XSS($sessionName), |
||||
]); |
||||
|
||||
$result = Display::toolbarButton( |
||||
get_lang('SubscribeToSessionRequest'), |
||||
$url, |
||||
'pencil', |
||||
'primary', |
||||
['class' => $btnBing], |
||||
$includeText |
||||
); |
||||
} |
||||
|
||||
$hook = HookResubscribe::create(); |
||||
if (!empty($hook)) { |
||||
$hook->setEventData([ |
||||
'session_id' => $sessionId, |
||||
]); |
||||
try { |
||||
$hook->notifyResubscribe(HOOK_EVENT_TYPE_PRE); |
||||
} catch (Exception $exception) { |
||||
$result = $exception->getMessage(); |
||||
} |
||||
} |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
public function getRequirements($id, $type, $includeText, $btnBing) |
||||
{ |
||||
$id = (int) $id; |
||||
$type = (int) $type; |
||||
|
||||
$url = api_get_path(WEB_AJAX_PATH); |
||||
$url .= 'sequence.ajax.php?'; |
||||
$url .= http_build_query( |
||||
[ |
||||
'a' => 'get_requirements', |
||||
'id' => $id, |
||||
'type' => $type, |
||||
] |
||||
); |
||||
|
||||
return Display::toolbarButton( |
||||
get_lang('CheckRequirements'), |
||||
$url, |
||||
'shield', |
||||
'info', |
||||
[ |
||||
'class' => $btnBing.' ajax', |
||||
'data-title' => get_lang('CheckRequirements'), |
||||
'data-size' => 'md', |
||||
'title' => get_lang('CheckRequirements'), |
||||
], |
||||
$includeText |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Generate a label if the user has been registered in session. |
||||
* |
||||
* @return string The label |
||||
*/ |
||||
public function getAlreadyRegisteredInSessionLabel() |
||||
{ |
||||
$icon = '<em class="fa fa-graduation-cap"></em>'; |
||||
|
||||
return Display::div( |
||||
$icon, |
||||
[ |
||||
'class' => 'btn btn-default btn-sm registered', |
||||
'title' => get_lang("AlreadyRegisteredToSession"), |
||||
] |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Get a icon for a session. |
||||
* |
||||
* @param string $sessionName The session name |
||||
* |
||||
* @return string The icon |
||||
*/ |
||||
public function getSessionIcon($sessionName) |
||||
{ |
||||
return Display::return_icon( |
||||
'window_list.png', |
||||
$sessionName, |
||||
null, |
||||
ICON_SIZE_MEDIUM |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* Return Session catalog rendered view. |
||||
* |
||||
* @param array $limit |
||||
*/ |
||||
public function sessionList($limit = []) |
||||
{ |
||||
$date = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d'); |
||||
$hiddenLinks = isset($_GET['hidden_links']) ? $_GET['hidden_links'] == 1 : false; |
||||
$limit = isset($limit) ? $limit : self::getLimitArray(); |
||||
|
||||
$countSessions = CoursesAndSessionsCatalog::browseSessions($date, [], false, true); |
||||
$sessions = CoursesAndSessionsCatalog::browseSessions($date, $limit); |
||||
|
||||
$pageTotal = ceil($countSessions / $limit['length']); |
||||
// Do NOT show pagination if only one page or less |
||||
$pagination = $pageTotal > 1 ? CourseCategory::getCatalogPagination($limit['current'], $limit['length'], $pageTotal) : ''; |
||||
$sessionsBlocks = $this->getFormattedSessionsBlock($sessions); |
||||
|
||||
// Get session search catalogue URL |
||||
$courseUrl = CourseCategory::getCourseCategoryUrl( |
||||
1, |
||||
$limit['length'], |
||||
null, |
||||
0, |
||||
'subscribe' |
||||
); |
||||
|
||||
$tpl = new Template(); |
||||
$tpl->assign('actions', self::getTabList(2)); |
||||
$tpl->assign('show_courses', CoursesAndSessionsCatalog::showCourses()); |
||||
$tpl->assign('show_sessions', CoursesAndSessionsCatalog::showSessions()); |
||||
$tpl->assign('show_tutor', api_get_setting('show_session_coach') === 'true'); |
||||
$tpl->assign('course_url', $courseUrl); |
||||
$tpl->assign('catalog_pagination', $pagination); |
||||
$tpl->assign('hidden_links', $hiddenLinks); |
||||
$tpl->assign('search_token', Security::get_token()); |
||||
$tpl->assign('search_date', $date); |
||||
$tpl->assign('web_session_courses_ajax_url', api_get_path(WEB_AJAX_PATH).'course.ajax.php'); |
||||
$tpl->assign('sessions', $sessionsBlocks); |
||||
$tpl->assign('already_subscribed_label', $this->getAlreadyRegisteredInSessionLabel()); |
||||
$tpl->assign('catalog_settings', self::getCatalogSearchSettings()); |
||||
|
||||
$contentTemplate = $tpl->get_template('auth/session_catalog.tpl'); |
||||
|
||||
$tpl->display($contentTemplate); |
||||
} |
||||
|
||||
/** |
||||
* Show the Session Catalogue with filtered session by course tags. |
||||
* |
||||
* @param array $limit Limit info |
||||
*/ |
||||
public function sessionsListByName(array $limit) |
||||
{ |
||||
$keyword = isset($_POST['keyword']) ? $_POST['keyword'] : null; |
||||
$hiddenLinks = isset($_GET['hidden_links']) ? (int) $_GET['hidden_links'] == 1 : false; |
||||
$courseUrl = CourseCategory::getCourseCategoryUrl( |
||||
1, |
||||
$limit['length'], |
||||
null, |
||||
0, |
||||
'subscribe' |
||||
); |
||||
|
||||
$sessions = CoursesAndSessionsCatalog::getSessionsByName($keyword, $limit); |
||||
$sessionsBlocks = $this->getFormattedSessionsBlock($sessions); |
||||
|
||||
$tpl = new Template(); |
||||
$tpl->assign('actions', self::getTabList(2)); |
||||
$tpl->assign('show_courses', CoursesAndSessionsCatalog::showCourses()); |
||||
$tpl->assign('show_sessions', CoursesAndSessionsCatalog::showSessions()); |
||||
$tpl->assign('show_tutor', api_get_setting('show_session_coach') === 'true' ? true : false); |
||||
$tpl->assign('course_url', $courseUrl); |
||||
$tpl->assign('already_subscribed_label', $this->getAlreadyRegisteredInSessionLabel()); |
||||
$tpl->assign('hidden_links', $hiddenLinks); |
||||
$tpl->assign('search_token', Security::get_token()); |
||||
$tpl->assign('keyword', Security::remove_XSS($keyword)); |
||||
$tpl->assign('sessions', $sessionsBlocks); |
||||
$tpl->assign('catalog_settings', self::getCatalogSearchSettings()); |
||||
|
||||
$contentTemplate = $tpl->get_template('auth/session_catalog.tpl'); |
||||
|
||||
$tpl->display($contentTemplate); |
||||
} |
||||
|
||||
public static function getCatalogSearchSettings() |
||||
{ |
||||
$settings = api_get_configuration_value('catalog_settings'); |
||||
if (empty($settings)) { |
||||
// Default everything is visible |
||||
$settings = [ |
||||
'sessions' => [ |
||||
'by_title' => true, |
||||
'by_date' => true, |
||||
'by_tag' => true, |
||||
'show_session_info' => true, |
||||
'show_session_date' => true, |
||||
], |
||||
]; |
||||
} |
||||
|
||||
return $settings; |
||||
} |
||||
|
||||
/** |
||||
* @param int $active |
||||
* |
||||
* @return string |
||||
*/ |
||||
public static function getTabList($active = 1) |
||||
{ |
||||
$pageLength = isset($_GET['pageLength']) ? (int) $_GET['pageLength'] : CoursesAndSessionsCatalog::PAGE_LENGTH; |
||||
|
||||
$url = CourseCategory::getCourseCategoryUrl(1, $pageLength, null, 0, 'display_sessions'); |
||||
$headers = []; |
||||
if (CoursesAndSessionsCatalog::showCourses()) { |
||||
$headers[] = [ |
||||
'url' => api_get_self(), |
||||
'content' => get_lang('CourseManagement'), |
||||
]; |
||||
} |
||||
|
||||
if (CoursesAndSessionsCatalog::showSessions()) { |
||||
$headers[] = [ |
||||
'url' => $url, |
||||
'content' => get_lang('SessionList'), |
||||
]; |
||||
} |
||||
|
||||
return Display::tabsOnlyLink($headers, $active); |
||||
} |
||||
|
||||
/** |
||||
* Show the Session Catalogue with filtered session by course tags. |
||||
* |
||||
* @param array $limit Limit info |
||||
*/ |
||||
public function sessionsListByCoursesTag(array $limit) |
||||
{ |
||||
$searchTag = isset($_POST['search_tag']) ? $_POST['search_tag'] : null; |
||||
$searchDate = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d'); |
||||
$hiddenLinks = isset($_GET['hidden_links']) ? (int) $_GET['hidden_links'] == 1 : false; |
||||
$courseUrl = CourseCategory::getCourseCategoryUrl( |
||||
1, |
||||
$limit['length'], |
||||
null, |
||||
0, |
||||
'subscribe' |
||||
); |
||||
|
||||
$sessions = CoursesAndSessionsCatalog::browseSessionsByTags($searchTag, $limit); |
||||
$sessionsBlocks = $this->getFormattedSessionsBlock($sessions); |
||||
|
||||
$tpl = new Template(); |
||||
$tpl->assign('show_courses', CoursesAndSessionsCatalog::showCourses()); |
||||
$tpl->assign('show_sessions', CoursesAndSessionsCatalog::showSessions()); |
||||
$tpl->assign('show_tutor', api_get_setting('show_session_coach') === 'true' ? true : false); |
||||
$tpl->assign('course_url', $courseUrl); |
||||
$tpl->assign('already_subscribed_label', $this->getAlreadyRegisteredInSessionLabel()); |
||||
$tpl->assign('hidden_links', $hiddenLinks); |
||||
$tpl->assign('search_token', Security::get_token()); |
||||
$tpl->assign('search_date', Security::remove_XSS($searchDate)); |
||||
$tpl->assign('search_tag', Security::remove_XSS($searchTag)); |
||||
$tpl->assign('sessions', $sessionsBlocks); |
||||
|
||||
$contentTemplate = $tpl->get_template('auth/session_catalog.tpl'); |
||||
|
||||
$tpl->display($contentTemplate); |
||||
} |
||||
|
||||
/** |
||||
* @return array |
||||
*/ |
||||
public static function getLimitArray() |
||||
{ |
||||
$pageCurrent = isset($_REQUEST['pageCurrent']) ? (int) $_GET['pageCurrent'] : 1; |
||||
$pageLength = isset($_REQUEST['pageLength']) ? (int) $_GET['pageLength'] : CoursesAndSessionsCatalog::PAGE_LENGTH; |
||||
|
||||
return [ |
||||
'start' => ($pageCurrent - 1) * $pageLength, |
||||
'current' => $pageCurrent, |
||||
'length' => $pageLength, |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* Get the formatted data for sessions block to be displayed on Session Catalog page. |
||||
* |
||||
* @param array $sessions The session list |
||||
* |
||||
* @return array |
||||
*/ |
||||
private function getFormattedSessionsBlock(array $sessions) |
||||
{ |
||||
$extraFieldValue = new ExtraFieldValue('session'); |
||||
$userId = api_get_user_id(); |
||||
$sessionsBlocks = []; |
||||
$entityManager = Database::getManager(); |
||||
$sessionRelCourseRepo = $entityManager->getRepository('ChamiloCoreBundle:SessionRelCourse'); |
||||
$extraFieldRepo = $entityManager->getRepository('ChamiloCoreBundle:ExtraField'); |
||||
$extraFieldRelTagRepo = $entityManager->getRepository('ChamiloCoreBundle:ExtraFieldRelTag'); |
||||
|
||||
$tagsField = $extraFieldRepo->findOneBy([ |
||||
'extraFieldType' => Chamilo\CoreBundle\Entity\ExtraField::COURSE_FIELD_TYPE, |
||||
'variable' => 'tags', |
||||
]); |
||||
|
||||
/** @var \Chamilo\CoreBundle\Entity\Session $session */ |
||||
foreach ($sessions as $session) { |
||||
$sessionDates = SessionManager::parseSessionDates([ |
||||
'display_start_date' => $session->getDisplayStartDate(), |
||||
'display_end_date' => $session->getDisplayEndDate(), |
||||
'access_start_date' => $session->getAccessStartDate(), |
||||
'access_end_date' => $session->getAccessEndDate(), |
||||
'coach_access_start_date' => $session->getCoachAccessStartDate(), |
||||
'coach_access_end_date' => $session->getCoachAccessEndDate(), |
||||
]); |
||||
|
||||
$imageField = $extraFieldValue->get_values_by_handler_and_field_variable( |
||||
$session->getId(), |
||||
'image' |
||||
); |
||||
$sessionCourseTags = []; |
||||
if (!is_null($tagsField)) { |
||||
$sessionRelCourses = $sessionRelCourseRepo->findBy([ |
||||
'session' => $session, |
||||
]); |
||||
/** @var SessionRelCourse $sessionRelCourse */ |
||||
foreach ($sessionRelCourses as $sessionRelCourse) { |
||||
$courseTags = $extraFieldRelTagRepo->getTags( |
||||
$tagsField, |
||||
$sessionRelCourse->getCourse()->getId() |
||||
); |
||||
/** @var Tag $tag */ |
||||
foreach ($courseTags as $tag) { |
||||
$sessionCourseTags[] = $tag->getTag(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
if (!empty($sessionCourseTags)) { |
||||
$sessionCourseTags = array_unique($sessionCourseTags); |
||||
} |
||||
|
||||
/** @var SequenceResourceRepository $repo */ |
||||
$repo = $entityManager->getRepository('ChamiloCoreBundle:SequenceResource'); |
||||
$sequences = $repo->getRequirementsAndDependenciesWithinSequences( |
||||
$session->getId(), |
||||
SequenceResource::SESSION_TYPE |
||||
); |
||||
|
||||
$hasRequirements = false; |
||||
foreach ($sequences as $sequence) { |
||||
if (count($sequence['requirements']) === 0) { |
||||
continue; |
||||
} |
||||
$hasRequirements = true; |
||||
break; |
||||
} |
||||
$cat = $session->getCategory(); |
||||
if (empty($cat)) { |
||||
$cat = null; |
||||
$catName = ''; |
||||
} else { |
||||
$catName = $cat->getName(); |
||||
} |
||||
|
||||
$generalCoach = $session->getGeneralCoach(); |
||||
$coachId = $generalCoach ? $generalCoach->getId() : 0; |
||||
$coachName = $generalCoach ? UserManager::formatUserFullName($session->getGeneralCoach()) : ''; |
||||
|
||||
$actions = null; |
||||
if (api_is_platform_admin()) { |
||||
$actions = api_get_path(WEB_CODE_PATH).'session/resume_session.php?id_session='.$session->getId(); |
||||
} |
||||
|
||||
$plugin = \BuyCoursesPlugin::create(); |
||||
$isThisSessionOnSale = $plugin->getBuyCoursePluginPrice($session); |
||||
|
||||
$sessionsBlock = [ |
||||
'id' => $session->getId(), |
||||
'name' => $session->getName(), |
||||
'image' => isset($imageField['value']) ? $imageField['value'] : null, |
||||
'nbr_courses' => $session->getNbrCourses(), |
||||
'nbr_users' => $session->getNbrUsers(), |
||||
'coach_id' => $coachId, |
||||
'coach_url' => $generalCoach |
||||
? api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?a=get_user_popup&user_id='.$coachId |
||||
: '', |
||||
'coach_name' => $coachName, |
||||
'coach_avatar' => UserManager::getUserPicture( |
||||
$coachId, |
||||
USER_IMAGE_SIZE_SMALL |
||||
), |
||||
'is_subscribed' => SessionManager::isUserSubscribedAsStudent( |
||||
$session->getId(), |
||||
$userId |
||||
), |
||||
'icon' => $this->getSessionIcon($session->getName()), |
||||
'date' => $sessionDates['display'], |
||||
'price' => !empty($isThisSessionOnSale['html']) ? $isThisSessionOnSale['html'] : '', |
||||
'subscribe_button' => isset($isThisSessionOnSale['buy_button']) ? $isThisSessionOnSale['buy_button'] : $this->getRegisteredInSessionButton( |
||||
$session->getId(), |
||||
$session->getName(), |
||||
$hasRequirements |
||||
), |
||||
'show_description' => $session->getShowDescription(), |
||||
'description' => $session->getDescription(), |
||||
'category' => $catName, |
||||
'tags' => $sessionCourseTags, |
||||
'edit_actions' => $actions, |
||||
'duration' => SessionManager::getDayLeftInSession( |
||||
['id' => $session->getId(), 'duration' => $session->getDuration()], |
||||
$userId |
||||
), |
||||
]; |
||||
|
||||
$sessionsBlocks[] = array_merge($sessionsBlock, $sequences); |
||||
} |
||||
|
||||
return $sessionsBlocks; |
||||
} |
||||
} |
Loading…
Reference in new issue