Browse Source

Merge pull request #34 from AngelFQC/BT9887

Show sessions tags/image on session catalog - refs BT#9887 #TMI
Alex Aragon Calixto 9 years ago
parent
commit
aae8f79aff

+ 2 - 7
app/Resources/public/css/base.css

@@ -6059,13 +6059,8 @@ div#chat-remote-video video {
   height: 100px;
 }
 /* Catalog session */
-#session-list .item-content{
-  border: 1px solid #CCCCCC;
-  margin-bottom: 20px;
-  border-radius: 5px;
-  -moz-border-radius: 5px;
-  -webkit-border-radius: 5px;
-  padding: 10px;
+#session-list .col-md-4:nth-child(3n+1) {
+  clear: left;
 }
 /* CSS NEW TOP ******************************************************************************/
 /* CSS Responsive */

+ 74 - 73
main/auth/courses_controller.php

@@ -551,7 +551,6 @@ class CoursesController
     {
         $date = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d');
         $hiddenLinks = isset($_GET['hidden_links']) ? intval($_GET['hidden_links']) == 1 : false;
-
         $limit = isset($limit) ? $limit : getLimitArray();
 
         $countSessions = $this->model->countSessions($date);
@@ -562,63 +561,20 @@ class CoursesController
         $cataloguePagination = $pageTotal > 1 ?
             getCataloguePagination($limit['current'], $limit['length'], $pageTotal) :
             '';
-        $sessionsBlocks = array();
+        $sessionsBlocks = $this->getFormatedSessionsBlock($sessions);
 
         // Get session list catalogue URL
         //$sessionUrl = getCourseCategoryUrl(1, $limit['length'], null, 0, 'display_sessions');
         // Get session search catalogue URL
         $courseUrl = getCourseCategoryUrl(1, $limit['length'], null, 0, 'subscribe');
 
-        $key = 'name';
-        $catalogSessionAutoSubscriptionAllowed = false;
-        $catalogSessionAutoSubscription = api_get_setting('catalog_allow_session_auto_subscription');
-        if ($catalogSessionAutoSubscription === 'true') {
-            $key = 'id';
-            $catalogSessionAutoSubscriptionAllowed = true;
-        }
-
-        foreach ($sessions as $session) {
-            $sessionDates = SessionManager::parseSessionDates($session);
-
-            $sessionsBlock = 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' => $this->getSessionIcon($session['name']),
-                'date' => $sessionDates['display'],
-                'subscribe_button' => $this->getRegisteredInSessionButton(
-                    $session[$key],
-                    $catalogSessionAutoSubscriptionAllowed
-                ),
-                'show_description' => $session['show_description'],
-            );
-
-
-            /** @var \Chamilo\CoreBundle\Entity\Repository\SequenceRepository $repo */
-            $repo = Database::getManager()->getRepository('ChamiloCoreBundle:SequenceResource');
-            $requirementAndDependencies = $repo->getRequirementAndDependencies(
-                $session['id'],
-                SequenceResource::SESSION_TYPE
-            );
-
-            $sessionsBlock = array_merge($sessionsBlock, $requirementAndDependencies);
-            $sessionsBlocks[] = $sessionsBlock;
-        }
-
         $tpl = new Template();
-        $tpl->assign('action', $action);
         $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('api_get_self', api_get_self());
-        //$tpl->assign('session_url', $sessionUrl);
+
         $tpl->assign('course_url', $courseUrl);
-        $tpl->assign('nameTools', $nameTools);
 
-        $tpl->assign('course_category_list', $this->getCoursesCategoriesBlock(null, false, $limit));
         $tpl->assign('catalog_pagination', $cataloguePagination);
 
         $tpl->assign('hidden_links', $hiddenLinks);
@@ -644,13 +600,54 @@ class CoursesController
         $searchDate = isset($_POST['date']) ? $_POST['date'] : date('Y-m-d');
         $hiddenLinks = isset($_GET['hidden_links']) ? intval($_GET['hidden_links']) == 1 : false;
         $courseUrl = getCourseCategoryUrl(1, $limit['length'], null, 0, 'subscribe');
-        $userId = api_get_user_id();
 
-        $sessionsBlocks = array();
         $sessions = $this->model->browseSessionsByTags($searchTag, $limit);
 
+        $sessionsBlocks = $this->getFormatedSessionsBlock($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);
+    }
+
+    /**
+     * Get the formated data for sessions block to be displayed on Session Catalog page
+     * @param array $sessions The session list
+     * @return array
+     */
+    private function getFormatedSessionsBlock(array $sessions)
+    {
         $key = 'name';
         $catalogSessionAutoSubscriptionAllowed = false;
+        $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'
+        ]);
 
         if (api_get_setting('catalog_allow_session_auto_subscription') === 'true') {
             $key = 'id';
@@ -667,9 +664,35 @@ class CoursesController
                 '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
+                ]);
+
+                foreach ($sessionRelCourses as $sessionRelCourse) {
+                    $courseTags = $extraFieldRelTagRepo->getTags(
+                        $tagsField,
+                        $sessionRelCourse->getCourse()->getId()
+                    );
+
+                    foreach ($courseTags as $tag) {
+                        $sessionCourseTags[] = $tag->getTag();
+                    }
+                }
+            }
+
+            if (!empty($sessionCourseTags)) {
+                $sessionCourseTags = array_unique($sessionCourseTags);
+            }
+
             $sessionsBlock = array(
                 'id' => $session->getId(),
                 'name' => $session->getName(),
+                'image' => isset($imageField['value']) ? $imageField['value'] : null,
                 'nbr_courses' => $session->getNbrCourses(),
                 'nbr_users' => $session->getNbrUsers(),
                 'coach_name' => $session->getGeneralCoach()->getCompleteName(),
@@ -681,10 +704,10 @@ class CoursesController
                     $catalogSessionAutoSubscriptionAllowed
                 ),
                 'show_description' => $session->getShowDescription(),
+                'tags' => $sessionCourseTags
             );
 
-            /** @var \Chamilo\CoreBundle\Entity\Repository\SequenceRepository $repo */
-            $repo = Database::getManager()->getRepository('ChamiloCoreBundle:SequenceResource');
+            $repo = $entityManager->getRepository('ChamiloCoreBundle:SequenceResource');
             $requirementAndDependencies = $repo->getRequirementAndDependencies(
                 $session->getId(),
                 SequenceResource::SESSION_TYPE
@@ -694,29 +717,7 @@ class CoursesController
             $sessionsBlocks[] = $sessionsBlock;
         }
 
-        $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('course_category_list', $this->getCoursesCategoriesBlock(null, false, $limit));
-        $tpl->assign('already_subscribed_label', $this->getAlreadyRegisteredInSessionLabel());
-
-        $tpl->assign('hidden_links', $hiddenLinks);
-
-        $tpl->assign('search_date', Security::remove_XSS($searchDate));
-        $tpl->assign('search_tag', Security::remove_XSS($searchTag));
-        $tpl->assign('sessions', $sessionsBlocks);
-
-        if (empty($sessionsBlocks)) {
-            $tpl->assign('message', Display::return_message(get_lang('NoResults'), 'warning'));
-        }
-
-        $contentTemplate = $tpl->get_template('auth/session_catalog.tpl');
-
-        $tpl->display($contentTemplate);
+        return $sessionsBlocks;
     }
 
 }

+ 22 - 42
main/inc/lib/auth.lib.php

@@ -643,54 +643,34 @@ class Auth
      */
     public function browseSessions($date = null, $limit = array())
     {
-        $userTable = Database::get_main_table(TABLE_MAIN_USER);
-        $sessionTable = Database::get_main_table(TABLE_MAIN_SESSION);
-
-        $sessionsToBrowse = array();
-        $userId = api_get_user_id();
-        $limitFilter = getLimitFilterFromArray($limit);
+        $em = Database::getManager();
+        $qb = $em->createQueryBuilder();
 
-        $sql = <<<SQL
-            SELECT s.*, u.lastname, u.firstname, u.username, description,
-                show_description
-            FROM $sessionTable AS s
-            INNER JOIN $userTable AS u
-                ON s.id_coach = u.user_id
-            WHERE 1 = 1
-SQL;
+        $_sessions = $qb->select('s')
+            ->from('ChamiloCoreBundle:Session', 's')
+            ->setFirstResult($limit['start'])
+            ->setMaxResults($limit['length'])
+            ->where(
+                $qb->expr()->gt('s.nbrCourses', 0)
+            );
 
         if (!is_null($date)) {
-            $date = Database::escape_string($date);
-
-            $sql .= <<<SQL
-                AND ('$date' BETWEEN s.access_start_date AND s.access_end_date)
-                OR (s.access_end_date IS NULL)
-                OR (
-                    s.access_start_date IS NULL AND
-                    s.access_end_date IS NOT NULL AND
-                    s.access_end_date > '$date'
+            $_sessions
+                ->andWhere(
+                    $qb->expr()->orX(
+                        $qb->expr()->between(':date', 's.accessStartDate', 's.accessEndDate'),
+                        $qb->expr()->isNull('s.accessEndDate'),
+                        $qb->expr()->andX(
+                            $qb->expr()->isNull('s.accessStartDate'),
+                            $qb->expr()->isNotNull('s.accessEndDate'),
+                            $qb->expr()->gt('s.accessEndDate', ':date')
+                        )
+                    )
                 )
-SQL;
-        }
-
-        // Add limit filter to do pagination
-        $sql .= $limitFilter;
-
-        $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::isUserSubscribedAsStudent($session['id'], $userId);
-
-                    $sessionsToBrowse[] = $session;
-                }
-            }
+                ->setParameter('date', $date);
         }
 
-        return $sessionsToBrowse;
+        return $_sessions->getQuery()->getResult();
     }
 
     /**

+ 115 - 151
main/template/default/auth/session_catalog.tpl

@@ -6,179 +6,143 @@
             $('#date').datepicker({
                 dateFormat: 'yy-mm-dd'
             });
-
-            $('a[data-session]').on('click', function (e) {
-                e.preventDefault();
-
-                var link = $(this),
-                        sessionId = parseInt(link.data('session')),
-                        collapsible = $('#collapse-' + sessionId),
-                        courseList = link.data('courses') || [];
-
-                if (courseList.length === 0) {
-                    var getCourseList = $.getJSON(
-                            '{{ _p.web_ajax }}course.ajax.php',
-                            {
-                                a: 'display_sessions_courses',
-                                session: sessionId
-                            }
-                    );
-
-                    $.when(getCourseList).done(function (courses) {
-                        courseList = courses;
-                        link.data('courses', courses);
-
-                        var coursesUL = '';
-
-                        $.each(courseList, function (index, course) {
-                            coursesUL += '<li><img src="{{ _p.web }}main/img/check.png"/> <strong>' + course.name + '</strong>';
-
-                            if (course.coachName !== '') {
-                                coursesUL += ' (' + course.coachName + ')';
-                            }
-
-                            coursesUL += '</li>';
-                        });
-
-                        collapsible.html('<div class="panel-body"><ul class="list-unstyled items-session">' + coursesUL + '</ul></div>');
-
-                        collapsible.collapse('show');
-                    });
-                } else {
-                    collapsible.collapse('toggle');
-                }
-            });
-
-            $('.collapse').collapse('hide');
         });
     </script>
 
     <div class="col-md-12">
-        <!-- view catalog sessions -->
-
         <div class="row">
             {% if show_courses %}
-            <div class="col-md-4">
-                <div class="section-tile">{{ 'Courses'|get_lang }}</div>
-                {% if not hidden_links %}
-                <form class="form-horizontal" method="post" action="{{ course_url }}">
-                    <div class="form-group">
-                        <div class="col-sm-12">
-                        <input type="hidden" name="sec_token" value="{{ search_token }}">
-                        <input type="hidden" name="search_course" value="1" />
-                        <div class="input-group">
-                        <input type="text" name="search_term" class="form-control" />
-                            <span class="input-group-btn">
-                                <button class="btn btn-default" type="submit"><i class="fa fa-search"></i> {{ 'Search'|get_lang }}</button>
-                            </span>
-                        </div>
-                        </div>
-                    </div>
-                </form>
-                {% endif %}
-            </div>
-            {% endif %}
-            <div class="col-md-8">
-                {% if show_sessions %}
-
-                <div class="section-tile">{{ 'Sessions'|get_lang }}</div>
-
-                <div class="row">
-                    <div class="col-md-6">
-                        <form class="form-horizontal" method="post" action="{{ _p.web_self }}?action=display_sessions">
+                <div class="col-md-4">
+                    <div class="section-tile">{{ 'Courses'|get_lang }}</div>
+                    {% if not hidden_links %}
+                        <form class="form-horizontal" method="post" action="{{ course_url }}">
                             <div class="form-group">
-                                <label class="col-sm-3">{{ "ByDate"|get_lang }}</label>
-                                <div class="col-sm-9">
+                                <div class="col-sm-12">
+                                    <input type="hidden" name="sec_token" value="{{ search_token }}">
+                                    <input type="hidden" name="search_course" value="1" />
                                     <div class="input-group">
-                                        <input type="date" name="date" id="date" class="form-control" value="{{ search_date }}" readonly>
-                                    <span class="input-group-btn">
-                                        <button class="btn btn-default" type="submit"><i class="fa fa-search"></i> {{ 'Search'|get_lang }}</button>
-                                    </span>
+                                        <input type="text" name="search_term" class="form-control" />
+                                        <span class="input-group-btn">
+                                            <button class="btn btn-default" type="submit"><i class="fa fa-search"></i> {{ 'Search'|get_lang }}</button>
+                                        </span>
                                     </div>
                                 </div>
                             </div>
                         </form>
-                    </div>
-                    <div class="col-md-6">
-                        <form class="form-horizontal" method="post" action="{{ _p.web_self }}?action=search_tag">
-                            <div class="form-group">
-                                <label class="col-sm-4">{{ "ByTag"|get_lang }}</label>
-                                <div class="col-sm-8">
-                                    <div class="input-group">
-                                        <input type="text" name="search_tag" class="form-control" value="{{ search_tag }}" />
-                                    <span class="input-group-btn">
-                                        <button class="btn btn-default" type="submit"><i class="fa fa-search"></i> {{ 'Search'|get_lang }}</button>
-                                    </span>
+                    {% endif %}
+                </div>
+            {% endif %}
+
+            <div class="col-md-8">
+                {% if show_sessions %}
+                    <div class="section-tile">{{ 'Sessions'|get_lang }}</div>
+
+                    <div class="row">
+                        <div class="col-md-6">
+                            <form class="form-horizontal" method="post" action="{{ _p.web_self }}?action=display_sessions">
+                                <div class="form-group">
+                                    <label class="col-sm-3">{{ "ByDate"|get_lang }}</label>
+                                    <div class="col-sm-9">
+                                        <div class="input-group">
+                                            <input type="date" name="date" id="date" class="form-control" value="{{ search_date }}" readonly>
+                                            <span class="input-group-btn">
+                                                <button class="btn btn-default" type="submit"><i class="fa fa-search"></i> {{ 'Search'|get_lang }}</button>
+                                            </span>
+                                        </div>
                                     </div>
                                 </div>
-                            </div>
-                        </form>
+                            </form>
+                        </div>
+                        <div class="col-md-6">
+                            <form class="form-horizontal" method="post" action="{{ _p.web_self }}?action=search_tag">
+                                <div class="form-group">
+                                    <label class="col-sm-4">{{ "ByTag"|get_lang }}</label>
+                                    <div class="col-sm-8">
+                                        <div class="input-group">
+                                            <input type="text" name="search_tag" class="form-control" value="{{ search_tag }}" />
+                                            <span class="input-group-btn">
+                                                <button class="btn btn-default" type="submit"><i class="fa fa-search"></i> {{ 'Search'|get_lang }}</button>
+                                            </span>
+                                        </div>
+                                    </div>
+                                </div>
+                            </form>
+                        </div>
                     </div>
-                </div>
-
                 {% endif %}
             </div>
         </div>
-
-
     </div>
-<section id="session-list">
-    <div class="col-md-12">
-        <div class="row">
-            {% for session in sessions %}
-            <div class="col-md-4">
-                <div class="item-content" id="session-{{ session.id }}">
-                    <div class="img-session">{{ session.extra_field.image }}</div>
-                    <div class="title-session"><h3>{{ session.name }}</h3></div>
-                    <div class="author-session">
-                        <i class="fa fa-user"></i>
-                        {{ session.coach_name }}
-                    </div>
-                    <div class="date-session">
-                        <i class="fa fa-calendar-o"></i>
-                        {{ session.date }}
-                    </div>
-                    <div class="tags-session">
-                        <i class="fa fa-tags"></i>
-                    </div>
-                    <div class="requirements">
-                    {% if session.requirements %}
-                    <h4>{{ 'Requirements'|get_lang }}</h4>
-                    <p>
-                        {% for requirement in session.requirements %}
-                        {{ requirement.name  }}
-                        {% endfor %}
-                    </p>
-                    {% endif %}
 
-                    {% if session.dependencies %}
-                    <h4>{{ 'Dependencies'|get_lang }}</h4>
-                    <p>
-                        {% for dependency in session.dependencies %}
-                        {{ dependency.name  }}
-                        {% endfor %}
-                    </p>
+    <section id="session-list">
+        <div class="col-md-12">
+            <div class="row">
+                {% for session in sessions %}
+                    <div class="col-md-4">
+                        <div class="thumbnail" id="session-{{ session.id }}">
+                            <img src="{{ session.image ? _p.web_upload ~ session.image : _p.web_img ~ 'session_default.png' }}">
+                            <h3 class="title-session">{{ session.name }}</h3>
+                            <ul class="list-unstyled">
+                                {% if show_tutor %}
+                                    <li class="author-session">
+                                        <i class="fa fa-user"></i> {{ session.coach_name }}
+                                    </li>
+                                {% endif %}
+                                <li class="date-session">
+                                    <i class="fa fa-calendar-o"></i> {{ session.date }}
+                                </li>
+                                {% if session.tags %}
+                                    <li class="tags-session">
+                                        <i class="fa fa-tags"></i> {{ session.tags|join(', ')}}
+                                    </li>
+                                {% endif %}
+                            </ul>
+                            <div class="requirements">
+                                {% if session.requirements %}
+                                    <h4>{{ 'Requirements'|get_lang }}</h4>
+                                    <p>
+                                        {% for requirement in session.requirements %}
+                                            {{ requirement.name  }}
+                                        {% endfor %}
+                                    </p>
+                                {% endif %}
+
+                                {% if session.dependencies %}
+                                    <h4>{{ 'Dependencies'|get_lang }}</h4>
+                                    <p>
+                                        {% for dependency in session.dependencies %}
+                                            {{ dependency.name  }}
+                                        {% endfor %}
+                                    </p>
+                                {% endif %}
+                            </div>
+                            <div class="options">
+                                <p>
+                                    <a href="{{ _p.web ~ 'session/' ~ session.id ~ '/about/' }}" class="btn btn-block btn-info">
+                                        <i class="fa fa-info-circle"></i> {{ "SeeInformation"|get_lang }}
+                                    </a>
+                                </p>
+                                <p class="buttom-subscribed">
+                                    {% if session.is_subscribed %}
+                                        {{ already_subscribed_label }}
+                                    {% else %}
+                                        {{ session.subscribe_button }}
+                                    {% endif %}
+                                </p>
+                            </div>
+                        </div>
                     </div>
-                    {% endif %}
-                    <div class="options">
-                        <a href="{{ _p.web ~ 'session/' ~ session.id ~ '/about/' }}" class="btn btn-block btn-info">
-                            <i class="fa fa-info-circle"></i> {{ "SeeInformation"|get_lang }}
-                        </a>
-                        <div class="buttom-subscribed">
-                            {% if session.is_subscribed %}
-                            {{ already_subscribed_label }}
-                            {% else %}
-                            {{ session.subscribe_button }}
-                            {% endif %}
+                {% else %}
+                    <div class="col-xs-12">
+                        <div class="alert alert-warning">
+                            {{ 'NoResults'|get_lang }}
                         </div>
                     </div>
-                </div>
-            </div></div>
-            {% endfor %}
+                {% endfor %}
+            </div>
+        </div>
+    </section>
+
+    {{ catalog_pagination }}
 
-    </div>
-        {{ catalog_pagination }}
-    </div>
-</section>
-<!-- end view catalog session -->
 {% endblock %}