From 05e6ff8f9bc16ee6a717accfff8d1812b41f0b4f Mon Sep 17 00:00:00 2001 From: F TEMPEZ Date: Thu, 18 Apr 2024 14:52:13 +0200 Subject: [PATCH 01/10] init --- core/class/layout.class.php | 8 ++++---- core/module/page/page.php | 32 ++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/core/class/layout.class.php b/core/class/layout.class.php index 71bf0d8..7b7d22f 100644 --- a/core/class/layout.class.php +++ b/core/class/layout.class.php @@ -1001,7 +1001,7 @@ class layout extends common // Bouton Ajouter une page if ($this->getUser('permission', 'page', 'add')) { $leftItems .= '
  • ' . template::ico('plus', [ - 'href' => helper::baseUrl() . 'page/add', + 'href' => helper::baseUrl() . 'page/add/' . self::$siteContent, 'help' => 'Nouvelle page ou barre latérale' ]) . '
  • '; } @@ -1020,7 +1020,7 @@ class layout extends common // Bouton Editer une page if ($this->getUser('permission', 'page', 'edit')) { $leftItems .= '
  • ' . template::ico('pencil', [ - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'help' => 'Éditer la page' ]) . '
  • '; } @@ -1039,7 +1039,7 @@ class layout extends common $this->getUser('permission', 'page', 'duplicate') ) { $leftItems .= '
  • ' . template::ico('clone', [ - 'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(0) . '/' . self::$siteContent, 'help' => 'Dupliquer la page' ]) . '
  • '; @@ -1049,7 +1049,7 @@ class layout extends common $this->getUser('permission', 'page', 'delete') ) { $leftItems .= '
  • ' . template::ico('trash', [ - 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(0) . '/' . self::$siteContent, 'help' => 'Supprimer la page', 'id' => 'pageDelete' ]) diff --git a/core/module/page/page.php b/core/module/page/page.php index b0f18ae..b18c964 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -89,9 +89,12 @@ class page extends common $page = $this->getUrl(2); // La page n'existe pas if ( - $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || - $this->getData(['page', $page]) === null - ) { + $this->getUser('permission', __CLASS__, __FUNCTION__) !== true + || $this->getData(['page', $page]) === null + || $this->getUrl(3) != self::$siteContent + + ) { + // Valeurs en sortie $this->addOutput([ 'access' => false @@ -131,7 +134,10 @@ class page extends common */ public function add() { - if ($this->getUser('permission', __CLASS__, __FUNCTION__) !== true) { + if ( + $this->getUser('permission', __CLASS__, __FUNCTION__) !== true + || $this->getUrl(2) != self::$siteContent + ) { // Valeurs en sortie $this->addOutput([ 'access' => false @@ -202,8 +208,9 @@ class page extends common $page = $this->getUrl(2); // La page n'existe pas if ( - $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || - $this->getData(['page', $page]) === null + $this->getUser('permission', __CLASS__, __FUNCTION__) !== true + || $this->getData(['page', $page]) === null + || $this->getUrl(3) != self::$siteContent ) { // Valeurs en sortie $this->addOutput([ @@ -215,9 +222,9 @@ class page extends common // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . $this->homePageId(), - 'notification' => self::$siteContent === 'home' - ? helper::translate('Suppression interdite, cette page est définie comme page d\'accueil du site') - : helper::translate('Suppression interdite, cette page est définie comme page d\'accueil d\'un espace') + 'notification' => self::$siteContent === 'home' + ? helper::translate('Suppression interdite, cette page est définie comme page d\'accueil du site') + : helper::translate('Suppression interdite, cette page est définie comme page d\'accueil d\'un espace') ]); } // Impossible de supprimer la page affectée @@ -306,8 +313,9 @@ class page extends common { // La page n'existe pas if ( - $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || - $this->getData(['page', $this->getUrl(2)]) === null + $this->getUser('permission', __CLASS__, __FUNCTION__) !== true + || $this->getData(['page', $this->getUrl(2)]) === null + || $this->getUrl(3) != self::$siteContent ) { // Valeurs en sortie $this->addOutput([ @@ -691,7 +699,7 @@ class page extends common { $p = $this->getData(['page']); $d = array_map(function ($d) { - unset($d["css"], $d["js"]); + unset ($d["css"], $d["js"]); return $d; }, $p); return json_encode($d); From 0da23149db80073fa4d42a684e1464a45a74f26f Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 22 Apr 2024 15:40:35 +0200 Subject: [PATCH 02/10] =?UTF-8?q?2.0.0=20corrige=20le=20warning=20blog=20v?= =?UTF-8?q?ide=20+=20transmet=20tn=20param=C3=A8tre=20s=C3=A9curisant=20l'?= =?UTF-8?q?=C3=A9dition=20des=20espaces=20dans=20plusieurs=20onglets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/router.class.php | 8 -------- core/core.php | 5 +++-- core/module/page/page.php | 11 +++++------ core/module/page/view/cssEditor/cssEditor.php | 2 +- core/module/page/view/edit/edit.php | 4 ++-- core/module/page/view/jsEditor/jsEditor.php | 2 +- module/blog/view/config/config.php | 2 +- module/form/view/config/config.php | 2 +- module/gallery/view/config/config.php | 2 +- module/news/view/config/config.php | 2 +- module/redirection/view/config/config.php | 2 +- module/redirection/view/index/index.js.php | 2 +- module/search/view/config/config.php | 2 +- module/slider/view/config/config.php | 2 +- module/suscribe/view/config/config.php | 2 +- module/workshop/view/config/config.php | 2 +- 16 files changed, 22 insertions(+), 30 deletions(-) diff --git a/core/class/router.class.php b/core/class/router.class.php index 3d6e3ca..7c7860b 100644 --- a/core/class/router.class.php +++ b/core/class/router.class.php @@ -422,14 +422,6 @@ class core extends common || $this->getUser('id') !== $this->getData(['course', self::$siteContent, 'author']) ) ) { - // Stocke l'historique des pages vues - /* - $data = is_array($this->getData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0)])) - ? array_merge([time()], $this->getData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0)])) - : [time()]; - - $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0), $data]); - */ // Stocke la dernière page vue et sa date de consultation $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]); $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'datePageView', time()]); diff --git a/core/core.php b/core/core.php index e062841..3cb6840 100644 --- a/core/core.php +++ b/core/core.php @@ -1105,8 +1105,9 @@ class common } // Articles du blog if ( - $this->getData(['page', $parentPageId, 'moduleId']) === 'blog' && - !empty($this->getData(['module', $parentPageId])) + $this->getData(['page', $parentPageId, 'moduleId']) === 'blog' + && !empty($this->getData(['module', $parentPageId])) + && $this->getData(['module', $parentPageId, 'posts']) ) { foreach ($this->getData(['module', $parentPageId, 'posts']) as $articleId => $article) { if ($this->getData(['module', $parentPageId, 'posts', $articleId, 'state']) === true) { diff --git a/core/module/page/page.php b/core/module/page/page.php index b18c964..aa88845 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -93,8 +93,7 @@ class page extends common || $this->getData(['page', $page]) === null || $this->getUrl(3) != self::$siteContent - ) { - + ) { // Valeurs en sortie $this->addOutput([ 'access' => false @@ -121,7 +120,7 @@ class page extends common // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'page/edit/' . $pageId, + 'redirect' => helper::baseUrl() . 'page/edit/' . $pageId . '/' . self::$siteContent, 'notification' => $notification, 'state' => true ]); @@ -271,7 +270,7 @@ class page extends common elseif ($this->getHierarchy($page, null)) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'page/edit/' . $page, + 'redirect' => helper::baseUrl() . 'page/edit/' . $page . '/' . self::$siteContent, 'notification' => helper::translate('Impossible de supprimer une page contenant des pages enfants') ]); } @@ -642,7 +641,7 @@ class page extends common // Valeurs en sortie $this->addOutput([ 'notification' => helper::translate('Modifications enregistrées'), - 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2), + 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, 'state' => true ]); } @@ -677,7 +676,7 @@ class page extends common // Valeurs en sortie $this->addOutput([ 'notification' => helper::translate('Modifications enregistrées'), - 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2), + 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, 'state' => true ]); } diff --git a/core/module/page/view/cssEditor/cssEditor.php b/core/module/page/view/cssEditor/cssEditor.php index b9c62ae..a468bd3 100644 --- a/core/module/page/view/cssEditor/cssEditor.php +++ b/core/module/page/view/cssEditor/cssEditor.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index 21cd9ac..05bd890 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -19,14 +19,14 @@
    'buttonRed', - 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2), + 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '/' . self::$siteContent, 'value' => template::ico('trash'), 'help' => 'Effacer la page' ]); ?>
    helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2), + 'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '/' . self::$siteContent, 'value' => template::ico('clone'), 'help' => 'Dupliquer la page' ]); ?> diff --git a/core/module/page/view/jsEditor/jsEditor.php b/core/module/page/view/jsEditor/jsEditor.php index a14f269..a7dcf43 100644 --- a/core/module/page/view/jsEditor/jsEditor.php +++ b/core/module/page/view/jsEditor/jsEditor.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 3be3f75..d87cfea 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), 'posts', + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 08865dd..dc3520f 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -53,7 +53,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index a1f4ac2..58e89ff 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 92f7e4b..3866ccf 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),'posts', + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0). '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/redirection/view/config/config.php b/module/redirection/view/config/config.php index 9309fb0..911398f 100644 --- a/module/redirection/view/config/config.php +++ b/module/redirection/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/redirection/view/index/index.js.php b/module/redirection/view/index/index.js.php index fe572c5..061da9c 100644 --- a/module/redirection/view/index/index.js.php +++ b/module/redirection/view/index/index.js.php @@ -19,7 +19,7 @@ core.confirm( message, function() { - $(location).attr("href", "page/edit/getUrl(0); ?>"); + $(location).attr("href", "page/edit/getUrl(0) . '/' . self::$siteContent; ?>"); }, function() { $(location).attr("href", "getUrl(); ?>/force"); diff --git a/module/search/view/config/config.php b/module/search/view/config/config.php index 0f515f1..09c698f 100644 --- a/module/search/view/config/config.php +++ b/module/search/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/slider/view/config/config.php b/module/slider/view/config/config.php index f3ef50c..6a445f2 100644 --- a/module/slider/view/config/config.php +++ b/module/slider/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    diff --git a/module/suscribe/view/config/config.php b/module/suscribe/view/config/config.php index 5aa2f41..3d11892 100755 --- a/module/suscribe/view/config/config.php +++ b/module/suscribe/view/config/config.php @@ -4,7 +4,7 @@
    '', - 'href' => helper::baseUrl() .'page/edit/' . $this->getUrl(0) , + 'href' => helper::baseUrl() .'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'ico' => 'left', 'value' => 'Retour' ]); ?> diff --git a/module/workshop/view/config/config.php b/module/workshop/view/config/config.php index c25c655..91b2444 100644 --- a/module/workshop/view/config/config.php +++ b/module/workshop/view/config/config.php @@ -3,7 +3,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0) . '/' . self::$siteContent, 'value' => template::ico('left') ]); ?>
    From cfb07b81d52ba6b078f825f9989539f820deef6f Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 22 Apr 2024 21:46:41 +0200 Subject: [PATCH 03/10] Id non fourni --- core/module/page/page.php | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/core/module/page/page.php b/core/module/page/page.php index aa88845..d8007c2 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -91,9 +91,13 @@ class page extends common if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || $this->getData(['page', $page]) === null - || $this->getUrl(3) != self::$siteContent + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + || ( + $this->getUrl(3) + && $this->getUrl(3) != self::$siteContent + ) - ) { + ) { // Valeurs en sortie $this->addOutput([ 'access' => false @@ -209,7 +213,11 @@ class page extends common if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || $this->getData(['page', $page]) === null - || $this->getUrl(3) != self::$siteContent + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + || ( + $this->getUrl(3) + && $this->getUrl(3) != self::$siteContent + ) ) { // Valeurs en sortie $this->addOutput([ @@ -270,7 +278,7 @@ class page extends common elseif ($this->getHierarchy($page, null)) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'page/edit/' . $page . '/' . self::$siteContent, + 'redirect' => helper::baseUrl() . 'page/edit/' . $page . '/' . self::$siteContent, 'notification' => helper::translate('Impossible de supprimer une page contenant des pages enfants') ]); } @@ -314,7 +322,11 @@ class page extends common if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || $this->getData(['page', $this->getUrl(2)]) === null - || $this->getUrl(3) != self::$siteContent + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + || ( + $this->getUrl(3) + && $this->getUrl(3) != self::$siteContent + ) ) { // Valeurs en sortie $this->addOutput([ @@ -641,7 +653,7 @@ class page extends common // Valeurs en sortie $this->addOutput([ 'notification' => helper::translate('Modifications enregistrées'), - 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, + 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, 'state' => true ]); } @@ -676,7 +688,7 @@ class page extends common // Valeurs en sortie $this->addOutput([ 'notification' => helper::translate('Modifications enregistrées'), - 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, + 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent, 'state' => true ]); } From 3ee1398e2fc6f5cf89cd0fb4b309a082e4cfdb20 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 11:54:32 +0200 Subject: [PATCH 04/10] supprime un commentaire --- core/class/router.class.php | 1 - 1 file changed, 1 deletion(-) diff --git a/core/class/router.class.php b/core/class/router.class.php index 7c7860b..acaf31d 100644 --- a/core/class/router.class.php +++ b/core/class/router.class.php @@ -479,7 +479,6 @@ class core extends common is_array($pagesId['page']) && array_key_exists($this->getUrl(0), $pagesId['page']) ) { - //$_SESSION['ZWII_SITE_CONTENT'] = $key; header('Refresh:0; url=' . helper::baseUrl() . 'course/swap/' . $key . '/' . $this->getUrl(0)); exit(); } From b5ea22021b7740f7d95f284463f984f25bb585c9 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 11:54:50 +0200 Subject: [PATCH 05/10] redirige vers la page ouverte --- core/module/page/page.php | 58 ++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/core/module/page/page.php b/core/module/page/page.php index d8007c2..4841063 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -85,18 +85,23 @@ class page extends common */ public function duplicate() { + // La session ne correspond pas au site ouvert dans cet onglet + if ( + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + $this->getUrl(3) && $this->getUrl(3) != self::$siteContent + ) { + $_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3); + header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl()); + exit(); + } + // Adresse sans le token $page = $this->getUrl(2); + // La page n'existe pas if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || $this->getData(['page', $page]) === null - // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour - || ( - $this->getUrl(3) - && $this->getUrl(3) != self::$siteContent - ) - ) { // Valeurs en sortie $this->addOutput([ @@ -137,9 +142,18 @@ class page extends common */ public function add() { + // La session ne correspond pas au site ouvert dans cet onglet + if ( + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + $this->getUrl(3) && $this->getUrl(3) != self::$siteContent + ) { + $_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3); + header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl()); + exit(); + } + if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true - || $this->getUrl(2) != self::$siteContent ) { // Valeurs en sortie $this->addOutput([ @@ -207,17 +221,24 @@ class page extends common */ public function delete() { + + // La session ne correspond pas au site ouvert dans cet onglet + if ( + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + $this->getUrl(3) && $this->getUrl(3) != self::$siteContent + ) { + $_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3); + header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl()); + exit(); + } + // $url prend l'adresse sans le token $page = $this->getUrl(2); + // La page n'existe pas if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true || $this->getData(['page', $page]) === null - // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour - || ( - $this->getUrl(3) - && $this->getUrl(3) != self::$siteContent - ) ) { // Valeurs en sortie $this->addOutput([ @@ -318,6 +339,15 @@ class page extends common */ public function edit() { + // La session ne correspond pas au site ouvert dans cet onglet + if ( + // Contrôle la présence de l'id d'espace uniquement si l'id est fourni afin de ne pas bloquer les modules non mis à jour + $this->getUrl(3) && $this->getUrl(3) != self::$siteContent + ) { + $_SESSION['ZWII_SITE_CONTENT'] = $this->getUrl(3); + header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl()); + exit(); + } // La page n'existe pas if ( $this->getUser('permission', __CLASS__, __FUNCTION__) !== true @@ -713,7 +743,9 @@ class page extends common unset ($d["css"], $d["js"]); return $d; }, $p); - return json_encode($d); + $d = json_encode($d); + return $d; } + } \ No newline at end of file From f6c7e5f954c0de38266132841997305da7bd1c86 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 14:57:10 +0200 Subject: [PATCH 06/10] =?UTF-8?q?Dans=20router=20self=20devient=20common?= =?UTF-8?q?=20Nouveau=20routage=20en=20cas=20de=20changement=20d'espace=20?= =?UTF-8?q?en=20=C3=A9vitant=20une=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/router.class.php | 151 +++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 72 deletions(-) diff --git a/core/class/router.class.php b/core/class/router.class.php index acaf31d..91a6513 100644 --- a/core/class/router.class.php +++ b/core/class/router.class.php @@ -15,12 +15,12 @@ class core extends common } // Fuseau horaire - self::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper - date_default_timezone_set(self::$timezone); + common::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper + date_default_timezone_set(common::$timezone); // Supprime les fichiers temporaires $lastClearTmp = mktime(0, 0, 0); if ($lastClearTmp > $this->getData(['core', 'lastClearTmp']) + 86400) { - $iterator = new DirectoryIterator(self::TEMP_DIR); + $iterator = new DirectoryIterator(common::TEMP_DIR); foreach ($iterator as $fileInfos) { if ( $fileInfos->isFile() && @@ -43,11 +43,11 @@ class core extends common and $this->getData(['user']) // Pas de backup pendant l'installation ) { // Copie des fichier de données - helper::autoBackup(self::BACKUP_DIR, ['backup', 'tmp', 'file']); + helper::autoBackup(common::BACKUP_DIR, ['backup', 'tmp', 'file']); // Date du dernier backup $this->setData(['core', 'lastBackup', $lastBackup]); // Supprime les backups de plus de 30 jours - $iterator = new DirectoryIterator(self::BACKUP_DIR); + $iterator = new DirectoryIterator(common::BACKUP_DIR); foreach ($iterator as $fileInfos) { if ( $fileInfos->isFile() @@ -60,23 +60,23 @@ class core extends common } // Crée le fichier de personnalisation avancée - if (file_exists(self::DATA_DIR . 'custom.css') === false) { - file_put_contents(self::DATA_DIR . 'custom.css', ('core/module/theme/resource/custom.css')); - chmod(self::DATA_DIR . 'custom.css', 0755); + if (file_exists(common::DATA_DIR . 'custom.css') === false) { + file_put_contents(common::DATA_DIR . 'custom.css', ('core/module/theme/resource/custom.css')); + chmod(common::DATA_DIR . 'custom.css', 0755); } // Crée le fichier de personnalisation - if (file_exists(self::DATA_DIR . self::$siteContent . '/theme.css') === false) { - file_put_contents(self::DATA_DIR . self::$siteContent . '/theme.css', ''); - chmod(self::DATA_DIR . self::$siteContent . '/theme.css', 0755); + if (file_exists(common::DATA_DIR . common::$siteContent . '/theme.css') === false) { + file_put_contents(common::DATA_DIR . common::$siteContent . '/theme.css', ''); + chmod(common::DATA_DIR . common::$siteContent . '/theme.css', 0755); } // Crée le fichier de personnalisation de l'administration - if (file_exists(self::DATA_DIR . 'admin.css') === false) { - file_put_contents(self::DATA_DIR . 'admin.css', ''); - chmod(self::DATA_DIR . 'admin.css', 0755); + if (file_exists(common::DATA_DIR . 'admin.css') === false) { + file_put_contents(common::DATA_DIR . 'admin.css', ''); + chmod(common::DATA_DIR . 'admin.css', 0755); } // Check la version rafraichissement du theme - $cssVersion = preg_split('/\*+/', file_get_contents(self::DATA_DIR . self::$siteContent . '/theme.css')); + $cssVersion = preg_split('/\*+/', file_get_contents(common::DATA_DIR . common::$siteContent . '/theme.css')); if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) { // Version $css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/'; @@ -92,7 +92,7 @@ class core extends common // Fonts disponibles $fontsAvailable['files'] = $this->getData(['font', 'files']); $fontsAvailable['imported'] = $this->getData(['font', 'imported']); - $fontsAvailable['websafe'] = self::$fontsWebSafe; + $fontsAvailable['websafe'] = common::$fontsWebSafe; // Fontes installées $fonts = [ @@ -273,7 +273,7 @@ class core extends common $css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}'; // Enregistre la personnalisation - file_put_contents(self::DATA_DIR . self::$siteContent . '/theme.css', $css); + file_put_contents(common::DATA_DIR . common::$siteContent . '/theme.css', $css); // Effacer le cache pour tenir compte de la couleur de fond TinyMCE header("Expires: Tue, 01 Jan 2000 00:00:00 GMT"); @@ -284,7 +284,7 @@ class core extends common } // Check la version rafraichissement du theme admin - $cssVersion = preg_split('/\*+/', file_get_contents(self::DATA_DIR . 'admin.css')); + $cssVersion = preg_split('/\*+/', file_get_contents(common::DATA_DIR . 'admin.css')); if (empty($cssVersion[1]) or $cssVersion[1] !== md5(json_encode($this->getData(['admin'])))) { // Version @@ -293,7 +293,7 @@ class core extends common // Fonts disponibles $fontsAvailable['files'] = $this->getData(['font', 'files']); $fontsAvailable['imported'] = $this->getData(['font', 'imported']); - $fontsAvailable['websafe'] = self::$fontsWebSafe; + $fontsAvailable['websafe'] = common::$fontsWebSafe; /** * Import des polices de caractères @@ -368,7 +368,7 @@ class core extends common // Bordure du contour TinyMCE $css .= '.mce-tinymce{border: 1px solid ' . $this->getData(['admin', 'borderBlockColor']) . '!important;}'; // Enregistre la personnalisation - file_put_contents(self::DATA_DIR . 'admin.css', $css); + file_put_contents(common::DATA_DIR . 'admin.css', $css); } } /** @@ -384,8 +384,8 @@ class core extends common require 'core/module/' . $classPath; } // Module - elseif (is_readable(self::MODULE_DIR . $classPath)) { - require self::MODULE_DIR . $classPath; + elseif (is_readable(common::MODULE_DIR . $classPath)) { + require common::MODULE_DIR . $classPath; } // Librairie elseif (is_readable('core/vendor/' . $classPath)) { @@ -414,20 +414,20 @@ class core extends common // Sauvegarde la dernière page visitée par l'utilisateur connecté et enregistre l'historique des consultations if ( $this->getUser('id') - && self::$siteContent !== 'home' + && common::$siteContent !== 'home' && in_array($this->getUrl(0), array_keys($this->getData(['page']))) // Le userId n'est pas celui d'un admis ni le prof du contenu && ( - $this->getUser('group') < self::GROUP_ADMIN - || $this->getUser('id') !== $this->getData(['course', self::$siteContent, 'author']) + $this->getUser('group') < common::GROUP_ADMIN + || $this->getUser('id') !== $this->getData(['course', common::$siteContent, 'author']) ) ) { // Stocke la dernière page vue et sa date de consultation - $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]); - $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'datePageView', time()]); + $this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]); + $this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'datePageView', time()]); // Stocke le rapport en CSV - $file = fopen(self::DATA_DIR . self::$siteContent . '/report.csv', 'a+'); + $file = fopen(common::DATA_DIR . common::$siteContent . '/report.csv', 'a+'); fputcsv($file, [ $this->getUser('id'), $this->getUrl(0) ,time()], ';'); fclose($file); @@ -439,7 +439,7 @@ class core extends common // Force la déconnexion des membres bannis ou d'une seconde session if ( $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - and ($this->getUser('group') === self::GROUP_BANNED + and ($this->getUser('group') === common::GROUP_BANNED or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf']) and $this->getData(['config', 'connect', 'autoDisconnect']) === true) ) @@ -454,7 +454,7 @@ class core extends common and $this->getUrl(1) !== 'login' and ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - and $this->getUser('group') < self::GROUP_ADMIN + and $this->getUser('group') < common::GROUP_ADMIN ) ) ) { @@ -467,30 +467,11 @@ class core extends common exit(); } - // Pour éviter une 404 sur une langue étrangère, bascule dans la langue correcte. - if (is_null($this->getData(['page', $this->getUrl(0)]))) { - foreach ($this->getData(['course']) as $key => $value) {; - if ( - is_dir(self::DATA_DIR . $key) && - file_exists(self::DATA_DIR . $key . '/page.json') - ) { - $pagesId = json_decode(file_get_contents(self::DATA_DIR . $key . '/page.json'), true); - if ( - is_array($pagesId['page']) && - array_key_exists($this->getUrl(0), $pagesId['page']) - ) { - header('Refresh:0; url=' . helper::baseUrl() . 'course/swap/' . $key . '/' . $this->getUrl(0)); - exit(); - } - } - } - } - // Check l'accès à la page $access = null; if ($this->getData(['page', $this->getUrl(0)]) !== null) { if ( - $this->getData(['page', $this->getUrl(0), 'group']) === self::GROUP_VISITOR + $this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') // and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group']) // Modification qui tient compte du profil de la page @@ -511,7 +492,7 @@ class core extends common and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') ) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - and $this->getUser('group') < self::GROUP_EDITOR + and $this->getUser('group') < common::GROUP_EDITOR ) ) { $access = false; @@ -537,9 +518,9 @@ class core extends common $this->getUser('id') && $userId !== $this->getUser('id') && $this->getData(['user', $userId, 'accessUrl']) === $this->getUrl() && - array_intersect($t, self::$concurrentAccess) && - //array_intersect($t, self::$accessExclude) !== false && - time() < $this->getData(['user', $userId, 'accessTimer']) + self::ACCESS_TIMER + array_intersect($t, common::$concurrentAccess) && + //array_intersect($t, common::$accessExclude) !== false && + time() < $this->getData(['user', $userId, 'accessTimer']) + common::ACCESS_TIMER ) { $access = false; $accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']); @@ -576,10 +557,10 @@ class core extends common $inlineScript[] = $this->getData(['page', $this->getUrl(0), 'js']) === null ? '' : $this->getData(['page', $this->getUrl(0), 'js']); // Importe le contenu, le CSS et le script des barres - $contentRight = $this->getData(['page', $this->getUrl(0), 'barRight']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barRight']), self::$siteContent) : ''; + $contentRight = $this->getData(['page', $this->getUrl(0), 'barRight']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barRight']), common::$siteContent) : ''; $inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'css']); $inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barRight']), 'js']); - $contentLeft = $this->getData(['page', $this->getUrl(0), 'barLeft']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barLeft']), self::$siteContent) : ''; + $contentLeft = $this->getData(['page', $this->getUrl(0), 'barLeft']) ? $this->getPage($this->getData(['page', $this->getUrl(0), 'barLeft']), common::$siteContent) : ''; $inlineStyle[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'css']); $inlineScript[] = $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']) === null ? '' : $this->getData(['page', $this->getData(['page', $this->getUrl(0), 'barLeft']), 'js']); @@ -597,7 +578,7 @@ class core extends common $this->addOutput([ 'title' => $title, - 'content' => $this->getPage($this->getUrl(0), self::$siteContent), + 'content' => $this->getPage($this->getUrl(0), common::$siteContent), 'metaDescription' => $this->getData(['page', $this->getUrl(0), 'metaDescription']), 'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']), 'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']), @@ -623,7 +604,7 @@ class core extends common : $this->getData(['page', $this->getUrl(0), 'metaDescription']); // Importe le CSS de la page principale - $pageContent = $this->getPage($this->getUrl(0), self::$siteContent); + $pageContent = $this->getPage($this->getUrl(0), common::$siteContent); $this->addOutput([ 'title' => $title, @@ -668,7 +649,7 @@ class core extends common $output = $module->output; // Check le groupe de l'utilisateur if ( - ($module::$actions[$action] === self::GROUP_VISITOR + ($module::$actions[$action] === common::GROUP_VISITOR or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') and $this->getUser('group') >= $module::$actions[$action] and $this->getUser('permission', $moduleId, $action) @@ -681,10 +662,10 @@ class core extends common foreach ($_POST as $postId => $postValue) { if (is_array($postValue)) { foreach ($postValue as $subPostId => $subPostValue) { - self::$inputBefore[$postId . '_' . $subPostId] = $subPostValue; + common::$inputBefore[$postId . '_' . $subPostId] = $subPostValue; } } else { - self::$inputBefore[$postId] = $postValue; + common::$inputBefore[$postId] = $postValue; } } } @@ -724,9 +705,9 @@ class core extends common // Contenu par vue elseif ($output['view']) { // Chemin en fonction d'un module du coeur ou d'un module - $modulePath = in_array($moduleId, self::$coreModuleIds) ? 'core/' : ''; + $modulePath = in_array($moduleId, common::$coreModuleIds) ? 'core/' : ''; // CSS - $stylePath = $modulePath . self::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.css'; + $stylePath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.css'; if (file_exists($stylePath)) { $this->addOutput([ 'style' => file_get_contents($stylePath) @@ -739,7 +720,7 @@ class core extends common } // JS - $scriptPath = $modulePath . self::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php'; + $scriptPath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php'; if (file_exists($scriptPath)) { ob_start(); include $scriptPath; @@ -748,7 +729,7 @@ class core extends common ]); } // Vue - $viewPath = $modulePath . self::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.php'; + $viewPath = $modulePath . common::MODULE_DIR . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.php'; if (file_exists($viewPath)) { ob_start(); include $viewPath; @@ -834,14 +815,40 @@ class core extends common } } } elseif ($this->output['content'] === '') { + + // Pour éviter une 404, bascule dans l'espace correct si la page existe dans cet espace. + // Parcourir les espaces y compris l'accueil + foreach (array_merge(['home'=> []], $this->getData(['course'])) as $courseId => $value) {; + if ( + // l'espace existe + is_dir(common::DATA_DIR . $courseId) && + file_exists(common::DATA_DIR . $courseId . '/page.json') + ) { + // Lire les données des pages + $pagesId = json_decode(file_get_contents(common::DATA_DIR . $courseId . '/page.json'), true); + if ( + // La page existe + is_array($pagesId['page']) && + array_key_exists($this->getUrl(0), $pagesId['page']) + ) { + // Basculer + $_SESSION['ZWII_SITE_CONTENT'] = $courseId; + header('Refresh:0; url=' . helper::baseUrl() . $this->getUrl()); + exit(); + } + } + } + // La page n'existe pas dans les esapces, on génére une erreur 404 http_response_code(404); if ( + // une page est définie dans la configuration mais dans home $this->getData(['config', 'page404']) !== 'none' - //and $this->getData(['page', $this->getData(['config', 'page404'])]) ) { + // Bascule sur l'acccueil et rediriger $_SESSION['ZWII_SITE_CONTENT'] = 'home'; header('Location:' . helper::baseUrl() . $this->getData(['config', 'page404'])); } else { + // Page par défaut $this->addOutput([ 'title' => 'Page indisponible', 'content' => template::speech('

    ' . helper::translate('La page demandée n\'existe pas ou est introuvable (erreur 404)') . '

    '. helper::translate('Retour') . '

    ') @@ -867,25 +874,25 @@ class core extends common } switch ($this->output['display']) { // Layout brut - case self::DISPLAY_RAW: + case common::DISPLAY_RAW: echo $this->output['content']; break; // Layout vide - case self::DISPLAY_LAYOUT_BLANK: + case common::DISPLAY_LAYOUT_BLANK: require 'core/layout/blank.php'; break; // Affichage en JSON - case self::DISPLAY_JSON: + case common::DISPLAY_JSON: header('Content-Type: application/json'); echo json_encode($this->output['content']); break; // RSS feed - case self::DISPLAY_RSS: + case common::DISPLAY_RSS: header('Content-type: application/rss+xml; charset=UTF-8'); echo $this->output['content']; break; // Layout allégé - case self::DISPLAY_LAYOUT_LIGHT: + case common::DISPLAY_LAYOUT_LIGHT: ob_start(); require 'core/layout/light.php'; $content = ob_get_clean(); @@ -896,7 +903,7 @@ class core extends common echo $content; break; // Layout principal - case self::DISPLAY_LAYOUT_MAIN: + case common::DISPLAY_LAYOUT_MAIN: ob_start(); require 'core/layout/main.php'; $content = ob_get_clean(); From 04b2877c48e50de323c5bbf0d54899669f4ee139 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 14:58:01 +0200 Subject: [PATCH 07/10] 1.10.00 --- README.md | 2 +- core/core.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0b9eb67..1da8410 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ZwiiCampus 1.9.00 +# ZwiiCampus 1.10.00 ZwiiCampus (Learning Management System) est logiciel auteur destiné à mettre en ligne des tutoriels. Il dispose de plusieurs modalités d'ouverture et d'accès des contenus. Basé sur la version 13 du CMS Zwii, la structure logicielle est solide, le framework de Zwii est éprouvé. diff --git a/core/core.php b/core/core.php index 3cb6840..f06ee2a 100644 --- a/core/core.php +++ b/core/core.php @@ -51,7 +51,7 @@ class common const ACCESS_TIMER = 1800; // Numéro de version - const ZWII_VERSION = '1.9.00'; + const ZWII_VERSION = '1.10.00'; // URL autoupdate const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/'; From 7cee16389f2722053e61f973e43ce48b3cfcfdef Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 17:25:50 +0200 Subject: [PATCH 08/10] commentaire --- core/module/page/page.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/module/page/page.php b/core/module/page/page.php index 4841063..a7361e2 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -734,7 +734,7 @@ class page extends common /** * Retourne les informations sur les pages en omettant les clés CSS et JS qui occasionnent des bugs d'affichage dans l'éditeur de page - * @return array tableau associatif des pages dans le menu + * @return string tableau associatif des pages dans le menu */ public function getPageInfo() { @@ -743,9 +743,7 @@ class page extends common unset ($d["css"], $d["js"]); return $d; }, $p); - $d = json_encode($d); - return $d; - + return json_encode($d); } } \ No newline at end of file From 8dedb39a33b9e60fd3bf2e88f763976d97bd59fe Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 18:09:28 +0200 Subject: [PATCH 09/10] =?UTF-8?q?D=C3=A9place=20les=20boutons=20de=20gesti?= =?UTF-8?q?on=20des=20utilisateurs=20dans=20la=20liste=20des=20espaces.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/course/course.php | 9 ++++++++- core/module/course/view/index/index.js.php | 10 ++++++++++ core/module/course/view/index/index.php | 2 +- core/module/course/view/manage/manage.php | 9 --------- core/module/course/view/users/users.php | 2 +- site/sync.ffs_db | Bin 0 -> 18004 bytes 6 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 site/sync.ffs_db diff --git a/core/module/course/course.php b/core/module/course/course.php index 742caa8..e51b9f6 100644 --- a/core/module/course/course.php +++ b/core/module/course/course.php @@ -111,13 +111,20 @@ class course extends common self::$courseAccess[$this->getData(['course', $courseId, 'access'])], self::$courseEnrolment[$this->getData(['course', $courseId, 'enrolment'])] ); + if ($this->getUser('permission', 'course', 'users') === true) { + $users = template::button('categoryUser' . $this->getUrl(2), [ + 'href' => helper::baseUrl() . 'course/users/' . $courseId, + 'value' => template::ico('users'), + ]); + } self::$courses[] = [ $info, $this->getData(['course', $courseId, 'description']), $enrolment, + $users, template::button('categoryUser' . $courseId, [ 'href' => helper::baseUrl() . 'course/manage/' . $courseId, - 'value' => template::ico('eye'), + 'value' => template::ico('sliders'), 'help' => 'Gérer' ]) ]; diff --git a/core/module/course/view/index/index.js.php b/core/module/course/view/index/index.js.php index e2a14a3..3a24fb7 100644 --- a/core/module/course/view/index/index.js.php +++ b/core/module/course/view/index/index.js.php @@ -23,6 +23,16 @@ $(document).ready(function () { target: 2, orderable: false, searchable: false + }, + { + target: 3, + orderable: false, + searchable: false + }, + { + target: 4, + orderable: false, + searchable: false } ] }); diff --git a/core/module/course/view/index/index.php b/core/module/course/view/index/index.php index 6310c29..a374468 100644 --- a/core/module/course/view/index/index.php +++ b/core/module/course/view/index/index.php @@ -37,7 +37,7 @@
    - 'dataTables']); ?> + 'dataTables']); ?> \ No newline at end of file diff --git a/core/module/course/view/manage/manage.php b/core/module/course/view/manage/manage.php index 3a910f8..2a8a8ec 100644 --- a/core/module/course/view/manage/manage.php +++ b/core/module/course/view/manage/manage.php @@ -55,15 +55,6 @@ ]); ?> - getUser('permission', 'course', 'users') === true): ?> -
    - getUrl(2), [ - 'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2), - 'value' => 'Participants', - 'ico' => 'users' - ]); ?> -
    -
    diff --git a/core/module/course/view/users/users.php b/core/module/course/view/users/users.php index 1409955..ae6b5f7 100644 --- a/core/module/course/view/users/users.php +++ b/core/module/course/view/users/users.php @@ -2,7 +2,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'course/manage/' . $this->getUrl(2), + 'href' => helper::baseUrl() . 'course/' . $this->getUrl(2), 'value' => template::ico('left') ]); ?>
    diff --git a/site/sync.ffs_db b/site/sync.ffs_db new file mode 100644 index 0000000000000000000000000000000000000000..593797c94c1bcb92fad4c1eafc1d3552384315b3 GIT binary patch literal 18004 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�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 bj0QRQ$es_%6M{b$qsKUKh|KO@aS#3uaY literal 0 HcmV?d00001 From 78b2d87ec1c049b418f71205951456695f15958e Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 23 Apr 2024 18:09:55 +0200 Subject: [PATCH 10/10] supprime sync.db ! --- site/sync.ffs_db | Bin 18004 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 site/sync.ffs_db diff --git a/site/sync.ffs_db b/site/sync.ffs_db deleted file mode 100644 index 593797c94c1bcb92fad4c1eafc1d3552384315b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18004 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�uOjo;Z>$E5`5oK#fR)uc=Q<6`M_w!Z!53xr_ks83W{%J z3RdACGh6Z9cB)Sa*4o>FICs1=!tpKZBR76h8;)z_Y?APg^>;2R1di*ZG*=THLlk_~ zOnzx_+00JB75vU1)j9cJzTgC6p{YOKu{Zk>ocv@vpks%a+#&c12Ni!9bztK2&c?WW2fjJb2@fuOPskQ% z)*|?3@Pz>*)W-77*RlP~8Bm@kA?}SdNzSz{@YxODxo3(_p=nx7dA?Fv;gzVb3W4X* z50z#(;!op7YPb7MlTrBJHw{78enFn8;Y$CZv0;a^e#8!?RFJU&XPs(D;B}82MGG8} zSg1K2e&0p$fm)PT{5OV>n^n zHE-r-ozvi5J(OptNvJ|oVw}?N9Hek{b5?cvnn#b$`tO&O()V8(BikpxC!>BSYKmRK z&w%}xF&7MiABA|{+~je=p9DT7ROM`E@`!^$-P^!o+<(hXh^B?-#fnbBCvctGYUd3b zluX0>w$uG>TGwgZ3*`-Sh!VJF9~5w@f7^cS*Qm`_VPB%)zm?!qhfEVecosBw1OlIK zt?L~In{PN%@i$&lc&jO@Wb8+C6#wU&jvWeqEPTHp`2XuGcYO)1{B+r@_LHZZJB_u6 zy6$G4Mr3)&?}hVJhigkYdbS@)F+$TBac^}1))=mEZrD%5^@@*tTj7zUnXK}k&!u}E zVa_sw2?0IN+Vc>*vO%6(Ih5zwk96K3_~Q<&rT+&?vk><18)Ey*@Vi|*lzz7(vP(as z;1@If)P{pmw>-?D_`UTNo`bk?c#87;)--d4f3YxK*AH_Lix8_n+p1#|aBd}iyzxQd z8D`!M5cuawI(DkbiS8Dq^|jD1X{7WWC%aQx+q-9CseLMzC1bO|k7^-LErmYAK*PJ; zpWe`U<8U_Y1$ZaUhG&2u0(dF*bPIb~fcuaJx$p1L?Iq;*gP6DVF_m+?d4EHeR~h(% zrpYUK`|66o)e)b0*YJmFbPCNP)DJHrroCgDJ3?~+`kaW~_3SDt+g>k+J$sfC78Oh_ zE$}dpy4vRA4(8&}WlMWB&o1Amb>PX4j-WyleZ*0y!1sT*r*TIvDG3BW+?0C)55QjJ zLcL+!(M7+>7@EM}0p18W0lJz4xGeT=18na-a}E`ro2RJX-GgkKN2@;ng&2M$RPkMb zFWFG>Jv%Bq(FiSbbq9SuoYBT0jzt094mc<5^O|j%8y(nRGKZu#`Cap}#@fmi{SQrbe>1ey zHC9@nYuw*bb#-r?;;WR_vEL2RvCVKk4MuGoVfq-t?fh!x8Gv(ZYn~emd`j zS&FX}qVP7QuqsVkty`ka7Hc#d+28_ZiS|e$w3}22H1<}S=zh^? z{k_(G)#obILiMgIzRx!b$9=2tbmZS1gB5?fit0HsNa4Kj%>eAt7dT%Bzw4<<=Wo%a z^@aIt_NC&jFWfGvGV}~oxB%cO4HSRe<7F?K=Qh>QUf;-y+Q(~Q6TA`8>hRYR%CpTl zg=ZpeuSM^rENbAsu;-HIg;CkN22GUD0Q7by4OV?7A|E9howzInJy`kE>dmD3GzHuB zI;T*_R^Kr%p9wtICQI|&=J!uftJFt*9*h3oP!qO=&l=QGhu?SKUwJM+U4Bp*mU+l; zM+i&VVxj+U-RS7yKe2AKy@lm}Q(L`jdi5gnFvO4>z>h)9Cw-L*Y8xGJ77Md44I3M$ zW!X2)r{IpJJNi^P%>{|bvlFevJBZZ>QDam>E|`OOb#|1_idVB;K9}CdxI((mY(KxA zx!4ogSSwzGkM}^0x(&U)J&^4rYLATI`5s_jbGa*X)y4Tb0=?q!?O(4rSxbKb=HF852Q zC0Q*UD5BEx;0znWl=Qg9BPi8Cg1Tr_NEHr6-_^bcS&^ZZoik6~AZK)(d^ zoq8yJu4ILMab7-;`>ct`WyMkBg=JSAW-o+###|n|{KdSKAaHH;nnsxmS6A+fQW=u3 zDBSXMg~#K}*dd#@$f0MnMW=P_dh{D7qldEyemxy$$+aOmHYaQ^+`LpOGDlugnyQJ~ zUtNwm>Wb;}2z_tc{7Qw{lm7;Lv<7fjzyr|Znt(p@)(P%bnch3JeGwBnI@ho+`&^4U zmhY0yhHqX3{ZhoY5vbX2fqn#Rdnau8*|&7w#)z4rp!YX4-u%qU&F8k)ItD&62J&2I ze;9s|4K-Li;!h{gtU(N4gnrai&~yO&5Iuy8SbJy0fpWNKyk_q1WiJ-uy^aE)KMdK% zVyJaOQ27_!v_JOzCu z(wB$5g(F_&MJ}l5`SPMMh`*Y@oGhXr2@8UI4K{NIwa_}~sy}M=mVieC=DXrMaW`=s z`?3Y^U7Um6Cg6R8L6B!Z&i+2oc?xoFTl8IHM(BRc!G86^x)O08(GEI4f_yp__B^Pk z@*D^MU4U4+8M=DZSLtKnrz6qR+lV!mM_;ZVq2j@<8JHWFDn0uC-fel6c^>0n36r? zFEII0?D^PEmjAF1hXzK3VH4pVH_j5dR_kYX)+`5#){? z#>QN>0iWuLvCodvx$eNn&)_^V5b?qGQiNws3^}U(67Aj`_l*z$tjAE6G>q9ff&MLJupk z-fxf}PbX`?^kON6L*79z^^Fmi}zbnUe&vUshf09 zJDV3(1vBgo9a}my{qu{LR}cP&T5S*HFwO{pIA7m|Ov@vvY4t_lizI+sQS}gM8 zo7k_R=H*&hS7zL`okYyP0C=8xc~|Iza3A!buj*tndIiz&qYK^C_WHv1l5gtR@CFJe z^ilfi27ZERdVS=IxyEi!qy9W^dRg*(FVcI7@P1|_q4?tJ!{`Nr@nS2uku;lO7Te#6`#?(!zoV(m@g;0YJSAS(+6~}x#$Z8 z7F3>5xQ88U|6_%8EJ=RS1@eQ%3rbX@IzXfri4CL>JnvnF3fd2>NDUDj%yo%`J9|=1lp9;tk zUr}%1-xsm&GIGac#L0nJdoRetwGiJNdB2FcuyMsP=(99xs^U0*QHMiN|GWX)UWS}_ z6YJvMt-@M{1O7at+T9jXkt3 zN7a_tXZx$YHE;d2qDPcJ?e>4`vx$ZmJV@n!!1Go?^R*>^T%7RKQ)C5pVg|TRyFYnEy06`hCnx`aiJ0(V%&n9PKSH zGtV-Ia*fQJ%#Rb;8%IuO-YkOJfH{SF}M0rIq1YQ=h~jbJ=7ILQG-1;XBn9>{Zq6fi#wT~D z{CA$u^}W}<)?WKe?R|_n^>win{xcii<%szBgO_83$N&HT{{O!g@#DXKNj53;llGt+ z>@jnjo45YDTu{QuM=vVW*<@o8n zH~y`!p>TZUqhlY{*<wbryec|>@jnFt$+PX zYhvgp^+7k-W9Ao(|J^?~|4|GrE{Yz+9y9lS_w=tPd=>914s;&P9y1RMF8=GooX5o# zr>8ly$IQQufBx4m&g+`=@#Lvd>@o9keP8_bj+W!2iWMrSv&YOg*MIu!J&X?}eOzVv z4|~i!xhUyFPo&yzAI6e|>|)8d~5KhR^}zk;MU}x*f%y%k`7Ird`nFVm(rn}h zQNHI`_;m8xIq<>c4-DaU3{Jz`papWhH;mvc(+5UQS6K+WEnhO6-UVjfhfqX@G96ux4pJsRAUf0 zJcJvQZ|Mm)q2qtx5_}l>j4tqTzGfzQuL`xu8k_IU%BhN=Iarc^q6<7MLw=-R%aovwmEwIeH+c~%oD%EW67n0;8x^D z-{8^YOE$u-$xA-NBgun8;nT_cRKkyt-`@haB`@!Q_37oGp(ynCeh1v1{ChR>F;%me zf4X;Y{QcB!y#MY?^6EoRriL<)dH_F3E^=S((r)&5p0{}jKSh2;daLZKxl1$H`Zit1 z`YxyS9lscPXUa=IMm~-532tx~@_-S24@n<&xWv|XSS9vHm+$=e9lVPA%cy?v47`4R z_LunjYuSv~XLZT1&zJPD|1GvxNZOwU2d71g{{%^_e|`VBXz|_U5?yD@KQUsP0~H8Ssb z>UYV3cO*a8FzKerj20=@UqLQhp8W7n_;hlsm6+chn%{?^nBPj8U+6aUKm7oo-#jaf zUqa(Q+X}ZOpF9)(mb_{w+@5^D2>yoLa0lFu{9-ZOz>2TmO`6?Hz{hy|jqUzkM+BR+LXai}jbKyvHWEHTnGvcn9+FYvC3Lc>RYj zp2$y}JD2x2tOeu$*bvO%v1@# zc8~QxRR%6iKC$ZYOqEb_)dtjWrturRWF3aCyuj!G#{z1;0nG zmIsd~KfD}%o4j=t_QxvPA3fHMt%lzx z{}_zC^kJS~G9P}8>W6HAw^IG86=oSpVZ96_zWx=NW+eS1+55$sWF(E!l$d|E6!mvW z&i4v1%1BC8Gw3QD|NASuzA(02qQm-ePU?1R;n%&X%+IZb+mc^O*%-gVMQ3C;A%A*= zdx`P%_+Bg@+A*kC>71i4+4FnQD$@&cyW+K(%RK2b;C4pmnaq1c{wgt^VaCTl|2ci? zVwF#htp4|{s2@W0KbF|_U+yFu#rnG&i2m%UznbYP87mC49JxoKz5~@?Avd_Glgg!yI5D!njHAfI}0>*U34tE`#FOT&+nFZ-dEv7$?kBXgH= ziZ6_(F68rD{2a%3bT0#Cp?=RVi%N_OBl-GG)o_2_7&Uqw%WFm;A58hSw?{rG3QwwF zzI!r!I{B598neY7FmH#<`+J~?~{KPtKC}I5|PUM`doMb`Gk-JJJaa0 zEJ^3b4~INE(|v8SC3#Y(qjsicuO;W@;bO_|kQsmY$IBW?S03vP9XI`A`-39ID^h;A)$lry84?C&kuU znO>ZJmW?m#0e?oW9}Yi9UJ{4#KhpSCbyoJK5h>Yh{5W^ypHO~-)HHk381g=?hx?iD z*xQedKjlxZovCXZp5Nk&{0qvTYefAclz#yc2JZPkw*dYB=KXsgM1NeKWH{Q zmHb5n{5<)~EW?~lVK=_9@t<$N`b3sxv3$A+`Qwzod~cDyb)I7jbI*71Ch}n>)gGqv z&Q&pYd<(B9SMv>*eKm2t#Lpk6yWst?p1(vNz5$;fx-OOIQr>WR$v&@Br0lCMK^eV- z^)X)ewZwR}A%A}8@CW_vUC&+L2kuFJvkUS{K^ZziK3Ai%#Q6F@Jiq)xZkv}q?tWqQ zy|myr$TKyQT1t;+mN6fi{i(!w2YF0?cp7>4oA7<)oAuzSnPs}d_@`_?lo&4`!N)&( zKE9>2<^r$3;5zbqDS!4*Y)h%zxiZ%OnQQPc^75l_5AsKkQ2!FuKh}ix*|VO{zp@CP zO>VRR$Iro^d-QYoW%8N^xBLZTk5|9d=B4hlFD$Pv zhUb&_N=5z)<;|zTmyt)@ef836(N+F^)PH|JnPC3Wp&8pGkg9XX^+qU zyXf?lP$J#`J>TO$OkH7{1G&M zsLt)RCyxauvh|VLiS?OH^<%U@sJRXw%;(o&i~7r{{+Eus24(d-nxrPwA0dVM22|g9 z%E3Wd>M2QVeLU6C|2e9kcdj7QYRkAvHoq%s@U!H7Rt!3xvhvw-R{uyF)E`Lo<-V#u zv6>ywo#k~kkv~uQX}7ySv3lgs{g^U5jojqVAyjS~D6x!sB9YOX^x2eRYi zr~*Gt?wa#p?McVbMCNk+;aTK8SB`yRH8`O=bBDh0O!9nNTMz5J5mn6Z@5B1fBk!>Y z^HT`u&W_LfaQH&<%RO=Yjs_>P_4y!;^%+3x)BLU7H>)RU7A!yf5b_HsUvS}G-~9LoD!+z~#M zT+7D%v6bs)Wwt-3wSx~LUo+|ZeJiUuV_3db7CxA~ejm=S z2gfX!592-u_!_Pud12G9SMi zzJXlf*=QBJbu(2Zy?l;tF$38~8(VnT2~@{FZ*??mi7(NdEaY@&n&-@BHgq ziE$+PAdd-Fevjnh+59VXFn=SOztuFX?^4%hEn$6j|3>~OeCucOc&=hEFB$lL4QV7Q*VUodK_>`a_x?oC^0z;eOK&UPr#w^VzBJ bj0QRQ$es_%6M{b$qsKUKh|KO@aS#3uaY