Yannick Warnier 10 years ago
parent
commit
4038eb9c08

+ 50 - 2
main/auth/courses.php

@@ -76,8 +76,8 @@ if (api_is_platform_admin() || api_is_course_admin() || api_is_allowed_to_create
 }
 
 // filter actions
-$actions = array('sortmycourses', 'createcoursecategory', 'subscribe', 'deletecoursecategory', 'display_courses', 'display_random_courses', 'subscribe_user_with_password');
-$action = 'display_random_courses';
+$actions = array('sortmycourses', 'createcoursecategory', 'subscribe', 'deletecoursecategory', 'display_courses', 'display_random_courses', 'subscribe_user_with_password', 'display_sessions');
+$action = CoursesAndSessionsCatalog::is(CATALOG_SESSIONS) ? 'display_sessions' : 'display_random_courses';
 $nameTools = get_lang('SortMyCourses');
 
 if (isset($_GET['action']) && in_array($_GET['action'],$actions)) {
@@ -99,6 +99,10 @@ if ($action == 'display_random_courses' || $action == 'display_courses' ) {
 	$nameTools = get_lang('CourseManagement');
 }
 
+if ($action == 'display_sessions') {
+    $nameTools = get_lang('Sessions');
+}
+
 // Breadcrumbs.
 $interbreadcrumb[] = array('url' => api_get_path(WEB_PATH).'user_portal.php', 'name' => get_lang('MyCourses'));
 
@@ -215,4 +219,48 @@ switch ($action) {
     case 'display_courses':
         $courses_controller->courses_categories($action, $_GET['category_code']);
         break;
+    case 'display_sessions':
+        $date = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d');
+        $hiddenLinks = isset($_GET['hidden_links']) ? intval($_GET['hidden_links']) == 1 : false;
+
+        $authModel = new Auth();
+        $sessions = $authModel->browseSessions($date);
+
+        $sessionsBlocks = array();
+
+        foreach ($sessions as $session) {
+            $sessionsBlocks[] = array(
+                'id' => $session['id'],
+                'name' => $session['name'],
+                'nbr_courses' => $session['nbr_courses'],
+                'nbr_users' => $session['nbr_users'],
+                'coach_name' => $session['coach_name'],
+                'is_subscribed' => $session['is_subscribed'],
+                'icon' => $courses_controller->getSessionIcon($session['name']),
+                'date' => SessionManager::getSessionFormattedDate($session),
+                'subscribe_button' => $courses_controller->getRegisterInSessionButton($session['name'])
+            );
+        }
+
+        $tpl = new Template();
+        $tpl->assign('action', $action);
+        $tpl->assign('showCourses', CoursesAndSessionsCatalog::showCourses());
+        $tpl->assign('showSessions', CoursesAndSessionsCatalog::showSessions());
+        $tpl->assign('api_get_self', api_get_self());
+        $tpl->assign('nameTools', $nameTools);
+
+        $tpl->assign('coursesCategoriesList', $courses_controller->getCoursesCategoriesBlock());
+
+        $tpl->assign('hiddenLinks', $hiddenLinks);
+        $tpl->assign('searchToken', Security::get_token());
+
+        $tpl->assign('searchDate', $date);
+        $tpl->assign('web_session_courses_ajax_url', api_get_path(WEB_AJAX_PATH) . 'course.ajax.php');
+        $tpl->assign('sessions_blocks', $sessionsBlocks);
+        $tpl->assign('already_subscribed_label', $courses_controller->getAlreadyRegisterInSessionLabel());
+
+        $conentTemplate = $tpl->get_template('auth/sessions_catalog.tpl');
+
+        $tpl->display($conentTemplate);
+        break;
 }

+ 160 - 0
main/auth/courses_controller.php

@@ -82,6 +82,8 @@ class CoursesController
     {
         $data = array();
         $browse_course_categories = $this->model->browse_course_categories();
+        
+        global $_configuration;
 
         if ($action == 'display_random_courses') {
             $data['browse_courses_in_category'] = $this->model->browse_courses_in_category(null, 10);
@@ -119,6 +121,12 @@ class CoursesController
         $data['message']          = $message;
         $data['content']          = $content;
         $data['error']            = $error;
+        
+        $data['catalogShowCoursesSessions'] = 0;
+        
+        if (isset($_configuration['catalog_show_courses_sessions'])) {
+            $data['catalogShowCoursesSessions'] = $_configuration['catalog_show_courses_sessions'];
+        }
 
         // render to the view
         $this->view->set_data($data);
@@ -320,4 +328,156 @@ class CoursesController
             $this->courses_categories('subcribe', $category_code, $message, $error);
         }
     }
+    
+    /**
+     * Get the html block for courses categories
+     * @param string $code Current category code
+     * @param boolean $hiddenLinks Whether hidden links
+     * @return string The HTML block
+     */
+    public function getCoursesCategoriesBlock($code = null, $hiddenLinks = false)
+    {
+        $categories = $this->model->browse_course_categories();
+
+        $html = '';
+
+        if (!empty($categories)) {
+
+            foreach ($categories[0] as $category) {
+                $categoryName = $category['name'];
+                $categoryCode = $category['code'];
+                $categoryCourses = $category['count_courses'];
+
+                $html .= '<li>';
+
+                if ($code == $categoryCode) {
+                    $html .= '<strong>';
+                    $html .= "$categoryName ($categoryCourses)";
+                    $html .= '</strong>';
+                } else {
+                    if (!empty($categoryCourses)) {
+                        $html .= '<a href="' . api_get_self() . '?action=display_courses&category_code=' . $categoryCode . '&hidden_links=' . $hiddenLinks . '">';
+                        $html .= "$categoryName ($categoryCourses)";
+                        $html .= '</a>';
+                    } else {
+                        $html .= "$categoryName ($categoryCourses)";
+                    }
+                }
+
+                if (!empty($categories[$categoryCode])) {
+                    $html .= '<ul class="nav nav-list">';
+
+                    foreach ($categories[$categoryCode] as $subCategory1) {
+                        $subCategory1Name = $subCategory1['name'];
+                        $subCategory1Code = $subCategory1['code'];
+                        $subCategory1Courses = $subCategory1['count_courses'];
+
+                        $html .= '<li>';
+
+                        if ($code == $subCategory1Code) {
+                            $html .= "<strong>$subCategory1Name ($subCategory1Courses)</strong>";
+                        } else {
+                            $html .= '<a href="' . api_get_self() . '?action=display_courses&category_code=' . $subCategory1Code . '&hidden_links=' . $hiddenLinks . '">';
+                            $html .= "$subCategory1Name ($subCategory1Courses)";
+                            $html .= '</a>';
+                        }
+
+                        if (!empty($categories[$subCategory1Code])) {
+                            $html .= '<ul class="nav nav-list">';
+
+                            foreach ($categories[$subCategory1Code] as $subCategory2) {
+                                $subCategory2Name = $subCategory2['name'];
+                                $subCategory2Code = $subCategory2['code'];
+                                $subCategory2Courses = $subCategory2['count_courses'];
+
+                                $html .= '<li>';
+
+                                if ($code == $subCategory2Code) {
+                                    $html .= "<strong>$subCategory2Name ($subCategory2Courses)</strong>";
+                                } else {
+                                    $html .= '<a href="' . api_get_self() . '?action=display_courses&category_code=' . $subCategory2Code . '&hidden_links=' . $hiddenLinks . '">';
+                                    $html .= "$subCategory2Name ($subCategory2Courses)";
+                                    $html .= '</a>';
+                                }
+
+                                if (!empty($categories[$subCategory2Code])) {
+                                    $html .= '<ul class="nav nav-list">';
+
+                                    foreach ($categories[$subCategory2Code] as $subCategory3) {
+                                        $subCategory3Name = $subCategory3['name'];
+                                        $subCategory3Code = $subCategory3['code'];
+                                        $subCategory3Courses = $subCategory3['count_courses'];
+
+                                        $html .= '<li>';
+
+                                        if ($code == $subCategory3Code) {
+                                            $html .= "<strong>$subCategory3Name ($subCategory3Courses)</strong>";
+                                        } else {
+                                            $html .= '<a href="' . api_get_self() . '?action=display_courses&category_code=' . $subCategory3Code . '&hidden_links=' . $hiddenLinks . '">';
+                                            $html .= "$subCategory3Name ($subCategory3Courses)";
+                                            $html .= '</a>';
+                                        }
+
+                                        $html .= '</li>';
+                                    }
+
+                                    $html .= '</ul>';
+                                }
+
+                                $html .= '</li>';
+                            }
+
+                            $html .= '</ul>';
+                        }
+
+                        $html .= '</li>';
+                    }
+
+                    $html .= '</ul>';
+                }
+
+                $html .= '</li>';
+            }
+        }
+
+        return $html;
+    }
+
+    /**
+     * Get a HTML button for subscribe to session
+     * @param string $sessionName The session name
+     * @return string The button
+     */
+    public function getRegisterInSessionButton($sessionName)
+    {
+        $sessionName = urlencode($sessionName);
+
+        $url = api_get_path(WEB_PATH) . "main/inc/email_editor.php?action=subscribe_me_to_session&session=$sessionName";
+
+        return Display::url(get_lang('Subscribe'), $url, array(
+                    'class' => 'btn btn-primary',
+        ));
+    }
+
+    /**
+     * Generate a label if the user has been  registered in session
+     * @return string The label
+     */
+    public function getAlreadyRegisterInSessionLabel()
+    {
+        $icon = Display::return_icon('students.gif', get_lang('Student'));
+
+        return Display::label($icon . ' ' . get_lang("AlreadyRegisteredToSession"), "info");
+    }
+
+    /**
+     * 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_LARGE);
+    }
+
 }

+ 32 - 0
main/inc/ajax/course.ajax.php

@@ -232,6 +232,38 @@ switch ($action) {
             }
         }
         break;
+    case 'display_sessions_courses':
+        $sessionId = intval($_GET['session']);
+        $userTable = Database::get_main_table(TABLE_MAIN_USER);
+
+        $coursesData = SessionManager::get_course_list_by_session_id($sessionId);
+
+        $courses = array();
+
+        foreach ($coursesData as $courseId => $course) {
+            $coachData = SessionManager::getCoachesByCourseSession($sessionId, $course['code']);
+            
+            $coachName = '';
+
+            if (!empty($coachData)) {
+                $userResult = Database::select('lastname,firstname', $userTable, array(
+                    'where' => array(
+                        'user_id = ?' => $coachData[0]
+                    )
+                ), 'first');
+
+                $coachName = api_get_person_name($userResult['firstname'], $userResult['lastname']);
+           }
+           
+           $courses[] = array(
+               'id' => $courseId,
+               'name' => $course['title'],
+               'coachName' => $coachName,
+           );
+        }
+
+        echo json_encode($courses);
+        break;
     default:
         echo '';
 }

+ 27 - 5
main/inc/email_editor.php

@@ -27,6 +27,8 @@ if (empty($_SESSION['origin_url'])) {
 	Session::write('origin_url',$origin_url);
 }
 
+$action = isset($_GET['action']) ? $_GET['action'] : null;
+
 $form = new FormValidator('email_editor', 'post');
 $form->addElement('hidden', 'dest');
 $form->addElement('text', 'email_address', get_lang('EmailDestination'));
@@ -40,13 +42,33 @@ $form->addRule('email_text', get_lang('ThisFieldIsRequired'), 'required');
 $form->addRule('email_address', get_lang('EmailWrong'), 'email');
 
 $form->addElement('button', 'submit', get_lang('SendMail'));
+
+switch ($action) {
+    case 'subscribe_me_to_session':
+        $sessionName = isset($_GET['session']) ? Security::remove_XSS($_GET['session']) : null;
+        
+        $objTemplate = new Template();
+        $objTemplate->assign('session_name', $sessionName);
+        $objTemplate->assign('user', api_get_user_info());
+        $mailTemplate = $objTemplate->get_template('mail/subscribe_me_to_session.tpl');
+
+        $emailDest = api_get_setting('emailAdministrator');
+        $emailTitle = get_lang('SubscribeToSession');
+        $emailText = $objTemplate->fetch($mailTemplate);
+        break;
+    default:
+        $emailDest = Security::remove_XSS($_REQUEST['dest']);
+        $emailTitle = Security::remove_XSS($_REQUEST['email_title']);
+        $emailText = Security::remove_XSS($_REQUEST['email_text']);
+}
         
-$defaults = array(  'dest' => Security::remove_XSS($_REQUEST['dest']),
-                    'email_address' => Security::remove_XSS($_REQUEST['dest']),
-                    'email_title' => Security::remove_XSS($_POST['email_title']),
-                    'email_text' => Security::remove_XSS($_POST['email_text'])
-    
+$defaults = array(
+    'dest' => $emailDest,
+    'email_address' => $emailDest,
+    'email_title' => $emailTitle,
+    'email_text' => $emailText
 );
+
 $form->setDefaults($defaults);
 
 if ($form->validate()) {

+ 69 - 0
main/inc/lib/CoursesAndSessionsCatalog.class.php

@@ -0,0 +1,69 @@
+<?php
+
+class CoursesAndSessionsCatalog
+{
+
+    /**
+     * Check the configuration for the courses and sessions catalog
+     * @global array $_configuration Configuration
+     * @param int $value The value to check
+     * @return boolean Whether the configuration is $value
+     */
+    public static function is($value = CATALOG_COURSES)
+    {
+        global $_configuration;
+
+        if (isset($_configuration['catalog_show_courses_sessions'])) {
+            if ($_configuration['catalog_show_courses_sessions'] == $value) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Check whether to display the sessions list
+     * @global array $_configuration Configuration
+     * @return boolean whether to display
+     */
+    public static function showSessions()
+    {
+        global $_configuration;
+
+        $catalogShow = CATALOG_COURSES;
+
+        if (isset($_configuration['catalog_show_courses_sessions'])) {
+            $catalogShow = $_configuration['catalog_show_courses_sessions'];
+        }
+
+        if ($catalogShow == CATALOG_SESSIONS || $catalogShow == CATALOG_COURSES_SESSIONS) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Check whether to display the courses list
+     * @global array $_configuration Configuration
+     * @return boolean whether to display
+     */
+    public static function showCourses()
+    {
+        global $_configuration;
+
+        $catalogShow = CATALOG_COURSES;
+
+        if (isset($_configuration['catalog_show_courses_sessions'])) {
+            $catalogShow = $_configuration['catalog_show_courses_sessions'];
+        }
+
+        if ($catalogShow == CATALOG_COURSES || $catalogShow == CATALOG_COURSES_SESSIONS) {
+            return true;
+        }
+
+        return false;
+    }
+
+}

+ 45 - 0
main/inc/lib/auth.lib.php

@@ -535,4 +535,49 @@ class Auth
             return array('message' => $message, 'content' => $content);
         }
     }
+    
+    /**
+     * List the sessions 
+     * @param date $date (optional) The date of sessions
+     * @return array The session list
+     */
+    public function browseSessions($date = null)
+    {
+        require_once api_get_path(LIBRARY_PATH) . 'sessionmanager.lib.php';
+
+        $userTable = Database::get_main_table(TABLE_MAIN_USER);
+        $sessionTable = Database::get_main_table(TABLE_MAIN_SESSION);
+
+        $sessionsToBrowse = array();
+        $userId = api_get_user_id();
+
+        $sql = "SELECT s.id, s.name, s.nbr_courses, s.nbr_users, s.date_start, s.date_end, u.lastname, u.firstname, u.username "
+                . "FROM $sessionTable AS s "
+                . "INNER JOIN $userTable AS u "
+                . "ON s.id_coach = u.user_id ";
+
+        if (!is_null($date)) {
+            $date = Database::escape_string($date);
+            
+            $sql .= "WHERE ('$date' BETWEEN s.date_start AND s.date_end) "
+                    . "OR (s.date_end = '0000-00-00') "
+                    . "OR (s.date_start = '0000-00-00' AND s.date_end != '0000-00-00' AND s.date_end > '$date')";
+        }
+
+        $sessionResult = Database::query($sql);
+
+        if ($sessionResult != false) {
+            while ($session = Database::fetch_assoc($sessionResult)) {
+                if ($session['nbr_courses'] > 0) {
+                    $session['coach_name'] = api_get_person_name($session['firstname'], $session['lastname']);
+                    $session['coach_name'] .= " ({$session['username']})";
+                    $session['is_subscribed'] = SessionManager::isUserSusbcribedAsStudent($session['id'], $userId);
+
+                    $sessionsToBrowse[] = $session;
+                }
+            }
+        }
+
+        return $sessionsToBrowse;
+    }
 }

+ 1 - 0
main/inc/lib/autoload.class.php

@@ -115,6 +115,7 @@ class Autoload
         $result['Controller'] = '/main/inc/lib/controller.class.php';
         $result['Converter'] = '/main/inc/lib/system/text/converter.class.php';
         $result['Course'] = '/main/coursecopy/classes/Course.class.php';
+        $result['CoursesAndSessionsCatalog'] = '/main/inc/lib/CoursesAndSessionsCatalog.class.php';
         $result['CourseArchiver'] = '/main/coursecopy/classes/CourseArchiver.class.php';
         $result['CourseBuilder'] = '/main/coursecopy/classes/CourseBuilder.class.php';
         $result['CourseCopyLearnpath'] = '/main/coursecopy/classes/CourseCopyLearnpath.class.php';

+ 5 - 0
main/inc/lib/main_api.lib.php

@@ -341,6 +341,11 @@ define('ICON_SIZE_HUGE',    128);
 
 define('SHOW_TEXT_NEAR_ICONS', false);
 
+//Session catalog
+define('CATALOG_COURSES', 0);
+define('CATALOG_SESSIONS', 1);
+define('CATALOG_COURSES_SESSIONS', 2);
+
 /**
  * Inclusion of internationalization libraries
  */

+ 54 - 0
main/inc/lib/sessionmanager.lib.php

@@ -4894,4 +4894,58 @@ class SessionManager
 
         return $values;
     }
+
+    /**
+     * Check if user is subscribed inside a session as student
+     * @param int $sessionId The session id
+     * @param int $userId The user id
+     * @return boolean Whether is subscribed
+     */
+    public static function isUserSusbcribedAsStudent($sessionId, $userId) {
+        $sessionRelUserTable = Database::get_main_table(TABLE_MAIN_SESSION_USER);
+
+        $sessionId = Database::escape_string($sessionId);
+        $userId = Database::escape_string($userId);
+
+        $sql = "SELECT COUNT(1) AS qty FROM $sessionRelUserTable "
+                . "WHERE id_session = $sessionId AND id_user = $userId AND relation_type = 0";
+
+        $result = Database::fetch_assoc(Database::query($sql));
+
+        if (!empty($result) && $result['qty'] > 0) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Get the formatted date of a session by its start and end date
+     * @param array $sessionInfo The session information containing the start and end date
+     * @return string The formatted date
+     */
+    public static function getSessionFormattedDate($sessionInfo)
+    {
+        if ($sessionInfo['date_start'] == '0000-00-00' && $sessionInfo['date_end'] == '0000-00-00') {
+            return get_lang('NoTimeLimits');
+        } else {
+            $startDate = '';
+            $endDate = '';
+
+            if ($sessionInfo['date_start'] != '0000-00-00') {
+                $startDate = get_lang('From') . ' ' . api_format_date($sessionInfo['date_start'], DATE_FORMAT_LONG_NO_DAY);
+            } else {
+                $startDate = '';
+            }
+
+            if ($sessionInfo['date_end'] == '0000-00-00') {
+                $endDate = '';
+            } else {
+                $endDate = get_lang('Until') . ' ' . api_format_date($sessionInfo['date_end'], DATE_FORMAT_LONG_NO_DAY);
+            }
+
+            return "$startDate $endDate";
+        }
+    }
+
 }

+ 3 - 0
main/install/configuration.dist.php

@@ -238,3 +238,6 @@ $_configuration['system_stable']     = NEW_VERSION_STABLE;
 //$_configuration['prevent_multiple_simultaneous_login'] = false;
 // Hide private courses from course catalog
 //$_configuration['course_catalog_hide_private'] = false;
+// Display sessions catalog
+// 0 = show only courses; 1 = show only sessions; 2 = show courses and sessions
+//$_configuration['catalog_show_courses_sessions'] = 0;

+ 93 - 5
main/template/default/auth/courses_categories.php

@@ -7,6 +7,17 @@
 * @package chamilo.auth
 */
 $stok = Security::get_token();
+
+$showCourses = CoursesAndSessionsCatalog::showCourses();
+$showSessions = CoursesAndSessionsCatalog::showSessions();
+
+if ($showSessions && isset($_POST['date'])) {
+    $date = $_POST['date'];
+} else {
+    $date = date('Y-m-d');
+}
+
+$userInfo = api_get_user_info();
 ?>
 <script>
     $(document).ready( function() {
@@ -26,6 +37,58 @@ $stok = Security::get_token();
                 }
             });
         });
+    
+        $('.courses-list-btn').toggle(function (e) {
+            e.preventDefault();
+
+            var $el = $(this);
+            var sessionId = getSessionId(this);
+
+            $el.children('img').remove();
+            $el.prepend('<?php echo Display::display_icon('nolines_minus.gif'); ?>');
+
+            $.ajax({
+                url: '<?php echo api_get_path(WEB_AJAX_PATH) . 'course.ajax.php' ?>',
+                type: 'GET',
+                dataType: 'json',
+                data: {
+                    a: 'display_sessions_courses',
+                    session: sessionId
+                },
+                success: function (response){
+                    var $container = $el.prev('.course-list');
+
+                    var $courseList = $('<ul>');
+
+                    $.each(response, function (index, course){
+                        $courseList.append('<li><div><strong>' + course.name + '</strong><br>' + course.coachName + '</div></li>');
+                    });
+
+                    $container.append($courseList).show(250);
+                }
+            });
+        }, function (e) {
+            e.preventDefault();
+
+            var $el = $(this);
+            var $container = $el.prev('.course-list');
+            $container.hide(250).empty();
+            
+            $el.children('img').remove();
+            $el.prepend('<?php echo Display::display_icon('nolines_plus.gif'); ?>');
+        });
+        
+        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>
 
@@ -33,7 +96,8 @@ $stok = Security::get_token();
     <div class="span3">
         <div id="course_category_well" class="well">
             <ul class="nav nav-list">
-                <?php if (intval($_GET['hidden_links']) != 1) { ?>
+                <?php if ($showCourses) { ?>
+                <?php if (!isset($_GET['hidden_links']) || intval($_GET['hidden_links']) != 1) { ?>
                 <form class="form-search" method="post" action="<?php echo api_get_self(); ?>?action=subscribe&amp;hidden_links=0">
                     <fieldset>
                         <input type="hidden" name="sec_token" value="<?php echo $stok; ?>">
@@ -127,12 +191,34 @@ $stok = Security::get_token();
                 }
             }
             ?>
+                <?php } ?>
+                <?php if ($showSessions) { ?>
+                    <li class="nav-header"><?php echo get_lang('Sessions'); ?></li>
+                    <li>
+                        <?php if ($action == 'display_sessions' && $_SERVER['REQUEST_METHOD'] != 'POST') { ?>
+                            <strong><?php echo get_lang('SessionList'); ?></strong>
+                        <?php } else { ?>
+                            <a href="<?php echo api_get_self() ?>?action=display_sessions"><?php echo get_lang('SessionList'); ?></a>
+                        <?php } ?>
+                    </li>
+                    <li class="nav-header"><?php echo get_lang('SearchActiveSessions') ?></li>
+                    <form class="form-search" method="post" action="<?php echo api_get_self(); ?>?action=display_sessions">
+                        <div class="input-append">
+                            <?php echo Display::input('date', 'date', $date, array(
+                                'class' => 'span2',
+                                'id' => 'date',
+                                'readonly' => ''
+                            )); ?>
+                            <button class="btn" type="submit"><?php echo get_lang('Search'); ?></button>
+                        </div>
+                    </form>
+                <?php } ?>
         </div>
     </div>
 
     <div class="span9">
-        <?php
-        if (!empty($message)) { Display::display_confirmation_message($message, false); }
+        <?php if ($showCourses && $action != 'display_sessions') { ?>
+        <?php if (!empty($message)) { Display::display_confirmation_message($message, false); }
         if (!empty($error)) { Display::display_error_message($error, false); }
 
         if (!empty($content)) { echo $content; }
@@ -225,8 +311,8 @@ $stok = Security::get_token();
             if (!isset($_REQUEST['subscribe_user_with_password']) && !isset($_REQUEST['subscribe_course'])) {
                 Display::display_warning_message(get_lang('ThereAreNoCoursesInThisCategory'));
             }
-        }
-        ?>
+        } ?>
+        <?php } ?>
     </div>
 </div>
 
@@ -338,3 +424,5 @@ function display_unregister_button($course, $stok, $search_term, $code)
 {
     echo ' <a class="btn btn-primary" href="'. api_get_self().'?action=unsubscribe&amp;sec_token='.$stok.'&amp;unsubscribe='.$course['code'].'&amp;search_term='.$search_term.'&amp;category_code='.$code.'">'.get_lang('Unsubscribe').'</a>';
 }
+
+

+ 147 - 0
main/template/default/auth/sessions_catalog.tpl

@@ -0,0 +1,147 @@
+{% extends "default/layout/main.tpl" %}
+
+{% block body %}
+    <script type="text/javascript">
+        $(document).on('ready', function() {
+            $('#date').datepicker({
+                dateFormat: 'yy-mm-dd'
+            });
+
+            $('.accordion').on('show', function(e) {
+                var $target = $(e.target);
+                var $targetContent = $target.find('.accordion-inner');
+
+                $targetContent.empty();
+
+                var idParts = $target.attr('id').split('-');
+
+                var sessionId = parseInt(idParts[1], 10);
+
+                $.ajax('{{ web_session_courses_ajax_url }}', {
+                    data: {
+                        a: 'display_sessions_courses',
+                        session: sessionId
+                    },
+                    dataType: 'json',
+                    success: function(response) {
+                        var coursesUL = '';
+
+                        $.each(response, function(index, course) {
+                            coursesUL += '<li><strong>' + course.name + '</strong>';
+
+                            if (course.coachName != '') {
+                                coursesUL += ' (' + course.coachName + ')';
+                            }
+
+                            coursesUL += '</li>';
+                        });
+
+                        $targetContent.html('<ul>' + coursesUL + '</ul>');
+                    }
+                });
+            });
+        });
+    </script>
+
+    <div class="span3">
+        {% if showCourses %}
+            <div class="well">
+                {% if not hiddenLinks %}
+                    <form class="form-search" method="post" action="{{ api_get_self }}?action=subscribe&amp;hidden_links=0">
+                        <fieldset>
+                            <input type="hidden" name="sec_token" value="{{ searchToken }}">
+                            <input type="hidden" name="search_course" value="1" />
+                            <div class="control-group">
+                                <div class="controls">
+                                    <div class="input-append">
+                                        <input class="span2" type="text" name="search_term" />
+                                        <button class="btn" type="submit">{{ 'Search' | get_lang }}</button>
+                                    </div>
+                                </div>
+                            </div>
+                        </fieldset>
+                    </form>
+                {% endif %}
+
+                {% if coursesCategoriesList is not empty %}
+                    <a class="btn" href="{{ api_get_self }}?action=display_random_courses">{{ 'RandomPick' | get_lang }}</a>
+                {% endif %}
+            </div>
+
+            {% if coursesCategoriesList is not empty %}
+                <div class="well">
+                    <ul class="nav nav-list">
+                        <li class="nav-header">{{ 'CourseCategories' | get_lang }}</li>
+
+                        {{ coursesCategoriesList }}
+                    </ul>
+                </div>
+            {% endif %}
+        {% endif %}
+
+        {% if showSessions %}
+            <div class="well">
+                <ul class="nav nav-list">
+                    <li class="nav-header">{{ 'Sessions' | get_lang }}</li>
+                    <li>
+                        <strong>{{ nameTools }}</strong>
+                    </li>
+                    <li class="nav-header">{{ 'SearchSessions' | get_lang }}</li>
+                </ul>
+                <form class="form-search" method="post" action="{{ api_get_self }}?action=display_sessions">
+                    <div class="input-append">
+                        <input type="date" name="date" id="date" class="span2" value="{{ searchDate }}" readonly>
+                        <button class="btn" type="submit">{{ 'Search' | get_lang }}</button>
+                    </div>
+                </form>
+            </div>
+        {% endif %}
+    </div>
+    <div class="span9">
+        <div class="page-header">
+            <h2>{{ nameTools }}</h2>
+        </div>
+
+        {% for session in sessions_blocks %}
+            <div class="well" id="session-{{ session.id }}">
+                <div class="row">
+                    <div class="span6">
+                        <div class="row">
+                            <div class="span1">
+                                <span class="thumbnail">
+                                    {{ session.icon }}
+                                </span>
+                            </div>
+                            <div class="span5">
+                                <h3>{{ session.name }}</h3>
+                                <p>{{ session.coach_name }}</p>
+                            </div>
+                        </div>
+                        <br>
+                        <div class="accordion" id="session-{{ session.id }}-accordion" style="margin-bottom: 0px;">
+                            <div class="accordion-group">
+                                <div class="accordion-heading">
+                                    <a class="accordion-toggle" data-toggle="collapse" data-parent="#session-{{ session.id }}-accordion" href="#session-{{ session.id }}-courses">
+                                        {{ 'CourseList' | get_lang }}
+                                    </a>
+                                </div>
+                                <div id="session-{{ session.id }}-courses" class="accordion-body collapse in">
+                                    <div class="accordion-inner"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="span2">
+                        <p class="lead">{{ session.date }}</p>
+                        {% if session.is_subscribed %}
+                            {{ already_subscribed_label }}
+                        {% else %}
+                            {{ session.subscribe_button }}
+                        {% endif %}
+                    </div>
+                </div>
+            </div>
+        {% endfor %}
+    </div>
+
+{% endblock %}

+ 6 - 0
main/template/default/mail/subscribe_me_to_session.tpl

@@ -0,0 +1,6 @@
+{{ 'PleaseSubscribeMeToSession' | get_lang }}: {{ session_name }}
+
+{{ 'ContactInformation' | get_lang }}:
+{{ 'Name' | get_lang }}: {{ user.complete_name }}
+{{ 'Username' | get_lang }}: {{ user.username }}
+{{ 'Email' | get_lang }}: {{ user.email }}