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 @@
- Administration
+ {{ $t('Administration') }}
- Users
+ {{ $t('Users') }}
- Courses
+ {{ $t('Courses') }}
- Sessions
+ {{ $t('Sessions') }}
- Settings
+ {{ $t('Administration') }}
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 %}
-