diff --git a/assets/js/app.js b/assets/js/app.js index b2ed42f3f5..340e48f81c 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -14,7 +14,7 @@ const locale = document.querySelector('html').lang; const moment = require('moment'); global.moment = moment; require('select2/dist/js/select2.full.min'); -require("flatpickr"); +require('flatpickr'); //import('bootstrap-vue'); import('bootstrap'); require('bootstrap-daterangepicker'); diff --git a/assets/js/vendor.js b/assets/js/vendor.js index 97a76ef6c7..9568b4c652 100644 --- a/assets/js/vendor.js +++ b/assets/js/vendor.js @@ -1,4 +1,3 @@ - // require('mediaelement'); // import('multiselect-two-sides'); // require('@fortawesome/fontawesome-free'); diff --git a/assets/vue/App.vue b/assets/vue/App.vue index b27048982b..3b94d68f84 100644 --- a/assets/vue/App.vue +++ b/assets/vue/App.vue @@ -20,6 +20,19 @@ + + + + + + + + + + + + +
({ drawer: true, breadcrumb: [], + languageArray: ['en', 'fr'], courses: [ ['Courses', 'mdi-book', 'CourseList'], ['Courses category', 'mdi-book', 'CourseCategoryList'], diff --git a/assets/vue/components/layout/Sidebar.vue b/assets/vue/components/layout/Sidebar.vue index 2dffe5b01a..44709729e3 100644 --- a/assets/vue/components/layout/Sidebar.vue +++ b/assets/vue/components/layout/Sidebar.vue @@ -12,10 +12,10 @@ class="d-sm-none bg-dark text-light" > - Login + {{ $t('Login') }} - Register + {{ $t('Register') }} @@ -30,20 +30,20 @@ class="d-sm-none bg-dark text-light" > - Inbox + {{ $t('Inbox') }} - Profile + {{ $t('Profile') }} - Logout + {{ $t('Logout') }} - Home + {{ $t('Home') }} @@ -52,12 +52,12 @@ - Courses + {{ $t('Courses') }} - Sessions + {{ $t('Sessions') }} @@ -65,27 +65,27 @@ diff --git a/assets/vue/main.js b/assets/vue/main.js index eea9d578f5..cba556b931 100644 --- a/assets/vue/main.js +++ b/assets/vue/main.js @@ -1,7 +1,8 @@ -import Vue from "vue"; -import App from "./App"; -import router from "./router"; -import store from "./store"; +import Vue from 'vue'; +import App from './App'; +import i18n from './i18n'; +import router from './router'; +import store from './store'; import courseCategoryService from './services/coursecategory'; import documentsService from './services/documents'; import courseService from './services/course'; @@ -9,12 +10,11 @@ import resourceLinkService from './services/resourcelink'; import resourceNodeService from './services/resourcenode'; import makeCrudModule from './store/modules/crud'; -//import vuetify from './plugins/vuetify'; // path to vuetify export require('@fancyapps/fancybox'); require('@fancyapps/fancybox/dist/jquery.fancybox.css'); - import Vuelidate from 'vuelidate'; -import i18n from './i18n'; + + /* import VueApollo from 'vue-apollo'; import ApolloClient from 'apollo-boost'; @@ -99,7 +99,6 @@ store.registerModule( if (document.getElementById('app')) { new Vue({ - //vuetify, i18n, components: {App}, //apolloProvider, @@ -109,5 +108,5 @@ if (document.getElementById('app')) { mounted() { }, render: h => h(App) - }).$mount("#app"); + }).$mount('#app'); } diff --git a/assets/vue/router/index.js b/assets/vue/router/index.js index 6602e3d274..d32f0c1f1b 100644 --- a/assets/vue/router/index.js +++ b/assets/vue/router/index.js @@ -1,29 +1,30 @@ -import Vue from "vue"; -import VueRouter from "vue-router"; +import Vue from 'vue'; +import VueRouter from 'vue-router'; +import i18n from '../i18n'; Vue.use(VueRouter); import courseRoutes from './course'; import courseCategoryRoutes from './coursecategory'; import documents from './documents'; -import store from "../store"; -import Login from "../views/Login"; -//import Legacy from "../views/Legacy"; -import Home from "../views/Home"; -import MyCourseList from "../views/user/courses/List"; -import MySessionList from "../views/user/sessions/List"; +import store from '../store'; +import Login from '../views/Login'; +//import Legacy from '../views/Legacy'; +import Home from '../views/Home'; +import MyCourseList from '../views/user/courses/List'; +import MySessionList from '../views/user/sessions/List'; let router = new VueRouter({ - mode: "history", + mode: 'history', routes: [ - {path: "/", name: "Index"}, - {path: "/login", name: "Login", component: Login}, + {path: '/', name: 'Index'}, + {path: '/login', name: i18n.t('Login'), component: Login}, { - path: "/courses", name: "MyCourses", component: MyCourseList, + path: '/courses', name: i18n.t('My courses'), component: MyCourseList, meta: {requiresAuth: true}, }, { - path: "/sessions", name: "MySessions", component: MySessionList, + path: '/sessions', name: i18n.t('My sessions'), component: MySessionList, meta: {requiresAuth: true}, }, courseRoutes, @@ -36,11 +37,11 @@ router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { // this route requires auth, check if logged in // if not, redirect to login page. - if (store.getters["security/isAuthenticated"]) { + if (store.getters['security/isAuthenticated']) { next(); } else { next({ - path: "/login", + path: '/login', query: {redirect: to.fullPath}, }); } diff --git a/psalm.xml b/psalm.xml index 02e2239edf..cfdc48ad3a 100644 --- a/psalm.xml +++ b/psalm.xml @@ -54,6 +54,8 @@ + + @@ -68,9 +70,12 @@ + + + diff --git a/public/main/inc/global.inc.php b/public/main/inc/global.inc.php index 57b7deaaae..dd443f8cee 100644 --- a/public/main/inc/global.inc.php +++ b/public/main/inc/global.inc.php @@ -46,14 +46,14 @@ try { $router->setContext($context); /** @var FlashBag $flashBag */ - $flashBag = $container->get('session')->getFlashBag(); $saveFlashBag = null; + $flashBag = $container->get('session')->getFlashBag(); if (!empty($flashBag->keys())) { $saveFlashBag = $flashBag->all(); } $response = $kernel->handle($request); - //$context = Container::getRouter()->getContext(); + $context = Container::getRouter()->getContext(); $pos = strpos($currentBaseUrl, 'main'); if (false === $pos) { diff --git a/public/main/inc/lib/agenda.lib.php b/public/main/inc/lib/agenda.lib.php index 931e34ee73..2a95515c71 100644 --- a/public/main/inc/lib/agenda.lib.php +++ b/public/main/inc/lib/agenda.lib.php @@ -2247,13 +2247,12 @@ class Agenda } /** - * @param FormValidator $form - * @param CGroup[] $groupList - * @param array $userList - * @param array $sendTo array('users' => [1, 2], 'groups' => [3, 4]) - * @param array $attributes - * @param bool $addOnlyItemsInSendTo - * @param bool $required + * @param CGroup[] $groupList + * @param array $userList + * @param array $sendTo array('users' => [1, 2], 'groups' => [3, 4]) + * @param array $attributes + * @param bool $addOnlyItemsInSendTo + * @param bool $required */ public function setSendToSelect( FormValidator $form, diff --git a/public/main/inc/lib/api.lib.php b/public/main/inc/lib/api.lib.php index e8a1f91a53..fd065a1d8e 100644 --- a/public/main/inc/lib/api.lib.php +++ b/public/main/inc/lib/api.lib.php @@ -2214,14 +2214,14 @@ function api_remove_in_gradebook() * If the course_code is given, the returned array gives info about that * particular course, if none given it gets the course info from the session. * - * @param string $course_code + * @param string $courseCode * * @return array */ -function api_get_course_info($course_code = null) +function api_get_course_info($courseCode = null) { - if (!empty($course_code)) { - $course = Container::getCourseRepository()->findOneByCode($course_code); + if (!empty($courseCode)) { + $course = Container::getCourseRepository()->findOneByCode($courseCode); return api_format_course_array($course); } @@ -2386,7 +2386,8 @@ function api_format_course_array(Course $course = null) $courseData['legal'] = $course->getLegal(); $courseData['show_score'] = $course->getShowScore(); //used in the work tool - $coursePath = api_get_path(WEB_COURSE_PATH); + //$coursePath = api_get_path(WEB_COURSE_PATH); + $coursePath = '/course/'; $webCourseHome = $coursePath.$courseData['real_id'].'/home'; // Course password diff --git a/public/main/inc/lib/course.lib.php b/public/main/inc/lib/course.lib.php index 00c57c3a55..f294863306 100644 --- a/public/main/inc/lib/course.lib.php +++ b/public/main/inc/lib/course.lib.php @@ -2369,7 +2369,7 @@ class CourseManager * Get the list of groups from the course. * * @param string $course_code - * @param int $session_id Session ID (optional) + * @param int $session_id Session ID (optional) * @param int $getEmptyGroups get empty groups (optional) * * @return CGroup[] @@ -2400,7 +2400,7 @@ class CourseManager /** @var CGroup $group */ foreach ($groups as $group) { if (0 === $getEmptyGroups) { - if (!$group->hasMembers()){ + if (!$group->hasMembers()) { continue; } } diff --git a/public/main/inc/lib/display.lib.php b/public/main/inc/lib/display.lib.php index 703d33df84..687aa3013a 100644 --- a/public/main/inc/lib/display.lib.php +++ b/public/main/inc/lib/display.lib.php @@ -4,6 +4,7 @@ use Chamilo\CoreBundle\Component\Utils\ChamiloApi; use Chamilo\CoreBundle\Entity\ExtraField; +use Chamilo\CoreBundle\Entity\ExtraFieldValues; use Chamilo\CoreBundle\Framework\Container; use ChamiloSession as Session; use Symfony\Component\HttpFoundation\Response; @@ -121,13 +122,18 @@ class Display $response = new Response(); $params['content'] = $contents; global $interbreadcrumb, $htmlHeadXtra; + + $courseInfo = api_get_course_info(); + if (!empty($courseInfo)) { + array_unshift( + $interbreadcrumb, + ['name' => $courseInfo['title'], 'url' => $courseInfo['course_public_url']] + ); + } + $params['legacy_javascript'] = $htmlHeadXtra; $params['legacy_breadcrumb'] = $interbreadcrumb; - $flash = self::getFlashToString(); - self::cleanFlashMessages(); - //$params['flash_messages'] = $flash; - Template::setVueParams($params); $content = Container::getTemplating()->render($tpl, $params); $response->setContent($content); @@ -154,10 +160,6 @@ class Display $params['legacy_javascript'] = $htmlHeadXtra; $params['legacy_breadcrumb'] = $interbreadcrumb; - $flash = Display::getFlashToString(); - Display::cleanFlashMessages(); - $params['flash_messages'] = $flash; - $content = Container::getTemplating()->render($tpl, $params); $response->setContent($content); $response->send(); @@ -987,7 +989,7 @@ class Display * @param int $default * @param array $extra_attributes * @param bool $show_blank_item - * @param null $blank_item_text + * @param string $blank_item_text * * @return string */ @@ -1065,7 +1067,7 @@ class Display * @param string $id id of the container of the tab in the example "tabs" * @param array $attributes for the ul * @param array $ul_attributes - * @param int $selected + * @param string $selected * * @return string */ @@ -1700,6 +1702,8 @@ class Display /** * Get the session box details as an array. * + * @todo check session visibility. + * * @param int $session_id * * @return array Empty array or session array @@ -1707,84 +1711,75 @@ class Display */ public static function getSessionTitleBox($session_id) { - global $nosession; - - if (!$nosession) { - global $now, $date_start, $date_end; - } - $output = []; - if (!$nosession) { - $session_info = api_get_session_info($session_id); - $coachInfo = []; - if (!empty($session['id_coach'])) { - $coachInfo = api_get_user_info($session['id_coach']); + $session_info = api_get_session_info($session_id); + $coachInfo = []; + if (!empty($session_info['id_coach'])) { + $coachInfo = api_get_user_info($session_info['id_coach']); + } + + $session = []; + $session['category_id'] = $session_info['session_category_id']; + $session['title'] = $session_info['name']; + $session['coach_id'] = $session['id_coach'] = $session_info['id_coach']; + $session['dates'] = ''; + $session['coach'] = ''; + if ('true' === api_get_setting('show_session_coach') && isset($coachInfo['complete_name'])) { + $session['coach'] = get_lang('General coach').': '.$coachInfo['complete_name']; + } + $active = false; + if (('0000-00-00 00:00:00' == $session_info['access_end_date'] && + '0000-00-00 00:00:00' == $session_info['access_start_date']) || + (empty($session_info['access_end_date']) && empty($session_info['access_start_date'])) + ) { + if (isset($session_info['duration']) && !empty($session_info['duration'])) { + $daysLeft = SessionManager::getDayLeftInSession($session_info, api_get_user_id()); + $session['duration'] = $daysLeft >= 0 + ? sprintf(get_lang('This session has a maximum duration. Only %s days to go.'), $daysLeft) + : get_lang('You are already registered but your allowed access time has expired.'); } - - $session = []; - $session['category_id'] = $session_info['session_category_id']; - $session['title'] = $session_info['name']; - $session['coach_id'] = $session['id_coach'] = $session_info['id_coach']; - $session['dates'] = ''; - $session['coach'] = ''; + $active = true; + } else { + $dates = SessionManager::parseSessionDates($session_info, true); + $session['dates'] = $dates['access']; if ('true' === api_get_setting('show_session_coach') && isset($coachInfo['complete_name'])) { - $session['coach'] = get_lang('General coach').': '.$coachInfo['complete_name']; + $session['coach'] = $coachInfo['complete_name']; } + //$active = $date_start <= $now && $date_end >= $now; + } + $session['active'] = $active; + $session['session_category_id'] = $session_info['session_category_id']; + $session['visibility'] = $session_info['visibility']; + $session['num_users'] = $session_info['nbr_users']; + $session['num_courses'] = $session_info['nbr_courses']; + $session['description'] = $session_info['description']; + $session['show_description'] = $session_info['show_description']; + //$session['image'] = SessionManager::getSessionImage($session_info['id']); + $session['url'] = api_get_path(WEB_CODE_PATH).'session/index.php?session_id='.$session_info['id']; + + $entityManager = Database::getManager(); + $fieldValuesRepo = $entityManager->getRepository(ExtraFieldValues::class); + $extraFieldValues = $fieldValuesRepo->getVisibleValues( + ExtraField::SESSION_FIELD_TYPE, + $session_id + ); - if (('0000-00-00 00:00:00' == $session_info['access_end_date'] && - '0000-00-00 00:00:00' == $session_info['access_start_date']) || - (empty($session_info['access_end_date']) && empty($session_info['access_start_date'])) - ) { - if (isset($session_info['duration']) && !empty($session_info['duration'])) { - $daysLeft = SessionManager::getDayLeftInSession($session_info, api_get_user_id()); - $session['duration'] = $daysLeft >= 0 - ? sprintf(get_lang('This session has a maximum duration. Only %s days to go.'), $daysLeft) - : get_lang('You are already registered but your allowed access time has expired.'); - } - $active = true; - } else { - $dates = SessionManager::parseSessionDates($session_info, true); - $session['dates'] = $dates['access']; - if ('true' === api_get_setting('show_session_coach') && isset($coachInfo['complete_name'])) { - $session['coach'] = $coachInfo['complete_name']; - } - $active = $date_start <= $now && $date_end >= $now; - } - $session['active'] = $active; - $session['session_category_id'] = $session_info['session_category_id']; - $session['visibility'] = $session_info['visibility']; - $session['num_users'] = $session_info['nbr_users']; - $session['num_courses'] = $session_info['nbr_courses']; - $session['description'] = $session_info['description']; - $session['show_description'] = $session_info['show_description']; - //$session['image'] = SessionManager::getSessionImage($session_info['id']); - $session['url'] = api_get_path(WEB_CODE_PATH).'session/index.php?session_id='.$session_info['id']; - - $entityManager = Database::getManager(); - $fieldValuesRepo = $entityManager->getRepository('ChamiloCoreBundle:ExtraFieldValues'); - $extraFieldValues = $fieldValuesRepo->getVisibleValues( - ExtraField::SESSION_FIELD_TYPE, - $session_id - ); - - $session['extra_fields'] = []; - /** @var \Chamilo\CoreBundle\Entity\ExtraFieldValues $value */ - foreach ($extraFieldValues as $value) { - if (empty($value)) { - continue; - } - $session['extra_fields'][] = [ - 'field' => [ - 'variable' => $value->getField()->getVariable(), - 'display_text' => $value->getField()->getDisplayText(), - ], - 'value' => $value->getValue(), - ]; + $session['extra_fields'] = []; + /** @var ExtraFieldValues $value */ + foreach ($extraFieldValues as $value) { + if (empty($value)) { + continue; } - - $output = $session; + $session['extra_fields'][] = [ + 'field' => [ + 'variable' => $value->getField()->getVariable(), + 'display_text' => $value->getField()->getDisplayText(), + ], + 'value' => $value->getValue(), + ]; } - return $output; + + return $session; } /** @@ -2420,38 +2415,6 @@ class Display } } - /** - * @return string - */ - public static function getFlashToString() - { - $messages = Session::read('flash_messages'); - $messageToString = ''; - if (!empty($messages)) { - foreach ($messages as $message) { - $messageToString .= $message; - } - } - - return $messageToString; - } - - /** - * Shows the message from the session. - */ - public static function showFlash() - { - echo self::getFlashToString(); - } - - /** - * Destroys the message session. - */ - public static function cleanFlashMessages() - { - Session::erase('flash_messages'); - } - /** * Get the profile edition link for a user. * diff --git a/public/main/inc/lib/template.lib.php b/public/main/inc/lib/template.lib.php index 797a7134b1..07a549898a 100644 --- a/public/main/inc/lib/template.lib.php +++ b/public/main/inc/lib/template.lib.php @@ -2,6 +2,7 @@ /* For licensing terms, see /license.txt */ +use Chamilo\CoreBundle\Component\Utils\ChamiloApi; use Chamilo\CoreBundle\Entity\SessionRelCourseRelUser; use Chamilo\CoreBundle\Entity\User; use Chamilo\CoreBundle\Framework\Container; @@ -176,7 +177,6 @@ class Template * Render the template. * * @param string $template The template path - * @param bool $clearFlashMessages Clear the $_SESSION variables for flash messages */ public function display($template) { @@ -695,10 +695,7 @@ class Template */ public function returnResponse($params, $template) { - $flash = Display::getFlashToString(); - Display::cleanFlashMessages(); $response = new Response(); - $params['flash_messages'] = $flash; $content = Container::getTemplating()->render($template, $params); $response->setContent($content); $response->send(); @@ -875,13 +872,14 @@ class Template 'icon' => 'user fa-fw', 'placeholder' => get_lang('Username'), ]; - $browserAutoCapitalize = false; + // Avoid showing the autocapitalize option if the browser doesn't // support it: this attribute is against the HTML5 standard + /*$browserAutoCapitalize = false; if (api_browser_support('autocapitalize')) { $browserAutoCapitalize = false; $params['autocapitalize'] = 'none'; - } + }*/ $form->addText( '_username', get_lang('Username'), @@ -893,9 +891,9 @@ class Template 'icon' => 'lock fa-fw', 'placeholder' => get_lang('Pass'), ]; - if ($browserAutoCapitalize) { + /*if ($browserAutoCapitalize) { $params['autocapitalize'] = 'none'; - } + }*/ $form->addElement( 'password', '_password', @@ -1234,15 +1232,15 @@ class Template $this->assign('title_string', $title_string); // Setting the theme and CSS files - $this->setCssFiles(); + //$this->setCssFiles(); $this->set_js_files(); $this->setCssCustomFiles(); - $browser = api_browser_support('check_browser'); + /*$browser = api_browser_support('check_browser'); if ('Internet Explorer' == $browser[0] && $browser[1] >= '11') { $browser_head = ''; $this->assign('browser_specific_head', $browser_head); - } + }*/ // Implementation of prefetch. // See http://cdn.chamilo.org/main/img/online.png for details @@ -1590,8 +1588,7 @@ class Template } } elseif (0 !== $sessionId) { // If we are on a session "about" screen, publish info about the session - $em = Database::getManager(); - $session = $em->find('ChamiloCoreBundle:Session', $sessionId); + $session = api_get_session_entity($sessionId); $socialMeta .= ''."\n"; $socialMeta .= ''."\n"; diff --git a/src/CoreBundle/Resources/views/Layout/base-layout.html.twig b/src/CoreBundle/Resources/views/Layout/base-layout.html.twig index 118c9f3bd9..331a7b61ec 100644 --- a/src/CoreBundle/Resources/views/Layout/base-layout.html.twig +++ b/src/CoreBundle/Resources/views/Layout/base-layout.html.twig @@ -18,9 +18,6 @@ data-in-course="{{ course ? 'true' : 'false' }}" data-course-code="{{ course ? course.code : '' }}" data-session-id="{{ session ? session.id : '' }}" -{# {% if legacy_breadcrumb is defined %}#} -{# data-breadcrumb="{{ legacy_breadcrumb | json_encode() }}"#} -{# {% endif %}#} > {% block chamilo_wrap %} diff --git a/src/CoreBundle/Resources/views/Layout/breadcrumb.html.twig b/src/CoreBundle/Resources/views/Layout/breadcrumb.html.twig deleted file mode 100644 index 50efe39a0f..0000000000 --- a/src/CoreBundle/Resources/views/Layout/breadcrumb.html.twig +++ /dev/null @@ -1,34 +0,0 @@ -{% autoescape false %} - {% if legacy_breadcrumb is not defined %} - {% set legacy_breadcrumb = '' %} - {% endif %} - -{# {% if legacy_breadcrumb %}#} -{# #} -{# {% endif %}#} - - {# course and session variables are set in the src/CourseBundle/EventListener/CourseListener.php #} -{# {{#} -{# sonata_block_render_event(#} -{# 'breadcrumb',#} -{# {#} -{# 'context': 'chamilo_core.block.breadcrumb',#} -{# 'course': course,#} -{# 'session': session,#} -{# 'legacy_breadcrumb': legacy_breadcrumb,#} -{# 'current_uri': app.request.requestUri#} -{# }#} -{# )#} -{# }}#} -{% endautoescape %} -