Compare commits

...

35 Commits

Author SHA1 Message Date
07e390d818 1.21 renomme group en role 2025-02-03 14:44:22 +01:00
cbc7a1ad19 1.21.04 sécurisation de la méthode de changement de mot de passe. 2025-01-31 18:13:00 +01:00
e7e0fef37e 1.20.03 version 2025-01-31 10:45:45 +01:00
d0f14f0e60 1.20.03 Dépréciation concaténation 2025-01-31 09:52:52 +01:00
cca646b1be revert page edit script 2025-01-31 09:31:49 +01:00
6db9837238 revert page edit script 2025-01-30 16:39:13 +01:00
ca313a2b18 1.20.03 revert page edit 2025-01-30 16:36:36 +01:00
547dea7350 1.20.02 save dataversion 2025-01-30 13:07:37 +01:00
9d6e229e0a 1.20.02
Installe la variable de masquage des pages dans les thèmes où elle n'a pas été définie.
Corrige le décalage du contenu de la page lorsque les pages sont masquées du menu.
Mise à jour du jeu de données 1.20.02
2025-01-30 13:03:40 +01:00
22d69ccafb 1.20.01 bug template table 2025-01-29 20:39:49 +01:00
5e59984211 1.20.01 bug de theme à installation 2025-01-29 20:17:31 +01:00
0301e1f31d 1.20.00 commente 2025-01-29 16:51:02 +01:00
1f0d490688 Bug page Editor 2025-01-28 18:44:40 +01:00
288393778a Bug édition de page 2025-01-28 18:22:28 +01:00
7773bc916f Revert "Revert Optimisation Page Edit"
This reverts commit 5ebbcfcb9d025e53029ed9f252ac5bac686506c4.
2025-01-28 18:10:29 +01:00
5ebbcfcb9d Revert Optimisation Page Edit 2025-01-28 17:29:43 +01:00
f237d0bca1 1.20.00 2025-01-28 12:33:02 +01:00
70fa6efee7 Message d'erreur d'envoi de l'email de réinitialisaiton 2025-01-27 18:52:41 +01:00
30ed4349d9 Formatage du message d'erreur d'erreur de démarrage 2025-01-27 18:43:55 +01:00
ad998c17d1 Liste des users, corrige la colonne date de dernière connexion. 2025-01-26 20:50:19 +01:00
4d6b6f8d4f Bug template table, id des colonnes mal placés 2025-01-26 20:49:37 +01:00
dd3582b9db Supprime des commentaires 2025-01-25 22:25:12 +01:00
0e26e71a50 1.19.05 Script page edit optimisé 2025-01-25 22:22:45 +01:00
9a56fc9572 Revert "1.19.05 Page edit script optimisé"
This reverts commit ac8689b40aeadb0b43a5c90824cd74fc05f2ad75.
2025-01-25 21:58:16 +01:00
ac8689b40a 1.19.05 Page edit script optimisé 2025-01-25 21:50:29 +01:00
0f9a79411d 1.9.05 Tri par date et bug dernière page vue 2025-01-25 19:03:49 +01:00
b944a3bac7 Renforce jsonDB 2025-01-25 14:21:31 +01:00
4bab81c541 1.19.04 Fix bug du formulaire édition de page 2025-01-24 19:40:41 +01:00
2f3dd5926b 1.19..04 Supprime jquery de datatable 2025-01-24 18:47:07 +01:00
959139b239 Miniature des images vectorielles 2025-01-24 18:01:36 +01:00
e958287b9e 1.19.04 largeur de page de l'espace lorsque les pages sont désactivées dans le menu 2025-01-24 17:40:31 +01:00
e110e7b4f9 Bug setup 2025-01-24 17:28:55 +01:00
61ec8c04be Bug descripteur php 8 2025-01-24 17:17:50 +01:00
f0ccf8eb2f 1.19.04 bordure autour du form update et install 2025-01-23 21:22:43 +01:00
b831275901 1.19.04 cadre autour du form update 2025-01-23 21:17:11 +01:00
72 changed files with 712 additions and 531 deletions

View File

@ -1,4 +1,4 @@
# ZwiiCampus 1.19.03 # ZwiiCampus 1.21.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é. 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é.

View File

@ -170,6 +170,7 @@ class JsonDb extends \Prowebcraft\Dot
if ($this->data === null) { if ($this->data === null) {
throw new \RuntimeException('Tentative de sauvegarde de données nulles'); throw new \RuntimeException('Tentative de sauvegarde de données nulles');
} }
try { try {
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_THROW_ON_ERROR); $encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_THROW_ON_ERROR);
} catch (\JsonException $e) { } catch (\JsonException $e) {
@ -190,8 +191,11 @@ class JsonDb extends \Prowebcraft\Dot
return; return;
} }
} }
error_log("Échec sauvegarde : longueur incorrecte ou renommage échoué (tentative " . ($attempt + 1) . ")");
} catch (\Exception $e) { } catch (\Exception $e) {
// Nettoyer le fichier temporaire en cas d'exception error_log('Erreur de sauvegarde : ' . $e->getMessage());
if (file_exists($temp_file)) { if (file_exists($temp_file)) {
unlink($temp_file); unlink($temp_file);
} }
@ -200,7 +204,6 @@ class JsonDb extends \Prowebcraft\Dot
usleep(pow(2, $attempt) * 250000); usleep(pow(2, $attempt) * 250000);
} }
// Erreur fatale si tous les essais échouent
throw new \RuntimeException('Échec de sauvegarde après ' . $max_attempts . ' tentatives'); throw new \RuntimeException('Échec de sauvegarde après ' . $max_attempts . ' tentatives');
} }
} }

View File

@ -353,7 +353,7 @@ class layout extends common
} }
// Affichage de la barre de membre simple // Affichage de la barre de membre simple
if ( if (
$this->getUser('group') >= self::GROUP_MEMBER && $this->getUser('group') < self::GROUP_ADMIN $this->getUser('role') >= self::GROUP_MEMBER && $this->getUser('role') < self::GROUP_ADMIN
&& $this->getData(['theme', 'footer', 'memberBar']) === true && $this->getData(['theme', 'footer', 'memberBar']) === true
) { ) {
$items .= '<span id="footerDisplayMemberAccount"'; $items .= '<span id="footerDisplayMemberAccount"';
@ -508,7 +508,7 @@ class layout extends common
* Affichage du sélecteur d'espaces * Affichage du sélecteur d'espaces
*/ */
if ( if (
$this->getUser('group') === self::GROUP_MEMBER $this->getUser('role') === self::GROUP_MEMBER
&& $this->getData(['theme', 'menu', 'selectSpace']) === true && $this->getData(['theme', 'menu', 'selectSpace']) === true
) { ) {
if ($this->getCoursesByProfil()) { if ($this->getCoursesByProfil()) {
@ -532,7 +532,7 @@ class layout extends common
&& $this->getData(['course', self::$siteContent, 'enrolment']) >= 1 && $this->getData(['course', self::$siteContent, 'enrolment']) >= 1
) { ) {
$href = ''; $href = '';
switch ($this->getUser('group')) { switch ($this->getUser('role')) {
case self::GROUP_MEMBER: case self::GROUP_MEMBER:
$href = helper::baseUrl() . 'course/userReport/' . self::$siteContent . '/' . $this->getUser('id'); $href = helper::baseUrl() . 'course/userReport/' . self::$siteContent . '/' . $this->getUser('id');
break; break;
@ -565,7 +565,7 @@ class layout extends common
* Affichage des boutons gestionnaire de fichiers et mon compte * Affichage des boutons gestionnaire de fichiers et mon compte
*/ */
if ( if (
$this->getUser('group') === self::GROUP_MEMBER $this->getUser('role') === self::GROUP_MEMBER
&& $this->getData(['theme', 'menu', 'memberBar']) === true && $this->getData(['theme', 'menu', 'memberBar']) === true
) { ) {
@ -613,8 +613,7 @@ class layout extends common
} }
// Retourne les items du menu // Retourne les items du menu
echo '<ul class="navMain" id="menuLeft">' . $itemsLeft . '</ul><ul class="navMain" id="menuRight">' . $itemsRight; echo '<ul class="navMain" id="menuLeft">' . $itemsLeft . '</ul><ul class="navMain" id="menuRight">' . $itemsRight . '</ul>';
echo '</ul>';
} }
/** /**
@ -649,7 +648,7 @@ class layout extends common
and $this->isConnected() === false and $this->isConnected() === false
) or ($this->getData(['page', $parentPageId, 'disable']) === true ) or ($this->getData(['page', $parentPageId, 'disable']) === true
and $this->isConnected() === true and $this->isConnected() === true
and $this->getUser('group') < self::GROUP_EDITOR and $this->getUser('role') < self::GROUP_EDITOR
) )
) { ) {
$pageUrl = ($this->getData(['config', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0); $pageUrl = ($this->getData(['config', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
@ -715,7 +714,7 @@ class layout extends common
and $this->isConnected() === false and $this->isConnected() === false
) or ($this->getData(['page', $childKey, 'disable']) === true ) or ($this->getData(['page', $childKey, 'disable']) === true
and $this->isConnected() === true and $this->isConnected() === true
and $this->getUser('group') < self::GROUP_EDITOR and $this->getUser('role') < self::GROUP_EDITOR
) )
) { ) {
$pageUrl = ($this->getData(['config', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0); $pageUrl = ($this->getData(['config', 'homePageId']) === $this->getUrl(0)) ? helper::baseUrl(false) : helper::baseUrl() . $this->getUrl(0);
@ -976,7 +975,7 @@ class layout extends common
* Les admins voient tous les contenus * Les admins voient tous les contenus
* Les enseignants les contenus dont ils sont auteurs * Les enseignants les contenus dont ils sont auteurs
*/ */
if ($this->getUser('group') >= self::GROUP_EDITOR) { if ($this->getUser('role') >= self::GROUP_EDITOR) {
if (is_array($this->getCoursesByProfil())) { if (is_array($this->getCoursesByProfil())) {
$leftItems .= '<li><select id="barSelectCourse" >'; $leftItems .= '<li><select id="barSelectCourse" >';
$leftItems .= '<option name="' . helper::translate('Accueil') . '" value="' . helper::baseUrl(true) . 'course/swap/home" ' . ('home' === self::$siteContent ? 'selected' : '') . '>' . helper::translate('Accueil') . '</option>'; $leftItems .= '<option name="' . helper::translate('Accueil') . '" value="' . helper::baseUrl(true) . 'course/swap/home" ' . ('home' === self::$siteContent ? 'selected' : '') . '>' . helper::translate('Accueil') . '</option>';
@ -991,7 +990,7 @@ class layout extends common
'help' => 'Gérer les espaces' 'help' => 'Gérer les espaces'
]) . '</li>'; ]) . '</li>';
} }
if ($this->getUser('group') >= self::GROUP_ADMIN) { if ($this->getUser('role') >= self::GROUP_ADMIN) {
$leftItems .= '<li>' . template::ico('brush', [ $leftItems .= '<li>' . template::ico('brush', [
'help' => 'Thème', 'help' => 'Thème',
'href' => helper::baseUrl() . 'theme' 'href' => helper::baseUrl() . 'theme'
@ -999,8 +998,8 @@ class layout extends common
} }
// Liste des pages et bouton de gestion interdit pour l'accueil sauf admin // Liste des pages et bouton de gestion interdit pour l'accueil sauf admin
if ( if (
($this->getUser('group') === self::GROUP_EDITOR && self::$siteContent != 'home') ($this->getUser('role') === self::GROUP_EDITOR && self::$siteContent != 'home')
|| $this->getUser('group') === self::GROUP_ADMIN || $this->getUser('role') === self::GROUP_ADMIN
) { ) {
$leftItems .= '<li><select id="barSelectPage">'; $leftItems .= '<li><select id="barSelectPage">';
$leftItems .= '<option value="">' . helper::translate('Pages du site') . '</option>'; $leftItems .= '<option value="">' . helper::translate('Pages du site') . '</option>';
@ -1123,11 +1122,11 @@ class layout extends common
$rightItems = ''; $rightItems = '';
if ( if (
( (
$this->getUser('group') === self::GROUP_EDITOR $this->getUser('role') === self::GROUP_EDITOR
&& $this->getUser('permission', 'filemanager') === true && $this->getUser('permission', 'filemanager') === true
&& $this->getUser('permission', 'folder', (self::$siteContent === 'home' ? 'homePath' : 'coursePath')) !== 'none' && $this->getUser('permission', 'folder', (self::$siteContent === 'home' ? 'homePath' : 'coursePath')) !== 'none'
) )
|| $this->getUser('group') === self::GROUP_ADMIN || $this->getUser('role') === self::GROUP_ADMIN
) { ) {
$folder = '&fldr=/' . (self::$siteContent === 'home' ? '' : self::$siteContent); $folder = '&fldr=/' . (self::$siteContent === 'home' ? '' : self::$siteContent);
$rightItems .= '<li>' . template::ico('folder', [ $rightItems .= '<li>' . template::ico('folder', [
@ -1138,7 +1137,7 @@ class layout extends common
} }
if ( if (
self::$siteContent === 'home' self::$siteContent === 'home'
&& $this->getUser('group') >= self::GROUP_ADMIN && $this->getUser('role') >= self::GROUP_ADMIN
) { ) {
$rightItems .= '<li>' . template::ico('flag', [ $rightItems .= '<li>' . template::ico('flag', [
'help' => 'Langues', 'help' => 'Langues',
@ -1210,9 +1209,9 @@ class layout extends common
'href' => helper::baseUrl() . 'plugin' 'href' => helper::baseUrl() . 'plugin'
]) . '</li>'; ]) . '</li>';
} }
// Boutons depuis le groupe éditeur // Boutons depuis le role éditeur
if ( if (
$this->getUser('group') >= self::GROUP_EDITOR $this->getUser('role') >= self::GROUP_EDITOR
&& $this->getUser('permission', 'user', 'edit') && $this->getUser('permission', 'user', 'edit')
) { ) {
@ -1298,7 +1297,7 @@ class layout extends common
$vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';'; $vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';';
if ( if (
$this->isConnected() === true $this->isConnected() === true
and $this->getUser('group') >= self::GROUP_EDITOR and $this->getUser('role') >= self::GROUP_EDITOR
) { ) {
$vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';'; $vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';';
} }

View File

@ -254,18 +254,18 @@ class core extends common
// Déterminer la hauteur max du menu pour éviter les débordements // Déterminer la hauteur max du menu pour éviter les débordements
$padding = $this->getData(['theme', 'menu', 'height']); // Par exemple, "10px 20px" // $padding = $this->getData(['theme', 'menu', 'height']); // Par exemple, "10px 20px"
$fontSize = (float) $this->getData(['theme', 'text', 'fontSize']); // Taille de référence en pixels // $fontSize = (float) $this->getData(['theme', 'text', 'fontSize']); // Taille de référence en pixels
$menuFontSize = (float) $this->getData(['theme', 'menu', 'fontSize']); // Taille du menu en em // $menuFontSize = (float) $this->getData(['theme', 'menu', 'fontSize']); // Taille du menu en em
// Extraire la première valeur du padding (par exemple "10px 20px" -> "10px") // Extraire la première valeur du padding (par exemple "10px 20px" -> "10px")
$firstPadding = (float) explode(" ", $padding)[0]; // Nous prenons la première valeur, supposée être en px // $firstPadding = (float) explode(" ", $padding)[0]; // Nous prenons la première valeur, supposée être en px
// Convertir menuFontSize (en em) en pixels // Convertir menuFontSize (en em) en pixels
$menuFontSizeInPx = $menuFontSize * $fontSize; // $menuFontSizeInPx = $menuFontSize * $fontSize;
// Calculer la hauteur totale // Calculer la hauteur totale
$totalHeight = $firstPadding + $fontSize + $menuFontSizeInPx; // $totalHeight = $firstPadding + $fontSize + $menuFontSizeInPx;
// Fixer la hauteur maximale de la barre de menu // Fixer la hauteur maximale de la barre de menu
// $css .= '#menuLeft, nav, a.active {max-height:' . $totalHeight . 'px}'; // $css .= '#menuLeft, nav, a.active {max-height:' . $totalHeight . 'px}';
@ -446,7 +446,7 @@ class core extends common
&& $this->getData(['course', self::$siteContent, 'enrolment']) > 0 && $this->getData(['course', self::$siteContent, 'enrolment']) > 0
// Le userId n'est pas celui d'un admis ni le compte d'un gestionnaire de cet espace // Le userId n'est pas celui d'un admis ni le compte d'un gestionnaire de cet espace
&& ( && (
$this->getUser('group') < common::GROUP_ADMIN $this->getUser('role') < common::GROUP_ADMIN
|| $this->getUser('id') !== $this->getData(['course', common::$siteContent, 'author']) || $this->getUser('id') !== $this->getData(['course', common::$siteContent, 'author'])
) )
) { ) {
@ -473,7 +473,7 @@ class core extends common
// Force la déconnexion des membres bannis ou d'une seconde session // Force la déconnexion des membres bannis ou d'une seconde session
if ( if (
$this->isConnected() === true $this->isConnected() === true
and ($this->getUser('group') === common::GROUP_BANNED and ($this->getUser('role') === common::GROUP_BANNED
or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf']) or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf'])
and $this->getData(['config', 'connect', 'autoDisconnect']) === true) and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
) )
@ -488,7 +488,7 @@ class core extends common
and $this->getUrl(1) !== 'login' and $this->getUrl(1) !== 'login'
and ($this->isConnected() === false and ($this->isConnected() === false
or ($this->isConnected() === true or ($this->isConnected() === true
and $this->getUser('group') < common::GROUP_ADMIN and $this->getUser('role') < common::GROUP_ADMIN
) )
) )
) { ) {
@ -505,11 +505,11 @@ class core extends common
$access = null; $access = null;
if ($this->getData(['page', $this->getUrl(0)]) !== null) { if ($this->getData(['page', $this->getUrl(0)]) !== null) {
if ( if (
$this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR $this->getData(['page', $this->getUrl(0), 'role']) === common::GROUP_VISITOR
or ($this->isConnected() === true or ($this->isConnected() === true
// and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group']) // and $this->getUser('role') >= $this->getData(['page', $this->getUrl(0), 'role'])
// Modification qui tient compte du profil de la page // Modification qui tient compte du profil de la page
and ($this->getUser('group') * 10 + $this->getUser('profil')) >= ($this->getData(['page', $this->getUrl(0), 'group']) * 10 + $this->getData(['page', $this->getUrl(0), 'profil'])) and ($this->getUser('role') * 10 + $this->getUser('profil')) >= ($this->getData(['page', $this->getUrl(0), 'role']) * 10 + $this->getData(['page', $this->getUrl(0), 'profil']))
) )
) { ) {
$access = true; $access = true;
@ -526,7 +526,7 @@ class core extends common
and $this->isConnected() === false and $this->isConnected() === false
) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true ) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true
and $this->isConnected() === true and $this->isConnected() === true
and $this->getUser('group') < common::GROUP_EDITOR and $this->getUser('role') < common::GROUP_EDITOR
) )
) { ) {
$access = false; $access = false;
@ -567,7 +567,10 @@ class core extends common
*/ */
$accessInfo['userName'] = ''; $accessInfo['userName'] = '';
$accessInfo['pageId'] = ''; $accessInfo['pageId'] = '';
if ($this->getData(['user'])) { if (
is_array($this->getData(['user']))
&& empty($this->getData(['user'])) === false
) {
foreach ($this->getData(['user']) as $userId => $userIds) { foreach ($this->getData(['user']) as $userId => $userIds) {
if (!is_null($this->getData(['user', $userId, 'accessUrl']))) { if (!is_null($this->getData(['user', $userId, 'accessUrl']))) {
$t = explode('/', $this->getData(['user', $userId, 'accessUrl'])); $t = explode('/', $this->getData(['user', $userId, 'accessUrl']));
@ -705,11 +708,11 @@ class core extends common
if (array_key_exists($action, $module::$actions)) { if (array_key_exists($action, $module::$actions)) {
$module->$action(); $module->$action();
$output = $module->output; $output = $module->output;
// Check le groupe de l'utilisateur // Check le role de l'utilisateur
if ( if (
($module::$actions[$action] === common::GROUP_VISITOR ($module::$actions[$action] === common::GROUP_VISITOR
or ($this->isConnected() === true or ($this->isConnected() === true
and $this->getUser('group') >= $module::$actions[$action] and $this->getUser('role') >= $module::$actions[$action]
and $this->getUser('permission', $moduleId, $action) and $this->getUser('permission', $moduleId, $action)
) )
) )

View File

@ -884,6 +884,10 @@ class template
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="tableWrapper ' . $attributes['classWrapper'] . '">'; $html = '<div id="' . $attributes['id'] . 'Wrapper" class="tableWrapper ' . $attributes['classWrapper'] . '">';
// Début tableau // Début tableau
$html .= '<table id="' . $attributes['id'] . '" class="table ' . $attributes['class'] . '">'; $html .= '<table id="' . $attributes['id'] . '" class="table ' . $attributes['class'] . '">';
// Pas de tableau d'Id transmis, générer une numérotation
if (empty($rowsId)) {
$rowsId = range(0, count($cols));
}
// Entêtes // Entêtes
if ($head) { if ($head) {
// Début des entêtes // Début des entêtes
@ -891,21 +895,17 @@ class template
$html .= '<tr class="nodrag">'; $html .= '<tr class="nodrag">';
$i = 0; $i = 0;
foreach ($head as $th) { foreach ($head as $th) {
$html .= '<th class="col' . $cols[$i++] . '">' . $th . '</th>'; $html .= '<th id="' . $rowsId[$i] . '" class="col' . $cols[$i++] . '">' . $th . '</th>';
} }
// Fin des entêtes // Fin des entêtes
$html .= '</tr>'; $html .= '</tr>';
$html .= '</thead>'; $html .= '</thead>';
} }
// Pas de tableau d'Id transmis, générer une numérotation
if (empty($rowsId)) {
$rowsId = range(0, count($body));
}
// Début contenu // Début contenu
$j = 0; $j = 0;
foreach ($body as $tr) { foreach ($body as $tr) {
// Id de ligne pour les tableaux drag and drop // Id de ligne pour les tableaux drag and drop
$html .= '<tr id="' . $rowsId[$j++] . '">'; $html .= '<tr>';
$i = 0; $i = 0;
foreach ($tr as $td) { foreach ($tr as $td) {
$html .= '<td class="col' . $cols[$i++] . '">' . $td . '</td>'; $html .= '<td class="col' . $cols[$i++] . '">' . $td . '</td>';

View File

@ -374,12 +374,11 @@ core.start = function () {
var totalHeight = firstPadding + fontSize + menuFontSizeInPx; var totalHeight = firstPadding + fontSize + menuFontSizeInPx;
$("#menuLeft").css({ $("#menuLeft").css({
"visibility": "hidden", "visibility": "hidden",
"overflow": "hidden",
"max-width": "10px" "max-width": "10px"
}); });
// Par défaut pour tous les thèmes. // Par défaut pour tous les thèmes.
$("#menuLeft, nav").css("max-height", totalHeight + "px").css("min-height", totalHeight + "px"); $("#menuLeft").css("max-height", totalHeight + "px").css("min-height", totalHeight + "px");
} }
}; };

View File

@ -28,7 +28,7 @@ class common
const GROUP_VISITOR = 0; const GROUP_VISITOR = 0;
const GROUP_MEMBER = 1; const GROUP_MEMBER = 1;
const GROUP_EDITOR = 2; const GROUP_EDITOR = 2;
// Groupe MODERATOR, compatibilité avec les anciens modules : // Role MODERATOR, compatibilité avec les anciens modules :
const GROUP_MODERATOR = 2; const GROUP_MODERATOR = 2;
const GROUP_ADMIN = 3; const GROUP_ADMIN = 3;
const SIGNATURE_ID = 1; const SIGNATURE_ID = 1;
@ -51,7 +51,7 @@ class common
const ACCESS_TIMER = 1800; const ACCESS_TIMER = 1800;
// Numéro de version // Numéro de version
const ZWII_VERSION = '1.19.03'; const ZWII_VERSION = '1.21.00';
// URL autoupdate // URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/'; const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
@ -821,11 +821,11 @@ class common
// Page parent // Page parent
$this->getData(['page', $pageId, 'parentPageId']) === "" $this->getData(['page', $pageId, 'parentPageId']) === ""
// Ignore les pages dont l'utilisateur n'a pas accès // Ignore les pages dont l'utilisateur n'a pas accès
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR and ($this->getData(['page', $pageId, 'role']) === self::GROUP_VISITOR
or ($this->getUser('authKey') === $this->getInput('ZWII_AUTH_KEY') or ($this->getUser('authKey') === $this->getInput('ZWII_AUTH_KEY')
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) //and $this->getUser('role') >= $this->getData(['page', $pageId, 'role'])
// Modification qui tient compte du profil de la page // Modification qui tient compte du profil de la page
and ($this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])) and ($this->getUser('role') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'role']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']))
) )
) )
@ -848,14 +848,14 @@ class common
// Ignore les pages dont l'utilisateur n'a pas accès // Ignore les pages dont l'utilisateur n'a pas accès
and ( and (
( (
$this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR $this->getData(['page', $pageId, 'role']) === self::GROUP_VISITOR
and and
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR $this->getData(['page', $parentId, 'role']) === self::GROUP_VISITOR
) )
or ( or (
$this->getUser('authKey') === $this->getInput('ZWII_AUTH_KEY') $this->getUser('authKey') === $this->getInput('ZWII_AUTH_KEY')
and and
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']) $this->getUser('role') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'role']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
) )
) )
@ -1042,39 +1042,39 @@ class common
/** /**
* Retourne les permissions de l'utilisateur connecté * Retourne les permissions de l'utilisateur connecté
* @param int $key Clé de la valeur du groupe * @param int $key Clé de la valeur du role
* @return string|null * @return string|null
*/ */
public function getPermission($key1, $key2 = null) public function getPermission($key1, $key2 = null)
{ {
// Administrateur, toutes les permissions // Administrateur, toutes les permissions
if ($this->getUser('group') === self::GROUP_ADMIN) { if ($this->getUser('role') === self::GROUP_ADMIN) {
return true; return true;
} elseif ($this->getUser('group') <= self::GROUP_VISITOR) { // Groupe sans autorisation } elseif ($this->getUser('role') <= self::GROUP_VISITOR) { // Role sans autorisation
return false; return false;
} elseif ( } elseif (
// Groupe avec profil, consultation des autorisations sur deux clés // Role avec profil, consultation des autorisations sur deux clés
$key1 $key1
&& $key2 && $key2
&& $this->user && $this->user
&& $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1]) && $this->getData(['profil', $this->user['role'], $this->user['profil'], $key1])
&& array_key_exists($key2, $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1])) && array_key_exists($key2, $this->getData(['profil', $this->user['role'], $this->user['profil'], $key1]))
) { ) {
return $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1, $key2]); return $this->getData(['profil', $this->user['role'], $this->user['profil'], $key1, $key2]);
// Groupe avec profil, consultation des autorisations sur une seule clé // Role avec profil, consultation des autorisations sur une seule clé
} elseif ( } elseif (
$key1 $key1
&& $this->user && $this->user
&& $this->getData(['profil', $this->user['group'], $this->user['profil']]) && $this->getData(['profil', $this->user['role'], $this->user['profil']])
&& array_key_exists($key1, $this->getData(['profil', $this->user['group'], $this->user['profil']])) && array_key_exists($key1, $this->getData(['profil', $this->user['role'], $this->user['profil']]))
) { ) {
return $this->getData(['profil', $this->user['group'], $this->user['profil'], $key1]); return $this->getData(['profil', $this->user['role'], $this->user['profil'], $key1]);
} else { } else {
// Une permission non spécifiée dans le profil est autorisée selon la valeur de $actions // Une permission non spécifiée dans le profil est autorisée selon la valeur de $actions
if (class_exists($key1)) { if (class_exists($key1)) {
$module = new $key1; $module = new $key1;
if (array_key_exists($key2, $module::$actions)) { if (array_key_exists($key2, $module::$actions)) {
return $this->getUser('group') >= $module::$actions[$key2]; return $this->getUser('role') >= $module::$actions[$key2];
} }
} }
return false; return false;
@ -1169,7 +1169,7 @@ class common
foreach ($this->getHierarchy() as $parentPageId => $childrenPageIds) { foreach ($this->getHierarchy() as $parentPageId => $childrenPageIds) {
// Exclure les barres et les pages non publiques et les pages masquées // Exclure les barres et les pages non publiques et les pages masquées
if ( if (
$this->getData(['page', $parentPageId, 'group']) !== 0 || $this->getData(['page', $parentPageId, 'role']) !== 0 ||
$this->getData(['page', $parentPageId, 'block']) === 'bar' $this->getData(['page', $parentPageId, 'block']) === 'bar'
) { ) {
continue; continue;
@ -1197,7 +1197,7 @@ class common
} }
// Sous-pages // Sous-pages
foreach ($childrenPageIds as $childKey) { foreach ($childrenPageIds as $childKey) {
if ($this->getData(['page', $childKey, 'group']) !== 0 || $this->getData(['page', $childKey, 'disable']) === true) { if ($this->getData(['page', $childKey, 'role']) !== 0 || $this->getData(['page', $childKey, 'disable']) === true) {
continue; continue;
} }
// Cas de la page d'accueil ne pas dupliquer l'URL // Cas de la page d'accueil ne pas dupliquer l'URL
@ -1251,23 +1251,35 @@ class common
} }
/* /**
* Création d'une miniature * Crée une miniature à partir d'une image source.
* Fonction utilisée lors de la mise à jour d'une version 9 à une version 10 * Cette fonction prend en charge les formats raster (JPEG, PNG, GIF, WebP, AVIF) et vectoriels (SVG).
* @param string $src image source * Pour les images vectorielles (SVG), aucune redimension n'est effectuée : une copie est réalisée.
* @param string $dets image destination *
* @param integer $desired_width largeur demandée * @param string $src Chemin de l'image source.
* @param string $dest Chemin de l'image destination (avec le nom du fichier et l'extension).
* @param int $desired_width Largeur demandée pour la miniature (ignorée pour les SVG).
* @return bool True si l'opération a réussi, false sinon.
*/ */
function makeThumb($src, $dest, $desired_width) function makeThumb($src, $dest, $desired_width)
{ {
// Vérifier l'existence du dossier de destination. // Vérifier l'existence du dossier de destination.
$fileInfo = pathinfo($dest); $fileInfo = pathinfo($dest);
if (!is_dir($fileInfo['dirname'])) { if (!is_dir($fileInfo['dirname'])) {
mkdir($fileInfo['dirname'], 0755, true); mkdir($fileInfo['dirname'], 0755, true);
} }
$extension = strtolower($fileInfo['extension']);
$mime_type = mime_content_type($src);
// Gestion des fichiers SVG (copie simple sans redimensionnement)
if ($extension === 'svg' || $mime_type === 'image/svg+xml') {
return copy($src, $dest);
}
// Chargement de l'image source selon le type
$source_image = ''; $source_image = '';
// Type d'image switch ($extension) {
switch ($fileInfo['extension']) {
case 'jpeg': case 'jpeg':
case 'jpg': case 'jpg':
$source_image = imagecreatefromjpeg($src); $source_image = imagecreatefromjpeg($src);
@ -1282,35 +1294,51 @@ class common
$source_image = imagecreatefromwebp($src); $source_image = imagecreatefromwebp($src);
break; break;
case 'avif': case 'avif':
if (function_exists('imagecreatefromavif')) {
$source_image = imagecreatefromavif($src); $source_image = imagecreatefromavif($src);
} else {
return false; // AVIF non supporté
} }
// Image valide break;
if ($source_image) { default:
return false; // Format non pris en charge
}
// Image valide (formats raster uniquement)
if (is_resource($source_image) || (is_object($source_image) && $source_image instanceof GdImage)) {
$width = imagesx($source_image); $width = imagesx($source_image);
$height = imagesy($source_image); $height = imagesy($source_image);
/* find the "desired height" of this thumbnail, relative to the desired width */
// Calcul de la hauteur proportionnelle à la largeur demandée
$desired_height = floor($height * ($desired_width / $width)); $desired_height = floor($height * ($desired_width / $width));
/* create a new, "virtual" image */
// Création d'une nouvelle image virtuelle redimensionnée
$virtual_image = imagecreatetruecolor($desired_width, $desired_height); $virtual_image = imagecreatetruecolor($desired_width, $desired_height);
/* copy source image at a resized size */
// Copie de l'image source dans l'image virtuelle avec redimensionnement
imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height); imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);
switch (mime_content_type($src)) {
// Enregistrement de l'image redimensionnée au format approprié
switch ($mime_type) {
case 'image/jpeg': case 'image/jpeg':
case 'image/jpg': case 'image/jpg':
return (imagejpeg($virtual_image, $dest)); return imagejpeg($virtual_image, $dest);
case 'image/png': case 'image/png':
return (imagepng($virtual_image, $dest)); return imagepng($virtual_image, $dest);
case 'image/gif': case 'image/gif':
return (imagegif($virtual_image, $dest)); return imagegif($virtual_image, $dest);
case 'image/webp': case 'image/webp':
return (imagewebp($virtual_image, $dest)); return imagewebp($virtual_image, $dest);
case 'image/avif': case 'image/avif':
return (imageavif($virtual_image, $dest)); if (function_exists('imageavif')) {
} return imageavif($virtual_image, $dest);
} else {
return (false);
} }
} }
}
return false; // En cas d'échec
}
/** /**
@ -1596,7 +1624,7 @@ class common
$courses = $this->getData([('course')]); $courses = $this->getData([('course')]);
$courses = helper::arraycolumn($courses, 'title', 'SORT_ASC'); $courses = helper::arraycolumn($courses, 'title', 'SORT_ASC');
$filter = array(); $filter = array();
switch ($this->getUser('group')) { switch ($this->getUser('role')) {
case self::GROUP_ADMIN: case self::GROUP_ADMIN:
// Affiche tout // Affiche tout
return $courses; return $courses;

View File

@ -3,20 +3,17 @@
/** /**
* Vérification de la version de PHP * Vérification de la version de PHP
*/ */
if (version_compare(PHP_VERSION, '7.2.0', '<')) {
if(version_compare(PHP_VERSION, '7.2.0', '<') ) { displayErrorPage('PHP 7.2+ mini requis - PHP 7.2+ mini required');
exit('PHP 7.2+ mini requis - PHP 7.2+ mini required');
} }
if ( version_compare(PHP_VERSION, '8.3.999', '>') ) { if (version_compare(PHP_VERSION, '8.3.999', '>')) {
exit('PHP 8.3 pas encore supporté, installez PHP 7.n ou PHP 8.1.n - PHP 8.3 not yet supported, install PHP 7.n or PHP 8.1.n'); displayErrorPage('PHP 8.3 pas encore supporté, installez PHP 7.n ou PHP 8.1.n - PHP 8.3 not yet supported, install PHP 7.n or PHP 8.1.n');
} }
/** /**
* Check les modules installés * Check les modules installés
*/ */
$e = [ $e = [
'gd', 'gd',
'json', 'json',
@ -31,18 +28,22 @@ $e = [
]; ];
$m = get_loaded_extensions(); $m = get_loaded_extensions();
$b = false; $b = false;
$missingModules = [];
foreach ($e as $k => $v) { foreach ($e as $k => $v) {
if (array_search($v,$m) === false) { if (array_search($v, $m) === false) {
$b = true; $b = true;
echo '<pre><p>Module PHP : ' . $v . ' manquant - Module PHP ' . $v . ' missing.</p></pre>'; $missingModules[] = $v;
} }
} }
if ($b) if ($b) {
exit('<pre><p>ZwiiCMS ne peut pas démarrer ; activez les extensions requises dans PHP.ini- ZwiiCMS cannot start, enabled PHP missing extensions into PHP.ini</p></pre>'); $errorMessage = 'ZwiiCMS ne peut pas démarrer ; les modules PHP suivants sont manquants : ' . implode(', ', $missingModules) . '<br />';
/** $errorMessage .= 'ZwiiCMS cannot start, the following PHP modules are missing: ' . implode(', ', $missingModules);
* Contrôle les htacess displayErrorPage($errorMessage);
*/ }
/**
* Contrôle les htaccess
*/
$d = [ $d = [
'', '',
'site/data/', 'site/data/',
@ -51,6 +52,33 @@ $d = [
// 'site/i18n/', pas contrôler pour éviter les pbs de mise à jour // 'site/i18n/', pas contrôler pour éviter les pbs de mise à jour
]; ];
foreach ($d as $key) { foreach ($d as $key) {
if (file_exists($key . '.htaccess') === false) if (file_exists($key . '.htaccess') === false) {
exit('<pre>ZwiiCMS ne peut pas démarrer, le fichier ' .$key . '.htaccess est manquant.<br />ZwiiCMS cannot start, file ' . $key . '.htaccess is missing.</pre>' ); $errorMessage = 'ZwiiCMS ne peut pas démarrer, le fichier ' . $key . '.htaccess est manquant.<br />';
$errorMessage .= 'ZwiiCMS cannot start, file ' . $key . '.htaccess is missing.';
displayErrorPage($errorMessage);
}
}
/**
* Fonction pour afficher une page d'erreur stylisée
*/
function displayErrorPage($message)
{
echo '<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Erreur - ZwiiCMS</title>
<link rel="stylesheet" href="core\layout\error.css">
</head>
<body>
<div class="error-container">
<h1>Erreur</h1>
<p>' . $message . '</p>
</div>
</body>
</html>';
exit;
} }

View File

@ -9,20 +9,19 @@ if (
$this->getData(['core', 'dataVersion']) < 1700 $this->getData(['core', 'dataVersion']) < 1700
) { ) {
// Supprime la variable path des profils, seul l'accès à l'espace et autorisé. // Supprime la variable path des profils, seul l'accès à l'espace et autorisé.
foreach (['1', '2'] as $group) { foreach (['1', '2'] as $role) {
foreach (array_keys($this->getData(['profil', $group])) as $profil) { foreach (array_keys($this->getData(['profil', $role])) as $profil) {
if (is_null($this->getData(['profil', $group, $profil, 'folder', 'path'])) === false) { if (is_null($this->getData(['profil', $role, $profil, 'folder', 'path'])) === false) {
$path = $this->getData(['profil', $group, $profil, 'folder', 'path']); $path = $this->getData(['profil', $role, $profil, 'folder', 'path']);
$this->setData(['profil', $group, $profil, 'folder', 'homePath', $path]); $this->setData(['profil', $role, $profil, 'folder', 'homePath', $path]);
$this->setData(['profil', $group, $profil, 'folder', 'coursePath', $path]); $this->setData(['profil', $role, $profil, 'folder', 'coursePath', $path]);
$this->deleteData(['profil', $group, $profil, 'folder', 'path']); $this->deleteData(['profil', $role, $profil, 'folder', 'path']);
} }
} }
} }
$this->setData(['core', 'dataVersion', 1700]); $this->setData(['core', 'dataVersion', 1700]);
} }
if ( if (
$this->getData(['core', 'dataVersion']) < 1800 $this->getData(['core', 'dataVersion']) < 1800
) { ) {
@ -46,3 +45,60 @@ if (
} }
$this->setData(['core', 'dataVersion', 1800]); $this->setData(['core', 'dataVersion', 1800]);
} }
if (
$this->getData(['core', 'dataVersion']) < 12002
) {
/**
* Installe dans le thème du menu la variable hidePages
**/
// Tableau à insérer
$a = [
'theme' =>
['menu' => [
'hidePages' => false
]]
];
// Parcourir la structure pour écrire dans les fichiers JSON
foreach ($this->getData(['course']) as $courseId => $courseValues) {
$d = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/theme.json'), true);
// Insérer la variable hidePages si elle n'existe pas
if (isset($d['theme']['menu']['hidePages']) === false) {
$result = array_replace_recursive($d, $a);
file_put_contents(self::DATA_DIR . $courseId . '/theme.json', json_encode($result, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
}
// Forcer la régénération du fichier theme.css
if (file_exists(self::DATA_DIR . $courseId . '/theme.css')) {
unlink(self::DATA_DIR . $courseId . '/theme.css');
}
}
$this->setData(['core', 'dataVersion', 12002]);
}
if (
$this->getData(['core', 'dataVersion']) < 12100
) {
// Renommer Group en Role
if (
is_array($this->getData(['user']))
&& empty($this->getData(['user'])) === false
) {
$t = $this->getData(['user']);
foreach ($t as $userId => $userValue) {
$d = $this->getData(['user', $userId]);
if (isset($d['group']) && $d['group'] !== '') {
$position = array_search('group', array_keys($d)) + 1;
$l = array_merge(
array_slice($d, 0, $position),
['role' => $d['group']],
array_slice($d, $position)
);
unset($l['group']);
$this->setData(['user', $userId, $l], false);
}
}
}
$this->saveDb('user');
//$this->setData(['core', 'dataVersion', 12100]);
}

View File

@ -657,6 +657,7 @@ nav a:hover {
#menuLeft { #menuLeft {
display: inline-flex; display: inline-flex;
float: left;
} }
#menuRight { #menuRight {

22
core/layout/error.css Normal file
View File

@ -0,0 +1,22 @@
body {
color: #000;
font: 75%/1.7em "Helvetica Neue", Helvetica, arial, sans-serif;
margin: 0;
padding: 80px;
background: url('../vendor/zwiico/png/error.png') 30px 30px no-repeat #fff;
}
h1 {
font-weight: bold;
color: #000;
font-size: 300%;
margin: 20px 0;
padding: 0;
}
p {
margin: 10px 0;
color: #777;
font-size: 16px;
line-height: 1.6;
}

View File

@ -35,7 +35,7 @@
</head> </head>
<body> <body>
<!-- Barre d'administration --> <!-- Barre d'administration -->
<?php if ($this->getUser('group') > self::GROUP_MEMBER) : ?> <?php if ($this->getUser('role') > self::GROUP_MEMBER) : ?>
<?php $layout->showBar(); ?> <?php $layout->showBar(); ?>
<?php endif; ?> <?php endif; ?>
<!-- Notifications --> <!-- Notifications -->
@ -48,7 +48,7 @@
$this->getData(['theme', 'menu', 'position']) === 'top' $this->getData(['theme', 'menu', 'position']) === 'top'
and $this->getData(['theme', 'menu', 'fixed']) === true and $this->getData(['theme', 'menu', 'fixed']) === true
and $this->isConnected() === true and $this->isConnected() === true
and $this->getUser('group') > self::GROUP_MEMBER and $this->getUser('role') > self::GROUP_MEMBER
) { ) {
echo '<nav id="navfixedconnected" >'; echo '<nav id="navfixedconnected" >';
} else { } else {

View File

@ -41,7 +41,7 @@
<?php echo template::select('connectAuthMail', array_merge([0 => 'Aucune'], self::$groupNews), [ <?php echo template::select('connectAuthMail', array_merge([0 => 'Aucune'], self::$groupNews), [
'label' => 'Validation par clé ⚠️', 'label' => 'Validation par clé ⚠️',
'selected' => $this->getData(['config', 'connect', 'mailAuth']), 'selected' => $this->getData(['config', 'connect', 'mailAuth']),
'help' => 'La connexion est confirmée à l\'aide d\'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.' 'help' => 'La connexion est confirmée à l\'aide d\'une clé transmise par messagerie. Depuis le role sélectionné et les groupes supérieurs.'
]); ?> ]); ?>
</div> </div>
<div class="col3 verticalAlignBottom"> <div class="col3 verticalAlignBottom">

View File

@ -44,7 +44,7 @@
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [ <?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
'checked' => helper::checkRewrite(), 'checked' => helper::checkRewrite(),
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web', 'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
'disabled' => helper::checkServerSoftware() === false and config->isModRewriteEnabled() 'disabled' => helper::checkServerSoftware() === false and self::isModRewriteEnabled()
]); ?> ]); ?>
</div> </div>
</div> </div>

View File

@ -94,7 +94,7 @@ class course extends common
if ( if (
$this->getUser('id') $this->getUser('id')
&& $this->getUser('group') && $this->getUser('role')
) { ) {
foreach ($this->getData(['course']) as $courseId => $courseValue) { foreach ($this->getData(['course']) as $courseId => $courseValue) {
/** /**
@ -156,7 +156,7 @@ class course extends common
// Accès limité aux admins // Accès limité aux admins
if ( if (
$this->getUser('group') !== self::GROUP_ADMIN $this->getUser('role') !== self::GROUP_ADMIN
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -231,7 +231,7 @@ class course extends common
// Liste des enseignants pour le sélecteur d'auteurs // Liste des enseignants pour le sélecteur d'auteurs
$teachers = $this->getData(['user']); $teachers = $this->getData(['user']);
foreach ($teachers as $teacherId => $teacherInfo) { foreach ($teachers as $teacherId => $teacherInfo) {
if ($teacherInfo["group"] >= 2) { if ($teacherInfo["role"] >= 2) {
self::$courseTeachers[$teacherId] = $teacherInfo["firstname"] . ' ' . $teacherInfo["lastname"]; self::$courseTeachers[$teacherId] = $teacherInfo["firstname"] . ' ' . $teacherInfo["lastname"];
} }
} }
@ -307,7 +307,7 @@ class course extends common
// Liste des enseignants pour le sélecteur d'auteurs // Liste des enseignants pour le sélecteur d'auteurs
$teachers = $this->getData(['user']); $teachers = $this->getData(['user']);
foreach ($teachers as $teacherId => $teacherInfo) { foreach ($teachers as $teacherId => $teacherInfo) {
if ($teacherInfo["group"] >= 2) { if ($teacherInfo["role"] >= 2) {
self::$courseTeachers[$teacherId] = $teacherInfo["firstname"] . ' ' . $teacherInfo["lastname"]; self::$courseTeachers[$teacherId] = $teacherInfo["firstname"] . ' ' . $teacherInfo["lastname"];
} }
} }
@ -339,7 +339,7 @@ class course extends common
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => sprintf('%s %s (%s)', helper::translate('Editer l\'espace'), $this->getData(['course', $courseId, 'title' ]), $this->getUrl(2)), 'title' => sprintf('%s %s (%s)', helper::translate('Editer l\'espace'), $this->getData(['course', $courseId, 'title']), $this->getUrl(2)),
'view' => 'edit' 'view' => 'edit'
]); ]);
} }
@ -366,7 +366,7 @@ class course extends common
// Liste des enseignants pour le sélecteur d'auteurs // Liste des enseignants pour le sélecteur d'auteurs
$teachers = $this->getData(['user']); $teachers = $this->getData(['user']);
foreach ($teachers as $teacherId => $teacherInfo) { foreach ($teachers as $teacherId => $teacherInfo) {
if ($teacherInfo["group"] >= 2) { if ($teacherInfo["role"] >= 2) {
self::$courseTeachers[$teacherId] = $teacherInfo["firstname"] . ' ' . $teacherInfo["lastname"]; self::$courseTeachers[$teacherId] = $teacherInfo["firstname"] . ' ' . $teacherInfo["lastname"];
} }
} }
@ -398,7 +398,7 @@ class course extends common
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => sprintf('%s %s (%s)', helper::translate('Gérer l\'espace'), $this->getData(['course', $courseId, 'title' ]), $this->getUrl(2)), 'title' => sprintf('%s %s (%s)', helper::translate('Gérer l\'espace'), $this->getData(['course', $courseId, 'title']), $this->getUrl(2)),
'view' => 'manage' 'view' => 'manage'
]); ]);
} }
@ -414,7 +414,7 @@ class course extends common
// Accès limité aux admins, à l'auteur ou éditeurs inscrits // Accès limité aux admins, à l'auteur ou éditeurs inscrits
if ( if (
$this->getUser('group') !== self::$actions[__FUNCTION__] $this->getUser('role') !== self::$actions[__FUNCTION__]
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -447,7 +447,7 @@ class course extends common
if ( if (
// Accès limité aux admins // Accès limité aux admins
$this->getUser('group') !== self::$actions[__FUNCTION__] $this->getUser('role') !== self::$actions[__FUNCTION__]
// Le contenu n'existe pas // Le contenu n'existe pas
|| $this->getData(['course', $courseId]) === null || $this->getData(['course', $courseId]) === null
) { ) {
@ -487,7 +487,7 @@ class course extends common
if ( if (
// Accès limité aux admins // Accès limité aux admins
$this->getUser('group') !== self::$actions[__FUNCTION__] $this->getUser('role') !== self::$actions[__FUNCTION__]
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -526,7 +526,7 @@ class course extends common
if ( if (
// Accès limité aux admins // Accès limité aux admins
$this->getUser('group') !== self::$actions[__FUNCTION__] $this->getUser('role') !== self::$actions[__FUNCTION__]
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -557,7 +557,7 @@ class course extends common
{ {
if ( if (
// Accès limité aux admins // Accès limité aux admins
$this->getUser('group') !== self::$actions[__FUNCTION__] $this->getUser('role') !== self::$actions[__FUNCTION__]
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -592,7 +592,7 @@ class course extends common
if ( if (
// Accès limité aux admins // Accès limité aux admins
$this->getUser('group') !== self::$actions[__FUNCTION__] $this->getUser('role') !== self::$actions[__FUNCTION__]
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -652,7 +652,7 @@ class course extends common
case "2": case "2":
foreach ($groupValue as $profilId => $profilValue) { foreach ($groupValue as $profilId => $profilValue) {
if ($profilId) { if ($profilId) {
self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Role %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
$profils[$groupId . $profilId] = 0; $profils[$groupId . $profilId] = 0;
} }
} }
@ -682,20 +682,20 @@ class course extends common
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Compte les rôles valides // Compte les rôles valides
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset($profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])]++;
} }
// Filtres // Filtres
if ($this->isPost()) { if ($this->isPost()) {
// Groupe et profils // Role et profils
$group = (string) $this->getData(['user', $userId, 'group']); $role = (string) $this->getData(['user', $userId, 'role']);
$profil = (string) $this->getData(['user', $userId, 'profil']); $profil = (string) $this->getData(['user', $userId, 'profil']);
$firstName = $this->getData(['user', $userId, 'firstname']); $firstName = $this->getData(['user', $userId, 'firstname']);
$lastName = $this->getData(['user', $userId, 'lastname']); $lastName = $this->getData(['user', $userId, 'lastname']);
if ( if (
$this->getInput('courseFilterGroup', helper::FILTER_INT) > 0 $this->getInput('courseFilterGroup', helper::FILTER_INT) > 0
&& $this->getInput('courseFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil && $this->getInput('courseFilterGroup', helper::FILTER_STRING_SHORT) !== $role . $profil
) )
continue; continue;
// Première lettre du prénom // Première lettre du prénom
@ -736,17 +736,15 @@ class course extends common
} }
self::$courseUsers[] = [ self::$courseUsers[] = [
//$userId, //$userId,
sprintf('%s %s',$this->getData(['user', $userId, 'lastname']), $this->getData(['user', $userId, 'firstname'])), sprintf('%s %s', $this->getData(['user', $userId, 'lastname']), $this->getData(['user', $userId, 'firstname'])),
array_key_exists('lastPageView', $userValue) && isset($pages[$userValue['lastPageView']]['title']) array_key_exists('lastPageView', $userValue) && isset($pages['page'][$userValue['lastPageView']]['title'])
? $pages[$userValue['lastPageView']]['title'] ? $pages['page'][$userValue['lastPageView']]['title']
: '',
array_key_exists('lastPageView', $userValue)
? helper::dateUTF8('%d/%m/%Y', $userValue['datePageView'])
: '',
array_key_exists('datePageView', $userValue)
? helper::dateUTF8('%H:%M', $userValue['datePageView'])
: '', : '',
$this->getData(['user', $userId, 'tags']), $this->getData(['user', $userId, 'tags']),
array_key_exists('lastPageView', $userValue)
// ? helper::dateUTF8('%d/%m/%Y', $userValue['datePageView'])
? $userValue['datePageView']
: '',
$reportButton, $reportButton,
template::button('userDelete' . $userId, [ template::button('userDelete' . $userId, [
'class' => 'userDelete buttonRed', 'class' => 'userDelete buttonRed',
@ -825,7 +823,7 @@ class course extends common
case "2": case "2":
foreach ($groupValue as $profilId => $profilValue) { foreach ($groupValue as $profilId => $profilValue) {
if ($profilId) { if ($profilId) {
self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Role %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
$profils[$groupId . $profilId] = 0; $profils[$groupId . $profilId] = 0;
} }
} }
@ -852,8 +850,8 @@ class course extends common
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Compte les rôles // Compte les rôles
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset($profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])]++;
} }
// Filtres // Filtres
@ -863,14 +861,14 @@ class course extends common
|| isset($_POST['courseFilterLastName']) || isset($_POST['courseFilterLastName'])
) { ) {
// Groupe et profils // Role et profils
$group = (string) $this->getData(['user', $userId, 'group']); $role = (string) $this->getData(['user', $userId, 'role']);
$profil = (string) $this->getData(['user', $userId, 'profil']); $profil = (string) $this->getData(['user', $userId, 'profil']);
$firstName = $this->getData(['user', $userId, 'firstname']); $firstName = $this->getData(['user', $userId, 'firstname']);
$lastName = $this->getData(['user', $userId, 'lastname']); $lastName = $this->getData(['user', $userId, 'lastname']);
if ( if (
$this->getInput('courseFilterGroup', helper::FILTER_INT) > 0 $this->getInput('courseFilterGroup', helper::FILTER_INT) > 0
&& $this->getInput('courseFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil && $this->getInput('courseFilterGroup', helper::FILTER_STRING_SHORT) !== $role . $profil
) )
continue; continue;
// Première lettre du prénom // Première lettre du prénom
@ -993,7 +991,7 @@ class course extends common
case "2": case "2":
foreach ($groupValue as $profilId => $profilValue) { foreach ($groupValue as $profilId => $profilValue) {
if ($profilId) { if ($profilId) {
self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Role %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
$profils[$groupId . $profilId] = 0; $profils[$groupId . $profilId] = 0;
} }
} }
@ -1015,8 +1013,8 @@ class course extends common
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Compte les rôles // Compte les rôles
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset($profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])]++;
} }
// Filtres // Filtres
@ -1026,14 +1024,14 @@ class course extends common
|| isset($_POST['courseFilterLastName']) || isset($_POST['courseFilterLastName'])
) { ) {
// Groupe et profils // Role et profils
$group = (string) $this->getData(['user', $userId, 'group']); $role = (string) $this->getData(['user', $userId, 'role']);
$profil = (string) $this->getData(['user', $userId, 'profil']); $profil = (string) $this->getData(['user', $userId, 'profil']);
$firstName = $this->getData(['user', $userId, 'firstname']); $firstName = $this->getData(['user', $userId, 'firstname']);
$lastName = $this->getData(['user', $userId, 'lastname']); $lastName = $this->getData(['user', $userId, 'lastname']);
if ( if (
$this->getInput('courseFilterGroup', helper::FILTER_INT) > 0 $this->getInput('courseFilterGroup', helper::FILTER_INT) > 0
&& $this->getInput('courseFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil && $this->getInput('courseFilterGroup', helper::FILTER_STRING_SHORT) !== $role . $profil
) )
continue; continue;
// Première lettre du prénom // Première lettre du prénom
@ -1846,7 +1844,7 @@ class course extends common
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => sprintf('%s %s (%s)', helper::translate('Export des pages de l\'espace'), $this->getData(['course', $courseId, 'title' ]), $this->getUrl(2)), 'title' => sprintf('%s %s (%s)', helper::translate('Export des pages de l\'espace'), $this->getData(['course', $courseId, 'title']), $this->getUrl(2)),
'view' => 'export' 'view' => 'export'
]); ]);
} }
@ -1894,7 +1892,7 @@ class course extends common
) { ) {
// Récupérer le dossier du profil // Récupérer le dossier du profil
$userPath = $this->getData(['profil', $this->getuser('group'), $this->getuser('profil'), 'folder', 'path']); $userPath = $this->getData(['profil', $this->getuser('role'), $this->getuser('profil'), 'folder', 'path']);
$userPath = $userPath === '' ? self::$siteContent : $userPath; $userPath = $userPath === '' ? self::$siteContent : $userPath;
// Fichier avec le bon chemin selon le profil // Fichier avec le bon chemin selon le profil
$zipName = self::FILE_DIR . 'source/' . $userPath . '/' . $this->getInput('courseRestoreFile', null, true); $zipName = self::FILE_DIR . 'source/' . $userPath . '/' . $this->getInput('courseRestoreFile', null, true);
@ -2005,13 +2003,13 @@ class course extends common
*/ */
public function permissionControl($function, $courseId) public function permissionControl($function, $courseId)
{ {
switch ($this->getUser('group')) { switch ($this->getUser('role')) {
case self::GROUP_ADMIN: case self::GROUP_ADMIN:
return true; return true;
case self::GROUP_EDITOR: case self::GROUP_EDITOR:
return ( return (
$this->getUser('permission', __CLASS__, $function) $this->getUser('permission', __CLASS__, $function)
&& $this->getUser('group') === self::$actions[$function] && $this->getUser('role') === self::$actions[$function]
&& &&
// Permission d'accéder aux espaces dans lesquels le membre auteur // Permission d'accéder aux espaces dans lesquels le membre auteur
( (
@ -2045,7 +2043,7 @@ class course extends common
// Si un utilisateur connecté est admin ou auteur, c'est autorisé // Si un utilisateur connecté est admin ou auteur, c'est autorisé
if ( if (
$this->isConnected() === true && $this->isConnected() === true &&
($this->getUser('group') === self::GROUP_ADMIN || ($this->getUser('role') === self::GROUP_ADMIN ||
$this->getUser('id') === $this->getData(['course', $courseId, 'author'])) $this->getUser('id') === $this->getData(['course', $courseId, 'author']))
) { ) {
return true; return true;
@ -2152,8 +2150,8 @@ class course extends common
private function courseIsUserEnroled($courseId) private function courseIsUserEnroled($courseId)
{ {
$userId = $this->getUser('id'); $userId = $this->getUser('id');
$group = $userId ? $this->getData(['user', $userId, 'group']) : null; $role = $userId ? $this->getData(['user', $userId, 'role']) : null;
switch ($group) { switch ($role) {
case self::GROUP_ADMIN: case self::GROUP_ADMIN:
$r = true; $r = true;
break; break;

View File

@ -3,7 +3,7 @@
<?php echo template::button('courseUserHistoryBack', [ <?php echo template::button('courseUserHistoryBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
// Le retour est différent selon que c'est un admin ou un tuteur ou l'utilisateur lui-même // Le retour est différent selon que c'est un admin ou un tuteur ou l'utilisateur lui-même
'href' => $this->getUser('group') === self::GROUP_MEMBER ? helper::baseUrl(false) : helper::baseUrl() . 'course/users/' . $this->getUrl(2), 'href' => $this->getUser('role') === self::GROUP_MEMBER ? helper::baseUrl(false) : helper::baseUrl() . 'course/users/' . $this->getUrl(2),
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div> </div>
@ -13,7 +13,7 @@
'value' => template::ico('download'), 'value' => template::ico('download'),
'help' => 'Exporter rapport', 'help' => 'Exporter rapport',
// Le memebre ne peut pas exporter // Le memebre ne peut pas exporter
'disabled' => $this->getUser('group') === self::GROUP_MEMBER 'disabled' => $this->getUser('role') === self::GROUP_MEMBER
]) ?> ]) ?>
</div> </div>
</div> </div>

View File

@ -21,7 +21,6 @@ $(document).ready((function () {
$(location).attr("href", _this.attr("href")) $(location).attr("href", _this.attr("href"))
})) }))
})); }));
$.fn.dataTable.moment( 'DD/MM/YYYY' );
$('#dataTables').DataTable({ $('#dataTables').DataTable({
language: { language: {
url: "core/vendor/datatables/french.json" url: "core/vendor/datatables/french.json"
@ -32,11 +31,17 @@ $(document).ready((function () {
"lengthMenu": [[10, 25, 50, 100, 299, -1], [10, 25, 50, 100, 200, "Tout"]], "lengthMenu": [[10, 25, 50, 100, 299, -1], [10, 25, 50, 100, 200, "Tout"]],
"columnDefs": [ "columnDefs": [
{ {
target: 6, targets: 3,
type: 'numeric',
render: function (data) {
return moment(data * 1000).format('DD/MM/YYYY HH:mm');
}
},
{
targets: 5,
orderable: false, orderable: false,
searchable: false searchable: false
} }]
]
}); });
})); }));

View File

@ -53,7 +53,7 @@
</div> </div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>
<?php if (course::$courseUsers): ?> <?php if (course::$courseUsers): ?>
<?php echo template::table([3, 4, 1, 1, 1, 1, 1], course::$courseUsers, ['Nom Prénom', 'Dernière page vue', 'Date' , 'Heure', 'Étiquettes', 'Progression', ''], ['id' => 'dataTables']); ?> <?php echo template::table([3, 3, 2, 2, 1, 1], course::$courseUsers, ['Nom Prénom', 'Dernière page vue', 'Date' , 'Étiquettes', 'Progression', ''], ['id' => 'dataTables']); ?>
<?php else: ?> <?php else: ?>
<?php echo template::speech('Aucun participant'); ?> <?php echo template::speech('Aucun participant'); ?>
<?php endif; ?> <?php endif; ?>

View File

@ -135,7 +135,7 @@ class install extends common
[ [
'firstname' => $userFirstname, 'firstname' => $userFirstname,
'forgot' => 0, 'forgot' => 0,
'group' => self::GROUP_ADMIN, 'role' => self::GROUP_ADMIN,
'profil' => 0, 'profil' => 0,
'lastname' => $userLastname, 'lastname' => $userLastname,
'pseudo' => 'Admin', 'pseudo' => 'Admin',

View File

@ -64,7 +64,7 @@ class init extends common
] ]
], ],
'core' => [ 'core' => [
'dataVersion' => 1700, 'dataVersion' => 12002,
'lastBackup' => 0, 'lastBackup' => 0,
'lastClearTmp' => 0, 'lastClearTmp' => 0,
'lastAutoUpdate' => 0, 'lastAutoUpdate' => 0,
@ -645,7 +645,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 1, 'position' => 1,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Accueil', 'title' => 'Accueil',
@ -676,7 +676,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 6, 'position' => 6,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Contact', 'title' => 'Contact',
@ -707,7 +707,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 0, 'position' => 0,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Mentions légales', 'title' => 'Mentions légales',
@ -739,7 +739,7 @@ class init extends common
'modulePosition' => '', 'modulePosition' => '',
'parentPageId' => '', 'parentPageId' => '',
'position' => 0, 'position' => 0,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Maintenance en cours', 'title' => 'Maintenance en cours',
@ -771,7 +771,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 0, 'position' => 0,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Erreur 403', 'title' => 'Erreur 403',
@ -802,7 +802,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 0, 'position' => 0,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Erreur 404', 'title' => 'Erreur 404',
@ -903,7 +903,8 @@ class init extends common
'selectSpace' => true, 'selectSpace' => true,
'burgerLogo' => '', 'burgerLogo' => '',
'burgerContent' => 'title', 'burgerContent' => 'title',
'width' => 'container' 'width' => 'container',
'hidePages' => false,
], ],
'site' => [ 'site' => [
'backgroundColor' => 'rgba(255, 255, 255, 1)', 'backgroundColor' => 'rgba(255, 255, 255, 1)',
@ -937,7 +938,7 @@ class init extends common
'config' => [ 'config' => [
'button' => '', 'button' => '',
'captcha' => true, 'captcha' => true,
'group' => self::GROUP_ADMIN, 'role' => self::GROUP_ADMIN,
'pageId' => '', 'pageId' => '',
'subject' => '' 'subject' => ''
], ],
@ -1064,7 +1065,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 1, 'position' => 1,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Sommaire', 'title' => 'Sommaire',
@ -1095,7 +1096,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 1, 'position' => 1,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Première page', 'title' => 'Première page',
@ -1126,7 +1127,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 1, 'position' => 1,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Seconde page', 'title' => 'Seconde page',
@ -1157,7 +1158,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 1, 'position' => 1,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Troisième page', 'title' => 'Troisième page',
@ -1188,7 +1189,7 @@ class init extends common
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'parentPageId' => '', 'parentPageId' => '',
'position' => 0, 'position' => 0,
'group' => 0, 'role' => 0,
'profil' => 0, 'profil' => 0,
'targetBlank' => false, 'targetBlank' => false,
'title' => 'Menu', 'title' => 'Menu',

View File

@ -261,9 +261,9 @@
"Grande (220%)": "Grande (220%)", "Grande (220%)": "Grande (220%)",
"Grande (300px)": "Grande (300px)", "Grande (300px)": "Grande (300px)",
"Gras": "Bold", "Gras": "Bold",
"Groupe": "Group", "Role": "role",
"Groupe associé": "Associated Group", "Role associé": "Associated role",
"Groupe requis pour accéder à la page :": "Group required to access the page:", "Role requis pour accéder à la page :": "role required to access the page:",
"Groupes": "Groups", "Groupes": "Groups",
"Générer sitemap.xml et robots.txt": "Generate sitemap.xml and robots.txt", "Générer sitemap.xml et robots.txt": "Generate sitemap.xml and robots.txt",
"Générer une capture Open Graph": "Generate an Open Graph capture", "Générer une capture Open Graph": "Generate an Open Graph capture",
@ -295,7 +295,7 @@
"Importer dans": "Import into", "Importer dans": "Import into",
"Importer des utilisateurs en masse": "Import mass users", "Importer des utilisateurs en masse": "Import mass users",
"Impossible d'ouvrir l'archive": "Impossible to open the archive", "Impossible d'ouvrir l'archive": "Impossible to open the archive",
"Impossible de modifier votre propre groupe.": "Unable to modify your own group.", "Impossible de modifier votre propre role.": "Unable to modify your own role.",
"Impossible de soumettre le formulaire, car il contient des erreurs": "Unable to submit the form, as it contains errors", "Impossible de soumettre le formulaire, car il contient des erreurs": "Unable to submit the form, as it contains errors",
"Impossible de supprimer une page contenant des pages enfants": "Unable to delete a page containing children's pages", "Impossible de supprimer une page contenant des pages enfants": "Unable to delete a page containing children's pages",
"Impossible de supprimer votre propre compte": "Unable to delete your own account", "Impossible de supprimer votre propre compte": "Unable to delete your own account",
@ -489,7 +489,7 @@
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "To define the page as a sidebar, choose the option from the list.", "Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "To define the page as a sidebar, choose the option from the list.",
"Presse Papier": "Clipboard", "Presse Papier": "Clipboard",
"Presse papier": "Clipboard", "Presse papier": "Clipboard",
"Profils des groupes": "Group Profiles", "Profils des groupes": "role Profiles",
"Proportionnelle à la taille définie dans le site.": "Proportional to the size defined in the site.", "Proportionnelle à la taille définie dans le site.": "Proportional to the size defined in the site.",
"Prénom": "First name", "Prénom": "First name",
"Prénom Nom": "First name Name", "Prénom Nom": "First name Name",
@ -695,7 +695,7 @@
"Message de test envoyé avec succès": "Test message sent successfully", "Message de test envoyé avec succès": "Test message sent successfully",
"Message non envoyé": "Message not sent", "Message non envoyé": "Message not sent",
"Validation par clé ⚠️": "Key-based validation ⚠️", "Validation par clé ⚠️": "Key-based validation ⚠️",
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "The connection is confirmed using a key sent via messaging. From the selected group and the higher groups.", "La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le role sélectionné et les groupes supérieurs.": "The connection is confirmed using a key sent via messaging. From the selected role and the higher groups.",
"Envoi du message d'authentification": "Sending authentication message", "Envoi du message d'authentification": "Sending authentication message",
"Connexion réussie": "Login successful", "Connexion réussie": "Login successful",
"Erreur de mot de passe": "Password error", "Erreur de mot de passe": "Password error",

View File

@ -261,9 +261,9 @@
"Grande (220%)": "Grande (220%)", "Grande (220%)": "Grande (220%)",
"Grande (300px)": "Grande (300px)", "Grande (300px)": "Grande (300px)",
"Gras": "Negrita", "Gras": "Negrita",
"Groupe": "Grupo", "Role": "Grupo",
"Groupe associé": "Grupo asociado", "Role associé": "Grupo asociado",
"Groupe requis pour accéder à la page :": "Grupo necesario para acceder a la página:", "Role requis pour accéder à la page :": "Grupo necesario para acceder a la página:",
"Groupes": "Grupos", "Groupes": "Grupos",
"Générer sitemap.xml et robots.txt": "Generar sitemap.xml y robots.txt", "Générer sitemap.xml et robots.txt": "Generar sitemap.xml y robots.txt",
"Générer une capture Open Graph": "Generar una captura de Open Graph", "Générer une capture Open Graph": "Generar una captura de Open Graph",
@ -295,7 +295,7 @@
"Importer dans": "Importar a", "Importer dans": "Importar a",
"Importer des utilisateurs en masse": "Importar usuarios de forma masiva", "Importer des utilisateurs en masse": "Importar usuarios de forma masiva",
"Impossible d'ouvrir l'archive": "No se puede abrir el archivo", "Impossible d'ouvrir l'archive": "No se puede abrir el archivo",
"Impossible de modifier votre propre groupe.": "No puede editar su propio grupo.", "Impossible de modifier votre propre role.": "No puede editar su propio grupo.",
"Impossible de soumettre le formulaire, car il contient des erreurs": "No se puede enviar el formulario porque contiene errores", "Impossible de soumettre le formulaire, car il contient des erreurs": "No se puede enviar el formulario porque contiene errores",
"Impossible de supprimer une page contenant des pages enfants": "No se puede eliminar una página que contiene páginas secundarias", "Impossible de supprimer une page contenant des pages enfants": "No se puede eliminar una página que contiene páginas secundarias",
"Impossible de supprimer votre propre compte": "No puede eliminar su propia cuenta", "Impossible de supprimer votre propre compte": "No puede eliminar su propia cuenta",
@ -695,7 +695,7 @@
"Message de test envoyé avec succès": "Mensaje de prueba enviado con éxito", "Message de test envoyé avec succès": "Mensaje de prueba enviado con éxito",
"Message non envoyé": "Mensaje no enviado", "Message non envoyé": "Mensaje no enviado",
"Validation par clé ⚠️": "Validación por clave ⚠️", "Validation par clé ⚠️": "Validación por clave ⚠️",
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "La conexión se confirma con una clave enviada por mensajería. Desde el grupo seleccionado y los grupos superiores.", "La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le role sélectionné et les groupes supérieurs.": "La conexión se confirma con una clave enviada por mensajería. Desde el grupo seleccionado y los grupos superiores.",
"Envoi du message d'authentification": "Envío del mensaje de autenticación", "Envoi du message d'authentification": "Envío del mensaje de autenticación",
"Connexion réussie": "Conexión exitosa", "Connexion réussie": "Conexión exitosa",
"Erreur de mot de passe": "Error de contraseña", "Erreur de mot de passe": "Error de contraseña",

View File

@ -261,9 +261,9 @@
"Grande (220%)": "", "Grande (220%)": "",
"Grande (300px)": "", "Grande (300px)": "",
"Gras": "", "Gras": "",
"Groupe": "", "Role": "",
"Groupe associé": "", "Role associé": "",
"Groupe requis pour accéder à la page :": "", "Role requis pour accéder à la page :": "",
"Groupes": "", "Groupes": "",
"Générer sitemap.xml et robots.txt": "", "Générer sitemap.xml et robots.txt": "",
"Générer une capture Open Graph": "", "Générer une capture Open Graph": "",
@ -295,7 +295,7 @@
"Importer dans": "", "Importer dans": "",
"Importer des utilisateurs en masse": "", "Importer des utilisateurs en masse": "",
"Impossible d'ouvrir l'archive": "", "Impossible d'ouvrir l'archive": "",
"Impossible de modifier votre propre groupe.": "", "Impossible de modifier votre propre role.": "",
"Impossible de soumettre le formulaire, car il contient des erreurs": "", "Impossible de soumettre le formulaire, car il contient des erreurs": "",
"Impossible de supprimer une page contenant des pages enfants": "", "Impossible de supprimer une page contenant des pages enfants": "",
"Impossible de supprimer votre propre compte": "", "Impossible de supprimer votre propre compte": "",
@ -695,7 +695,7 @@
"Message de test envoyé avec succès": "", "Message de test envoyé avec succès": "",
"Message non envoyé": "", "Message non envoyé": "",
"Validation par clé ⚠️": "", "Validation par clé ⚠️": "",
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "", "La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le role sélectionné et les groupes supérieurs.": "",
"Envoi du message d'authentification": "", "Envoi du message d'authentification": "",
"Connexion réussie": "", "Connexion réussie": "",
"Erreur de mot de passe": "", "Erreur de mot de passe": "",

View File

@ -16,3 +16,7 @@
/** NE PAS EFFACER /** NE PAS EFFACER
* admin.css * admin.css
*/ */
.container.light {
filter: drop-shadow(5px 5px 10px rgba(0, 0, 0, 0.2));
}

View File

@ -20,3 +20,7 @@
.title { .title {
font-weight: bold; font-weight: bold;
} }
.container.light {
filter: drop-shadow(5px 5px 10px rgba(0, 0, 0, 0.2));
}

View File

@ -24,7 +24,6 @@ class page extends common
'duplicate' => self::GROUP_EDITOR, 'duplicate' => self::GROUP_EDITOR,
'jsEditor' => self::GROUP_EDITOR, 'jsEditor' => self::GROUP_EDITOR,
'cssEditor' => self::GROUP_EDITOR, 'cssEditor' => self::GROUP_EDITOR,
'register' => self::GROUP_EDITOR,
]; ];
public static $pagesNoParentId = [ public static $pagesNoParentId = [
'' => 'Aucune' '' => 'Aucune'
@ -181,7 +180,7 @@ class page extends common
'parentPageId' => '', 'parentPageId' => '',
'modulePosition' => 'bottom', 'modulePosition' => 'bottom',
'position' => 0, 'position' => 0,
'group' => self::GROUP_VISITOR, 'role' => self::GROUP_VISITOR,
'targetBlank' => false, 'targetBlank' => false,
'title' => $pageTitle, 'title' => $pageTitle,
'shortTitle' => $pageTitle, 'shortTitle' => $pageTitle,
@ -474,7 +473,7 @@ class page extends common
$this->setData(['config', 'page302', $pageId], false); $this->setData(['config', 'page302', $pageId], false);
} }
// Sauvegarde la base manuellement // Sauvegarde la base manuellement
$this->saveDB(module: 'config'); $this->saveDB('config');
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents // Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
$lastPosition = 1; $lastPosition = 1;
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy()); $hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
@ -543,17 +542,17 @@ class page extends common
} }
} }
} }
// Détermine le groupe selon que la page est une barre ou une page standard // Détermine le role selon que la page est une barre ou une page standard
$group = $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0; $role = $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0;
//Détermine le profil d'utilisateur en fonction du groupe sinon le groupe vaut 0 //Détermine le profil d'utilisateur en fonction du role sinon le role vaut 0
$profil = 0; $profil = 0;
if ( if (
$this->getinput('pageEditBlock') !== 'bar' || $this->getinput('pageEditBlock') !== 'bar' ||
$group === 1 || $role === 1 ||
$group === 2 $role === 2
) { ) {
$profil = $this->getInput('pageEditProfil' . $group, helper::FILTER_INT); $profil = $this->getInput('pageEditProfil' . $role, helper::FILTER_INT);
} }
// Modifie la page ou en crée une nouvelle si l'id a changé // Modifie la page ou en crée une nouvelle si l'id a changé
@ -573,7 +572,7 @@ class page extends common
'modulePosition' => $this->getInput('pageModulePosition'), 'modulePosition' => $this->getInput('pageModulePosition'),
'parentPageId' => $this->getInput('pageEditParentPageId'), 'parentPageId' => $this->getInput('pageEditParentPageId'),
'position' => $position, 'position' => $position,
'group' => $group, 'role' => $role,
'profil' => $profil, 'profil' => $profil,
'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN), 'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN),
'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT), 'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT),
@ -594,6 +593,19 @@ class page extends common
] ]
]); ]);
/**
* Sauvegarde l'onglet de l'utilisateur
*/
$this->setData([
'user',
$this->getUser('id'),
'view',
[
'page' => $this->getInput('containerSelected'),
'config' => $this->getData(['user', $this->getUser('id'), 'view', 'config']),
]
]);
// Creation du contenu de la page // Creation du contenu de la page
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) { if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755); mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);
@ -760,25 +772,4 @@ class page extends common
return json_encode($d); return json_encode($d);
} }
/**
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
* @return never
*/
public function register(): void
{
$this->setData([
'user',
$this->getUser('id'),
'view',
[
'page' => $this->getUrl(2),
'config' => $this->getData(['user', $this->getUser('id'), 'view', 'config']),
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(3) . '/' . self::$siteContent,
]);
}
} }

View File

@ -283,10 +283,18 @@ $( document ).ready(function() {
// Gestion des évènements // Gestion des évènements
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
/**
* Transmet le bouton de l'onglet sélectionné avant la soumission
*/
$('#pageEditForm').on('submit', function () {
$('#containerSelected').val(pageLayout);
});
/** /**
* Sélection de la page de configuration à afficher * Sélection de la page de configuration à afficher
*/ */
$("#pageEditContentButton").on("click", function () { $("#pageEditContentButton").on("click", function () {
pageLayout = "locale";
$("#pageEditContentContainer").show(); $("#pageEditContentContainer").show();
$("#pageEditExtensionContainer").hide(); $("#pageEditExtensionContainer").hide();
$("#pageEditPositionContainer").hide(); $("#pageEditPositionContainer").hide();
@ -294,23 +302,12 @@ $( document ).ready(function() {
$("#pageEditPermissionContainer").hide(); $("#pageEditPermissionContainer").hide();
$("#pageEditContentButton").addClass("activeButton"); $("#pageEditContentButton").addClass("activeButton");
$("#pageEditExtensionButton").removeClass("activeButton"); $("#pageEditExtensionButton").removeClass("activeButton");
$("#PageEditPositionButton").removeClass("activeButton"); $("#pageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton"); $("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
}); });
$("#pageEditExtensionButton").on("click", function () { $("#pageEditPositionButton").on("click", function () {
$("#pageEditContentContainer").hide(); pageLayout = "position";
$("#pageEditExtensionContainer").show();
$("#pageEditPositionContainer").hide();
$("#pageEditLayoutContainer").hide();
$("#pageEditPermissionContainer").hide();
$("#pageEditContentButton").removeClass("activeButton");
$("#pageEditExtensionButton").addClass("activeButton");
$("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton");
});
$("#PageEditPositionButton").on("click", function () {
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
$("#pageEditExtensionContainer").hide(); $("#pageEditExtensionContainer").hide();
$("#pageEditPositionContainer").show(); $("#pageEditPositionContainer").show();
@ -318,11 +315,25 @@ $( document ).ready(function() {
$("#pageEditPermissionContainer").hide(); $("#pageEditPermissionContainer").hide();
$("#pageEditContentButton").removeClass("activeButton"); $("#pageEditContentButton").removeClass("activeButton");
$("#pageEditExtensionButton").removeClass("activeButton"); $("#pageEditExtensionButton").removeClass("activeButton");
$("#PageEditPositionButton").addClass("activeButton"); $("#pageEditPositionButton").addClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton");
});
$("#pageEditExtensionButton").on("click", function () {
pageLayout = "extension";
$("#pageEditContentContainer").hide();
$("#pageEditExtensionContainer").show();
$("#pageEditPositionContainer").hide();
$("#pageEditLayoutContainer").hide();
$("#pageEditPermissionContainer").hide();
$("#pageEditContentButton").removeClass("activeButton");
$("#pageEditExtensionButton").addClass("activeButton");
$("#pageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton"); $("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
}); });
$("#pageEditLayoutButton").on("click", function () { $("#pageEditLayoutButton").on("click", function () {
pageLayout = "layout";
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
$("#pageEditExtensionContainer").hide(); $("#pageEditExtensionContainer").hide();
$("#pageEditPositionContainer").hide(); $("#pageEditPositionContainer").hide();
@ -330,11 +341,12 @@ $( document ).ready(function() {
$("#pageEditPermissionContainer").hide(); $("#pageEditPermissionContainer").hide();
$("#pageEditContentButton").removeClass("activeButton"); $("#pageEditContentButton").removeClass("activeButton");
$("#pageEditExtensionButton").removeClass("activeButton"); $("#pageEditExtensionButton").removeClass("activeButton");
$("#PageEditPositionButton").removeClass("activeButton"); $("#pageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").addClass("activeButton"); $("#pageEditLayoutButton").addClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
}); });
$("#pageEditPermissionButton").on("click", function () { $("#pageEditPermissionButton").on("click", function () {
pageLayout = "permission";
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
$("#pageEditExtensionContainer").hide(); $("#pageEditExtensionContainer").hide();
$("#pageEditPositionContainer").hide(); $("#pageEditPositionContainer").hide();

View File

@ -35,30 +35,33 @@
<?php echo template::button('pageEditContentButton', [ <?php echo template::button('pageEditContentButton', [
'value' => 'Contenu', 'value' => 'Contenu',
'class' => 'buttonTab', 'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/content/' . $this->geturl(2) //'href' => helper::baseUrl() . 'page/register/content/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditPositionButton', [ <?php echo template::button('pageEditPositionButton', [
'value' => 'Menu', 'value' => 'Menu',
'class' => 'buttonTab', 'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2) //'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditExtensionButton', [ <?php echo template::button('pageEditExtensionButton', [
'value' => 'Extension', 'value' => 'Extension',
'class' => 'buttonTab', 'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2) //'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditLayoutButton', [ <?php echo template::button('pageEditLayoutButton', [
'value' => 'Mise en page', 'value' => 'Mise en page',
'class' => 'buttonTab', 'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2) //'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditPermissionButton', [ <?php echo template::button('pageEditPermissionButton', [
'value' => 'Permission', 'value' => 'Permission',
'class' => 'buttonTab', 'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2) //'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2)
]); ?> ]); ?>
</div> </div>
<!-- Champ caché pour transmettre l'onglet-->
<?php echo template::hidden('containerSelected'); ?>
<div id="pageEditContentContainer" class="tabContent"> <div id="pageEditContentContainer" class="tabContent">
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
@ -356,8 +359,8 @@
<div class="row"> <div class="row">
<div class='col6'> <div class='col6'>
<?php echo template::select('pageEditGroup', self::$groupPublics, [ <?php echo template::select('pageEditGroup', self::$groupPublics, [
'label' => 'Groupe minimal pour accéder à la page', 'label' => 'Role minimal pour accéder à la page',
'selected' => $this->getData(['page', $this->getUrl(2), 'group']), 'selected' => $this->getData(['page', $this->getUrl(2), 'role']),
'help' => 'Les groupes de niveau supérieur accèdent à la page.' 'help' => 'Les groupes de niveau supérieur accèdent à la page.'
]); ?> ]); ?>
</div> </div>

View File

@ -29,7 +29,7 @@ class sitemap extends common
$items = '<ul>'; $items = '<ul>';
foreach ($this->getHierarchy(null, true, null) as $parentId => $childIds) { foreach ($this->getHierarchy(null, true, null) as $parentId => $childIds) {
$items .= ' <li>'; $items .= ' <li>';
if ($this->getData(['page', $parentId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])) { if ($this->getData(['page', $parentId, 'disable']) === false && $this->getUser('role') >= $this->getData(['page', $parentId, 'role'])) {
$pageUrl = ($parentId !== $this->homePageId()) ? helper::baseUrl() . $parentId : helper::baseUrl(false); $pageUrl = ($parentId !== $this->homePageId()) ? helper::baseUrl() . $parentId : helper::baseUrl(false);
$items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $parentId, 'title']) . '</a>'; $items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $parentId, 'title']) . '</a>';
} else { } else {
@ -66,7 +66,7 @@ class sitemap extends common
$items .= '<ul>'; $items .= '<ul>';
// Sous-page // Sous-page
$items .= ' <li>'; $items .= ' <li>';
if ($this->getData(['page', $childId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group'])) { if ($this->getData(['page', $childId, 'disable']) === false && $this->getUser('role') >= $this->getData(['page', $parentId, 'role'])) {
$pageUrl = ($childId !== $this->homePageId()) ? helper::baseUrl() . $childId : helper::baseUrl(false); $pageUrl = ($childId !== $this->homePageId()) ? helper::baseUrl() . $childId : helper::baseUrl(false);
$items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $childId, 'title']) . '</a>'; $items .= '<a href="' . $pageUrl . '">' . $this->getData(['page', $childId, 'title']) . '</a>';
} else { } else {

View File

@ -1,4 +1,4 @@
id;nom;prenom;email;groupe;profil;passe;tags id;nom;prenom;email;role;profil;passe;tags
jm1;Membre1;Jean;jean.membre1@email.fr;1;1;jEan05;"adhérent" jm1;Membre1;Jean;jean.membre1@email.fr;1;1;jEan05;"adhérent"
am2;Membre2;Albert;albert.membre2@email.fr;1;1;alBertAG;"adhérent" am2;Membre2;Albert;albert.membre2@email.fr;1;1;alBertAG;"adhérent"
jrediteur;Editeur;Robert;robert.editeur@email.fr;2;1;roBert54;"trésorier" jrediteur;Editeur;Robert;robert.editeur@email.fr;2;1;roBert54;"trésorier"

1 id nom prenom email groupe role profil passe tags
2 jm1 Membre1 Jean jean.membre1@email.fr 1 1 1 jEan05 adhérent
3 am2 Membre2 Albert albert.membre2@email.fr 1 1 1 alBertAG adhérent
4 jrediteur Editeur Robert robert.editeur@email.fr 2 2 1 roBert54 trésorier

View File

@ -111,10 +111,10 @@ class user extends common
$password = $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true); $password = $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true);
// Profil // Profil
$group = $this->getInput('userAddGroup', helper::FILTER_INT, true); $role = $this->getInput('userAddGroup', helper::FILTER_INT, true);
$profil = 0; $profil = 0;
if ($group === 1 || $group === 2) { if ($role === 1 || $role === 2) {
$profil = $this->getInput('userAddProfil' . $group, helper::FILTER_INT); $profil = $this->getInput('userAddProfil' . $role, helper::FILTER_INT);
} }
// Stockage des données // Stockage des données
@ -124,7 +124,7 @@ class user extends common
[ [
'firstname' => $userFirstname, 'firstname' => $userFirstname,
'forgot' => 0, 'forgot' => 0,
'group' => $group, 'role' => $role,
'profil' => $profil, 'profil' => $profil,
'lastname' => $userLastname, 'lastname' => $userLastname,
'pseudo' => $pseudo, 'pseudo' => $pseudo,
@ -208,8 +208,8 @@ class user extends common
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true || $this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
// L'utilisateur n'existe pas // L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null $this->getData(['user', $this->getUrl(2)]) === null
// Groupe insuffisant // Role insuffisant
and ($this->getUrl('group') < self::GROUP_EDITOR) and ($this->getUrl('role') < self::GROUP_EDITOR)
) { ) {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -284,7 +284,6 @@ class user extends common
'notification' => sprintf($count > 1 ? $notification . 's' : $notification, $count), 'notification' => sprintf($count > 1 ? $notification . 's' : $notification, $count),
'state' => $success 'state' => $success
]); ]);
} }
// Liste des groupes et des profils // Liste des groupes et des profils
@ -303,7 +302,7 @@ class user extends common
case "2": case "2":
foreach ($groupValue as $profilId => $profilValue) { foreach ($groupValue as $profilId => $profilValue) {
if ($profilId) { if ($profilId) {
self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Role %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
$profils[$groupId . $profilId] = 0; $profils[$groupId . $profilId] = 0;
} }
} }
@ -324,8 +323,8 @@ class user extends common
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Compte les rôles // Compte les rôles
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset($profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])]++;
} }
// Filtres // Filtres
@ -335,14 +334,14 @@ class user extends common
|| isset($_POST['usersFilterLastName']) || isset($_POST['usersFilterLastName'])
) { ) {
// Groupe et profils // Role et profils
$group = (string) $this->getData(['user', $userId, 'group']); $role = (string) $this->getData(['user', $userId, 'role']);
$profil = (string) $this->getData(['user', $userId, 'profil']); $profil = (string) $this->getData(['user', $userId, 'profil']);
$firstName = $this->getData(['user', $userId, 'firstname']); $firstName = $this->getData(['user', $userId, 'firstname']);
$lastName = $this->getData(['user', $userId, 'lastname']); $lastName = $this->getData(['user', $userId, 'lastname']);
if ( if (
$this->getInput('usersFilterGroup', helper::FILTER_INT) > 0 $this->getInput('usersFilterGroup', helper::FILTER_INT) > 0
&& $this->getInput('usersFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil && $this->getInput('usersFilterGroup', helper::FILTER_STRING_SHORT) !== $role . $profil
) )
continue; continue;
// Première lettre du prénom // Première lettre du prénom
@ -367,7 +366,6 @@ class user extends common
$this->getData(['user', $userId, 'lastname']), $this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'tags']), $this->getData(['user', $userId, 'tags']),
]; ];
} }
} }
@ -411,10 +409,10 @@ class user extends common
and ( and (
// Impossible de s'auto-éditer // Impossible de s'auto-éditer
($this->getUser('id') === $this->getUrl(2) ($this->getUser('id') === $this->getUrl(2)
and $this->getUrl('group') <= self::GROUP_VISITOR and $this->getUrl('role') <= self::GROUP_VISITOR
) )
// Impossible d'éditer un autre utilisateur // Impossible d'éditer un autre utilisateur
or ($this->getUrl('group') < self::GROUP_EDITOR) or ($this->getUrl('role') < self::GROUP_EDITOR)
) )
) { ) {
// Valeurs en sortie // Valeurs en sortie
@ -430,7 +428,7 @@ class user extends common
) { ) {
$oldPassword = $this->getData(['user', $this->getUrl(2), 'password']); $oldPassword = $this->getData(['user', $this->getUrl(2), 'password']);
// Double vérification pour le mot de passe // Double vérification pour le mot de passe
if ($this->getUser('group') < self::GROUP_ADMIN) { if ($this->getUser('role') < self::GROUP_ADMIN) {
if ($this->getInput('userEditNewPassword')) { if ($this->getInput('userEditNewPassword')) {
// L'ancien mot de passe est correct // L'ancien mot de passe est correct
if ( if (
@ -465,17 +463,17 @@ class user extends common
} }
} }
// Modification du groupe // Modification du role
if ( if (
$this->getUser('group') === self::GROUP_ADMIN $this->getUser('role') === self::GROUP_ADMIN
and $this->getUrl(2) !== $this->getUser('id') and $this->getUrl(2) !== $this->getUser('id')
) { ) {
$newGroup = $this->getInput('userEditGroup', helper::FILTER_INT, true); $newGroup = $this->getInput('userEditGroup', helper::FILTER_INT, true);
} else { } else {
$newGroup = $this->getData(['user', $this->getUrl(2), 'group']); $newGroup = $this->getData(['user', $this->getUrl(2), 'role']);
} }
// Modification de nom Prénom // Modification de nom Prénom
if ($this->getUser('group') === self::GROUP_ADMIN) { if ($this->getUser('role') === self::GROUP_ADMIN) {
$newfirstname = $this->getInput('userEditFirstname', helper::FILTER_STRING_SHORT, true); $newfirstname = $this->getInput('userEditFirstname', helper::FILTER_STRING_SHORT, true);
$newlastname = $this->getInput('userEditLastname', helper::FILTER_STRING_SHORT, true); $newlastname = $this->getInput('userEditLastname', helper::FILTER_STRING_SHORT, true);
} else { } else {
@ -494,7 +492,7 @@ class user extends common
[ [
'firstname' => $newfirstname, 'firstname' => $newfirstname,
'forgot' => 0, 'forgot' => 0,
'group' => $newGroup, 'role' => $newGroup,
'profil' => $profil, 'profil' => $profil,
'lastname' => $newlastname, 'lastname' => $newlastname,
'pseudo' => $this->getInput('userEditPseudo', helper::FILTER_STRING_SHORT, true), 'pseudo' => $this->getInput('userEditPseudo', helper::FILTER_STRING_SHORT, true),
@ -517,7 +515,7 @@ class user extends common
$redirect = helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()); $redirect = helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl());
} }
// Redirection si retour en arrière possible // Redirection si retour en arrière possible
elseif ($this->getUser('group') === self::GROUP_ADMIN) { elseif ($this->getUser('role') === self::GROUP_ADMIN) {
$redirect = helper::baseUrl() . 'user'; $redirect = helper::baseUrl() . 'user';
} }
// Redirection normale // Redirection normale
@ -571,16 +569,18 @@ class user extends common
public function forgot() public function forgot()
{ {
// Soumission du formulaire // Soumission du formulaire
if ( if ($this->isPost()) {
$this->isPost()
) {
$userId = $this->getInput('userForgotId', helper::FILTER_ID, true); $userId = $this->getInput('userForgotId', helper::FILTER_ID, true);
$sent = false; $sent = false;
if ($this->getData(['user', $userId])) { if ($this->getData(['user', $userId])) {
// Enregistre la date de la demande dans le compte utilisateur // Génère une clé unique avec timestamp et partie aléatoire
$this->setData(['user', $userId, 'forgot', time()]); $timestamp = time(); // Timestamp actuel
// Crée un id unique pour la réinitialisation $randomPart = bin2hex(random_bytes(8)); // Partie aléatoire (16 caractères hexadécimaux)
$uniqId = md5(json_encode($this->getData(['user', $userId, 'forgot']))); $uniqId = $timestamp . '_' . $randomPart; // Combine les deux
// Enregistre la clé unique dans le compte utilisateur
$this->setData(['user', $userId, 'forgot', $uniqId]);
// Envoi le mail // Envoi le mail
$sent = $this->sendMail( $sent = $this->sendMail(
$this->getData(['user', $userId, 'mail']), $this->getData(['user', $userId, 'mail']),
@ -592,12 +592,11 @@ class user extends common
null, null,
$this->getData(['config', 'smtp', 'from']) $this->getData(['config', 'smtp', 'from'])
); );
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => $sent ? helper::translate('Un mail a été envoyé pour confirmer la réinitialisation') : helper::translate('Impossible de réinitialiser le mot de passe de ce compte !'), 'notification' => $sent === true ? helper::translate('Un mail a été envoyé pour confirmer la réinitialisation') : helper::translate('Le mail de réinitialisation ne peut pas être envoyé, contactez l\'administrateur'),
'state' => ($sent === true ? true : false), 'state' => ($sent === true ? true : false),
'redirect' => helper::baseUrl() 'redirect' => helper::baseUrl()
]); ]);
@ -630,7 +629,7 @@ class user extends common
case "2": case "2":
foreach ($groupValue as $profilId => $profilValue) { foreach ($groupValue as $profilId => $profilValue) {
if ($profilId) { if ($profilId) {
self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Role %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
$profils[$groupId . $profilId] = 0; $profils[$groupId . $profilId] = 0;
} }
} }
@ -647,23 +646,23 @@ class user extends common
$userIdsLastNames = helper::arrayColumn($this->getData(['user']), 'lastname'); $userIdsLastNames = helper::arrayColumn($this->getData(['user']), 'lastname');
ksort($userIdsLastNames); ksort($userIdsLastNames);
foreach ($userIdsLastNames as $userId => $userLastNames) { foreach ($userIdsLastNames as $userId => $userLastNames) {
if ($this->getData(['user', $userId, 'group'])) { if ($this->getData(['user', $userId, 'role'])) {
// Compte les rôles // Compte les rôles
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset($profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])]++;
} }
// Filtres // Filtres
if ($this->isPost()) { if ($this->isPost()) {
// Groupe et profils // Role et profils
$group = (string) $this->getData(['user', $userId, 'group']); $role = (string) $this->getData(['user', $userId, 'role']);
$profil = (string) $this->getData(['user', $userId, 'profil']); $profil = (string) $this->getData(['user', $userId, 'profil']);
$firstName = $this->getData(['user', $userId, 'firstname']); $firstName = $this->getData(['user', $userId, 'firstname']);
$lastName = $this->getData(['user', $userId, 'lastname']); $lastName = $this->getData(['user', $userId, 'lastname']);
if ( if (
$this->getInput('userFilterGroup', helper::FILTER_INT) > 0 $this->getInput('userFilterGroup', helper::FILTER_INT) > 0
&& $this->getInput('userFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil && $this->getInput('userFilterGroup', helper::FILTER_STRING_SHORT) !== $role . $profil
) )
continue; continue;
// Première lettre du prénom // Première lettre du prénom
@ -680,18 +679,19 @@ class user extends common
continue; continue;
} }
// Formatage de la liste // Formatage de la liste
self::$users[] = [ self::$users[] = [
//$userId, //$userId,
sprintf('%s %s',$userLastNames, $this->getData(['user', $userId, 'firstname'])), sprintf('%s %s', $userLastNames, $this->getData(['user', $userId, 'firstname'])),
helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]), helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'role'])]),
empty($this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name'])) empty($this->getData(['profil', $this->getData(['user', $userId, 'role']), $this->getData(['user', $userId, 'profil']), 'name']))
? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]) ? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'role'])])
: $this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name']), : $this->getData(['profil', $this->getData(['user', $userId, 'role']), $this->getData(['user', $userId, 'profil']), 'name']),
$this->getData(['user', $userId, 'tags']), $this->getData(['user', $userId, 'tags']),
helper::dateUTF8('%d/%m/%Y', $this->getData(['user', $userId, 'accessTimer']), self::$i18nUI), is_null($this->getData(['user', $userId, 'accessTimer']))
? 'Jamais'
: $this->getData(['user', $userId, 'accessTimer']),
//helper::dateUTF8('%d/%m/%Y', $this->getData(['user', $userId, 'accessTimer']), self::$i18nUI),
//helper::dateUTF8('%H:%M', $this->getData(['user', $userId, 'accessTimer']), self::$i18nUI), //helper::dateUTF8('%H:%M', $this->getData(['user', $userId, 'accessTimer']), self::$i18nUI),
template::button('userEdit' . $userId, [ template::button('userEdit' . $userId, [
'href' => helper::baseUrl() . 'user/edit/' . $userId, 'href' => helper::baseUrl() . 'user/edit/' . $userId,
@ -705,7 +705,6 @@ class user extends common
'help' => 'Supprimer' 'help' => 'Supprimer'
]) ])
]; ];
} }
} }
@ -735,8 +734,8 @@ class user extends common
{ {
// Ne pas supprimer un profil utililsé // Ne pas supprimer un profil utililsé
// recherche les membres du groupe // recherche les membres du role
$groups = helper::arrayColumn($this->getData(['user']), 'group'); $groups = helper::arrayColumn($this->getData(['user']), 'role');
$groups = array_keys($groups, $this->getUrl(2)); $groups = array_keys($groups, $this->getUrl(2));
$profilUsed = true; $profilUsed = true;
// Stoppe si le profil est affecté // Stoppe si le profil est affecté
@ -802,7 +801,7 @@ class user extends common
} }
/** /**
* Edition d'un groupe * Edition d'un role
*/ */
public function profilEdit() public function profilEdit()
{ {
@ -814,7 +813,7 @@ class user extends common
) { ) {
// Effacer les données du numéro de profil ancien // Effacer les données du numéro de profil ancien
$group = $this->getInput('profilEditGroup', helper::FILTER_STRING_SHORT, true); $role = $this->getInput('profilEditGroup', helper::FILTER_STRING_SHORT, true);
// Les profils 1 sont désactivés dans le formulaire // Les profils 1 sont désactivés dans le formulaire
$profil = empty($this->getInput('profilEditProfil')) ? '1' : $this->getInput('profilEditProfil'); $profil = empty($this->getInput('profilEditProfil')) ? '1' : $this->getInput('profilEditProfil');
$oldProfil = $this->getInput('profilEditOldProfil', helper::FILTER_STRING_SHORT); $oldProfil = $this->getInput('profilEditOldProfil', helper::FILTER_STRING_SHORT);
@ -822,15 +821,15 @@ class user extends common
$fileManager = $this->getInput('profilEditFileManager', helper::FILTER_BOOLEAN); $fileManager = $this->getInput('profilEditFileManager', helper::FILTER_BOOLEAN);
// Sécurité supplémentaire // Sécurité supplémentaire
if ( if (
$group < self::GROUP_MEMBER $role < self::GROUP_MEMBER
) { ) {
$fileManager = false; $fileManager = false;
} }
if ( if (
$profil !== $oldProfil && $profil !== $oldProfil &&
$this->deleteData(['profil', $group, $oldProfil]) $this->deleteData(['profil', $role, $oldProfil])
) { ) {
$this->deleteData(['profil', $group, $oldProfil]); $this->deleteData(['profil', $role, $oldProfil]);
} }
// Données du formulaire // Données du formulaire
$data = [ $data = [
@ -933,7 +932,7 @@ class user extends common
//Sauvegarder le données //Sauvegarder le données
$this->setData([ $this->setData([
'profil', 'profil',
$group, $role,
$profil, $profil,
$data $data
]); ]);
@ -1018,14 +1017,14 @@ class user extends common
$this->getUser('permission', __CLASS__, __FUNCTION__) === true && $this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost() $this->isPost()
) { ) {
// Nombre de profils de ce groupe // Nombre de profils de ce role
$group = $this->getInput('profilAddGroup'); $role = $this->getInput('profilAddGroup');
$profil = count($this->getData(['profil', $group])); $profil = count($this->getData(['profil', $role]));
// Gère le chemin // Gère le chemin
$fileManager = $this->getInput('profilAddFileManager', helper::FILTER_BOOLEAN); $fileManager = $this->getInput('profilAddFileManager', helper::FILTER_BOOLEAN);
// Sécurité supplémentaire // Sécurité supplémentaire
if ( if (
$group < self::GROUP_MEMBER $role < self::GROUP_MEMBER
) { ) {
$fileManager = false; $fileManager = false;
} }
@ -1130,7 +1129,7 @@ class user extends common
// Sauvegarder les données // Sauvegarder les données
$this->setData([ $this->setData([
'profil', 'profil',
$group, $role,
$profil, $profil,
$data $data
]); ]);
@ -1199,8 +1198,8 @@ class user extends common
public function profilDelete() public function profilDelete()
{ {
// Ne pas supprimer un profil utililsé // Ne pas supprimer un profil utililsé
// recherche les membres du groupe // recherche les membres du role
$groups = helper::arrayColumn($this->getData(['user']), 'group'); $groups = helper::arrayColumn($this->getData(['user']), 'role');
$groups = array_keys($groups, $this->getUrl(2)); $groups = array_keys($groups, $this->getUrl(2));
$flag = true; $flag = true;
// Stoppe si le profil est affecté // Stoppe si le profil est affecté
@ -1302,12 +1301,12 @@ class user extends common
$this->setData(['user', $userId, 'connectTimeout', 0], false); $this->setData(['user', $userId, 'connectTimeout', 0], false);
} }
// Check la présence des variables et contrôle du blocage du compte si valeurs dépassées // Check la présence des variables et contrôle du blocage du compte si valeurs dépassées
// Vérification du mot de passe et du groupe // Vérification du mot de passe et du role
if ( if (
($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout'])) < time() ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout'])) < time()
and $this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt']) and $this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])
and password_verify(html_entity_decode($this->getInput('userLoginPassword', helper::FILTER_STRING_SHORT, true)), $this->getData(['user', $userId, 'password'])) and password_verify(html_entity_decode($this->getInput('userLoginPassword', helper::FILTER_STRING_SHORT, true)), $this->getData(['user', $userId, 'password']))
and $this->getData(['user', $userId, 'group']) >= self::GROUP_MEMBER and $this->getData(['user', $userId, 'role']) >= self::GROUP_MEMBER
and $captcha === true and $captcha === true
) { ) {
@ -1321,7 +1320,7 @@ class user extends common
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
if ( if (
$this->getData(['config', 'maintenance']) $this->getData(['config', 'maintenance'])
and $this->getData(['user', $userId, 'group']) < self::GROUP_ADMIN and $this->getData(['user', $userId, 'role']) < self::GROUP_ADMIN
) { ) {
$this->addOutput([ $this->addOutput([
'notification' => helper::translate('Seul un administrateur peut se connecter lors d\'une maintenance'), 'notification' => helper::translate('Seul un administrateur peut se connecter lors d\'une maintenance'),
@ -1341,7 +1340,7 @@ class user extends common
$authRedirect = ''; $authRedirect = '';
if ( if (
$this->getData(['config', 'connect', 'mailAuth']) > 0 $this->getData(['config', 'connect', 'mailAuth']) > 0
&& $this->getData(['user', $userId, 'group']) >= $this->getData(['config', 'connect', 'mailAuth']) && $this->getData(['user', $userId, 'role']) >= $this->getData(['config', 'connect', 'mailAuth'])
) { ) {
/** /**
* Envoi d'un email contenant une clé * Envoi d'un email contenant une clé
@ -1474,7 +1473,7 @@ class user extends common
$inputKey = $this->getInput('userAuthKey', helper::FILTER_INT); $inputKey = $this->getInput('userAuthKey', helper::FILTER_INT);
// Redirection // Redirection
$pageId = $this->getUrl(2); $pageId = $this->getUrl(2);
$redirect = $pageId? helper::baseUrl() . $pageId : helper::baseUrl() ; $redirect = $pageId ? helper::baseUrl() . $pageId : helper::baseUrl();
if ( if (
// La clé est valide ou le message n'ayant pas été expédié, la double authentification est désactivée // La clé est valide ou le message n'ayant pas été expédié, la double authentification est désactivée
$targetKey === $inputKey || $this->getData(['config', 'connect', 'mailAuth', 0]) === 0 $targetKey === $inputKey || $this->getData(['config', 'connect', 'mailAuth', 0]) === 0
@ -1555,25 +1554,30 @@ class user extends common
if ( if (
// L'utilisateur n'existe pas // L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null $this->getData(['user', $this->getUrl(2)]) === null
// Lien de réinitialisation trop vieux // Lien de réinitialisation trop vieux (24 heures)
or $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time() or $this->getData(['user', $this->getUrl(2), 'forgot']) === null
// Id unique incorrecte or (int) explode('_', $this->getData(['user', $this->getUrl(2), 'forgot']))[0] + 86400 < time()
or $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot']))) // Clé unique incorrecte
or $this->getUrl(3) !== $this->getData(['user', $this->getUrl(2), 'forgot'])
) { ) {
$this->saveLog( $this->saveLog(
' Erreur de réinitialisation de mot de passe ' . $this->getUrl(2) . ' Erreur de réinitialisation de mot de passe ' . $this->getUrl(2) .
' Compte : ' . $this->getData(['user', $this->getUrl(2)]) . ' Compte : ' . $this->getData(['user', $this->getUrl(2)]) .
' Temps : ' . $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time() . ' Temps : ' . ($this->getData(['user', $this->getUrl(2), 'forgot']) === null ? 'Clé manquante' : ((int) explode('_', $this->getData(['user', $this->getUrl(2), 'forgot']))[0] + 86400 < time() ? 'Temps dépassé' : 'Temps valide')) .
' Clé : ' . $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot']))) ' Clé : ' . ($this->getUrl(3) !== $this->getData(['user', $this->getUrl(2), 'forgot']) ? 'Clé invalide' : 'Clé valide')
); );
// Message d'erreur en cas de problème de réinitialisation de mot de passe // Message d'erreur en cas de problème de réinitialisation de mot de passe
$message = $this->getData(['user', $this->getUrl(2)]) === null $message = $this->getData(['user', $this->getUrl(2)]) === null
? ' Utilisateur inconnu ' ? ' Utilisateur inconnu '
: ''; : '';
$message = $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time() $message = $this->getData(['user', $this->getUrl(2), 'forgot']) === null
? ' Clé manquante '
: $message;
$message = (int) explode('_', $this->getData(['user', $this->getUrl(2), 'forgot']))[0] + 86400 < time()
? ' Temps dépassé ' ? ' Temps dépassé '
: $message; : $message;
$message = $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)]))) $message = $this->getUrl(3) !== $this->getData(['user', $this->getUrl(2), 'forgot'])
? ' Clé invalide ' ? ' Clé invalide '
: $message; : $message;
@ -1582,17 +1586,12 @@ class user extends common
'redirect' => helper::baseurl(), 'redirect' => helper::baseurl(),
'notification' => helper::translate('Impossible de réinitialiser le mot de passe de ce compte !') . $message, 'notification' => helper::translate('Impossible de réinitialiser le mot de passe de ce compte !') . $message,
'state' => false 'state' => false
//'access' => false
]); ]);
} }
// Accès autorisé // Accès autorisé
else { else {
// Soumission du formulaire // Soumission du formulaire
if ( if ($this->isPost()) {
// Tous les users peuvent réinitialiser
// $this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
// Double vérification pour le mot de passe // Double vérification pour le mot de passe
if ($this->getInput('userResetNewPassword')) { if ($this->getInput('userResetNewPassword')) {
// La confirmation ne correspond pas au mot de passe // La confirmation ne correspond pas au mot de passe
@ -1660,7 +1659,7 @@ class user extends common
array_key_exists('id', $item) array_key_exists('id', $item)
and array_key_exists('prenom', $item) and array_key_exists('prenom', $item)
and array_key_exists('nom', $item) and array_key_exists('nom', $item)
and array_key_exists('groupe', $item) and array_key_exists('role', $item)
and array_key_exists('profil', $item) and array_key_exists('profil', $item)
and array_key_exists('email', $item) and array_key_exists('email', $item)
and array_key_exists('passe', $item) and array_key_exists('passe', $item)
@ -1669,16 +1668,16 @@ class user extends common
and isset($item['nom']) and isset($item['nom'])
and isset($item['prenom']) and isset($item['prenom'])
and isset($item['email']) and isset($item['email'])
and isset($item['groupe']) and isset($item['role'])
and isset($item['profil']) and isset($item['profil'])
and isset($item['passe']) and isset($item['passe'])
and isset($item['tags']) and isset($item['tags'])
) { ) {
// Validation du groupe // Validation du role
$item['groupe'] = (int) $item['groupe']; $item['role'] = (int) $item['role'];
$item['profil'] = (int) $item['profil']; $item['profil'] = (int) $item['profil'];
$item['groupe'] = ($item['groupe'] >= self::GROUP_BANNED and $item['groupe'] <= self::GROUP_ADMIN) $item['role'] = ($item['role'] >= self::GROUP_BANNED and $item['role'] <= self::GROUP_ADMIN)
? $item['groupe'] : 1; ? $item['role'] : 1;
// L'utilisateur existe // L'utilisateur existe
$userId = helper::filter($item['id'], helper::FILTER_ID); $userId = helper::filter($item['id'], helper::FILTER_ID);
if ($this->getData(['user', $userId])) { if ($this->getData(['user', $userId])) {
@ -1689,10 +1688,10 @@ class user extends common
$userId, $userId,
$item['nom'], $item['nom'],
$item['prenom'], $item['prenom'],
self::$groups[$item['groupe']], self::$groups[$item['role']],
empty($this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name'])) empty($this->getData(['profil', $this->getData(['user', $userId, 'role']), $this->getData(['user', $userId, 'profil']), 'name']))
? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]) ? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'role'])])
: $this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name']), : $this->getData(['profil', $this->getData(['user', $userId, 'role']), $this->getData(['user', $userId, 'profil']), 'name']),
$item['prenom'], $item['prenom'],
helper::filter($item['email'], helper::FILTER_MAIL), helper::filter($item['email'], helper::FILTER_MAIL),
$item['tags'], $item['tags'],
@ -1708,7 +1707,7 @@ class user extends common
[ [
'firstname' => $item['prenom'], 'firstname' => $item['prenom'],
'forgot' => 0, 'forgot' => 0,
'group' => $item['groupe'], 'role' => $item['role'],
'profil' => $item['profil'], 'profil' => $item['profil'],
'lastname' => $item['nom'], 'lastname' => $item['nom'],
'mail' => $item['email'], 'mail' => $item['email'],
@ -1752,10 +1751,10 @@ class user extends common
$userId, $userId,
$item['nom'], $item['nom'],
$item['prenom'], $item['prenom'],
self::$groups[$item['groupe']], self::$groups[$item['role']],
empty($this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name'])) empty($this->getData(['profil', $this->getData(['user', $userId, 'role']), $this->getData(['user', $userId, 'profil']), 'name']))
? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]) ? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'role'])])
: $this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name']), : $this->getData(['profil', $this->getData(['user', $userId, 'role']), $this->getData(['user', $userId, 'profil']), 'name']),
$item['prenom'], $item['prenom'],
$item['email'], $item['email'],
$item['tags'], $item['tags'],
@ -1763,7 +1762,6 @@ class user extends common
]; ];
} }
} }
} }
// Sauvegarde la base manuellement // Sauvegarde la base manuellement
$this->saveDB('user'); $this->saveDB('user');
@ -1805,7 +1803,6 @@ class user extends common
readfile($path . $file); readfile($path . $file);
exit(); exit();
} }
} }
public function tag() public function tag()
@ -1848,7 +1845,6 @@ class user extends common
'notification' => sprintf($count > 1 ? $notification . 's' : $notification, $count), 'notification' => sprintf($count > 1 ? $notification . 's' : $notification, $count),
'state' => $success 'state' => $success
]); ]);
} }
@ -1868,7 +1864,7 @@ class user extends common
case "2": case "2":
foreach ($groupValue as $profilId => $profilValue) { foreach ($groupValue as $profilId => $profilValue) {
if ($profilId) { if ($profilId) {
self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); self::$usersGroups[$groupId . $profilId] = sprintf(helper::translate('Role %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']);
$profils[$groupId . $profilId] = 0; $profils[$groupId . $profilId] = 0;
} }
} }
@ -1889,8 +1885,8 @@ class user extends common
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Compte les rôles // Compte les rôles
if (isset($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset($profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'role']) . $this->getData(['user', $userId, 'profil'])]++;
} }
// Filtres // Filtres
@ -1900,14 +1896,14 @@ class user extends common
|| isset($_POST['usersFilterLastName']) || isset($_POST['usersFilterLastName'])
) { ) {
// Groupe et profils // Role et profils
$group = (string) $this->getData(['user', $userId, 'group']); $role = (string) $this->getData(['user', $userId, 'role']);
$profil = (string) $this->getData(['user', $userId, 'profil']); $profil = (string) $this->getData(['user', $userId, 'profil']);
$firstName = $this->getData(['user', $userId, 'firstname']); $firstName = $this->getData(['user', $userId, 'firstname']);
$lastName = $this->getData(['user', $userId, 'lastname']); $lastName = $this->getData(['user', $userId, 'lastname']);
if ( if (
$this->getInput('usersFilterGroup', helper::FILTER_INT) > 0 $this->getInput('usersFilterGroup', helper::FILTER_INT) > 0
&& $this->getInput('usersFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil && $this->getInput('usersFilterGroup', helper::FILTER_STRING_SHORT) !== $role . $profil
) )
continue; continue;
// Première lettre du prénom // Première lettre du prénom
@ -1932,7 +1928,6 @@ class user extends common
$this->getData(['user', $userId, 'lastname']), $this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'tags']), $this->getData(['user', $userId, 'tags']),
]; ];
} }
} }
@ -1953,7 +1948,6 @@ class user extends common
'datatables' 'datatables'
] ]
]); ]);
} }
/** /**
@ -1987,5 +1981,4 @@ class user extends common
closedir($dh); closedir($dh);
return $subdirs; return $subdirs;
} }
} }

View File

@ -105,7 +105,7 @@
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::select('userAddGroup', self::$groupNews, [ <?php echo template::select('userAddGroup', self::$groupNews, [
'label' => 'Groupe', 'label' => 'Role',
'selected' => self::GROUP_MEMBER 'selected' => self::GROUP_MEMBER
]); ?> ]); ?>
</div> </div>

View File

@ -1,7 +1,7 @@
<?php echo template::formOpen('userEditForm'); ?> <?php echo template::formOpen('userEditForm'); ?>
<div class="row"> <div class="row">
<div class="col1"> <div class="col1">
<?php if ($this->getUser('group') === self::GROUP_ADMIN): ?> <?php if ($this->getUser('role') === self::GROUP_ADMIN): ?>
<?php echo template::button('userEditBack', [ <?php echo template::button('userEditBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user', 'href' => helper::baseUrl() . 'user',
@ -29,7 +29,7 @@
<div class="col6"> <div class="col6">
<?php echo template::text('userEditFirstname', [ <?php echo template::text('userEditFirstname', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'disabled' => $this->getUser('group') > self::GROUP_EDITOR ? false : true, 'disabled' => $this->getUser('role') > self::GROUP_EDITOR ? false : true,
'label' => 'Prénom', 'label' => 'Prénom',
'value' => $this->getData(['user', $this->getUrl(2), 'firstname']) 'value' => $this->getData(['user', $this->getUrl(2), 'firstname'])
]); ?> ]); ?>
@ -37,7 +37,7 @@
<div class="col6"> <div class="col6">
<?php echo template::text('userEditLastname', [ <?php echo template::text('userEditLastname', [
'autocomplete' => 'off', 'autocomplete' => 'off',
'disabled' => $this->getUser('group') > self::GROUP_EDITOR ? false : true, 'disabled' => $this->getUser('role') > self::GROUP_EDITOR ? false : true,
'label' => 'Nom', 'label' => 'Nom',
'value' => $this->getData(['user', $this->getUrl(2), 'lastname']) 'value' => $this->getData(['user', $this->getUrl(2), 'lastname'])
]); ?> ]); ?>
@ -77,7 +77,7 @@
<div class="col12"> <div class="col12">
<?php echo template::text('userEditTags', [ <?php echo template::text('userEditTags', [
'label' => 'Étiquettes', 'label' => 'Étiquettes',
'readonly' => $this->getUser('group') > self::GROUP_EDITOR ? false : true, 'readonly' => $this->getUser('role') > self::GROUP_EDITOR ? false : true,
'value' => $this->getData(['user', $this->getUrl(2), 'tags']), 'value' => $this->getData(['user', $this->getUrl(2), 'tags']),
'help' => 'Les étiquettes sont séparées par des espaces' 'help' => 'Les étiquettes sont séparées par des espaces'
]); ?> ]); ?>
@ -99,7 +99,7 @@
]); ?> ]); ?>
<?php <?php
// Les admins ont le pouvoir de forcer le changement de mot de passe // Les admins ont le pouvoir de forcer le changement de mot de passe
if ($this->getUser('group') < self::GROUP_ADMIN): ?> if ($this->getUser('role') < self::GROUP_ADMIN): ?>
<?php echo template::password('userEditOldPassword', [ <?php echo template::password('userEditOldPassword', [
'autocomplete' => 'new-password', 'autocomplete' => 'new-password',
// remplace 'off' pour éviter le pré remplissage auto // remplace 'off' pour éviter le pré remplissage auto
@ -125,16 +125,16 @@
</h4> </h4>
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<?php if ($this->getUser('group') === self::GROUP_ADMIN): ?> <?php if ($this->getUser('role') === self::GROUP_ADMIN): ?>
<?php echo template::select('userEditGroup', self::$groupEdits, [ <?php echo template::select('userEditGroup', self::$groupEdits, [
'disabled' => ($this->getUrl(2) === $this->getUser('id')), 'disabled' => ($this->getUrl(2) === $this->getUser('id')),
'help' => ($this->getUrl(2) === $this->getUser('id') ? 'Impossible de modifier votre propre groupe.' : ''), 'help' => ($this->getUrl(2) === $this->getUser('id') ? 'Impossible de modifier votre propre role.' : ''),
'label' => 'Groupe', 'label' => 'Role',
'selected' => $this->getData(['user', $this->getUrl(2), 'group']), 'selected' => $this->getData(['user', $this->getUrl(2), 'role']),
]); ?> ]); ?>
<?php else: ?> <?php else: ?>
<?php echo template::hidden('userEditGroup', [ <?php echo template::hidden('userEditGroup', [
'value' => $this->getData(['user', $this->getUrl(2), 'group']) 'value' => $this->getData(['user', $this->getUrl(2), 'role'])
]); ?> ]); ?>
<?php endif; ?> <?php endif; ?>
</div> </div>
@ -143,14 +143,14 @@
<?php echo template::select('userEditProfil' . self::GROUP_MEMBER, user::$userProfils[self::GROUP_MEMBER], [ <?php echo template::select('userEditProfil' . self::GROUP_MEMBER, user::$userProfils[self::GROUP_MEMBER], [
'label' => 'Profil', 'label' => 'Profil',
'selected' => $this->getData(['user', $this->getUrl(2), 'profil']), 'selected' => $this->getData(['user', $this->getUrl(2), 'profil']),
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN, 'disabled' => $this->getUser('role') !== self::GROUP_ADMIN,
]); ?> ]); ?>
</div> </div>
<div class="userEditGroupProfil" id="userEditGroupProfil<?php echo self::GROUP_EDITOR; ?>"> <div class="userEditGroupProfil" id="userEditGroupProfil<?php echo self::GROUP_EDITOR; ?>">
<?php echo template::select('userEditProfil' . self::GROUP_EDITOR, user::$userProfils[self::GROUP_EDITOR], [ <?php echo template::select('userEditProfil' . self::GROUP_EDITOR, user::$userProfils[self::GROUP_EDITOR], [
'label' => 'Profil', 'label' => 'Profil',
'selected' => $this->getData(['user', $this->getUrl(2), 'profil']), 'selected' => $this->getData(['user', $this->getUrl(2), 'profil']),
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN, 'disabled' => $this->getUser('role') !== self::GROUP_ADMIN,
]); ?> ]); ?>
</div> </div>
</div> </div>

View File

@ -61,7 +61,7 @@
<?php if (user::$users): ?> <?php if (user::$users): ?>
<div class="row"> <div class="row">
<div class="col12 textAlignCenter"> <div class="col12 textAlignCenter">
<?php echo template::table([1, 2, 2, 1, 1, 1, 2, 1, 1], user::$users, ['Id', 'Nom', 'Prénom', 'Groupe', 'Profil', 'Pseudo', 'eMail', 'Étiquettes', '']); ?> <?php echo template::table([1, 2, 2, 1, 1, 1, 2, 1, 1], user::$users, ['Id', 'Nom', 'Prénom', 'Role', 'Profil', 'Pseudo', 'eMail', 'Étiquettes', '']); ?>
<?php echo template::ico('check'); ?> Compte créé | <?php echo template::ico('check'); ?> Compte créé |
<?php echo template::ico('mail'); ?> Compte créé et notifié | <?php echo template::ico('mail'); ?> Compte créé et notifié |
<?php echo template::ico('cancel'); ?> Erreur dans le fichier ou le compte existe. <?php echo template::ico('cancel'); ?> Erreur dans le fichier ou le compte existe.

View File

@ -16,3 +16,13 @@
/** NE PAS EFFACER /** NE PAS EFFACER
* admin.css * admin.css
*/ */
/** Hide the timestamp column in the user list
*/
tbody td:nth-child(5) {
color: transparent; /* Masquer le texte par défaut */
}
tbody td.visible-text {
color: inherit; /* Rétablir la couleur du texte */
}

View File

@ -31,6 +31,20 @@ $(document).ready((function () {
stateSave: true, stateSave: true,
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "Tout"]], "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "Tout"]],
"columnDefs": [ "columnDefs": [
{
target: 4,
type: 'num', // Utilisez 'num' pour le tri
render: function (data) {
// Si data est un nombre, formatez-le en date
if (typeof data === 'number' || !isNaN(data)) {
return moment(Number(data) * 1000).format('DD/MM/YYYY HH:mm');
} else {
return data; // Sinon, affichez le texte tel quel
}
},
orderable: false,
searchable: false
},
{ {
target: 5, target: 5,
orderable: false, orderable: false,
@ -43,4 +57,15 @@ $(document).ready((function () {
} }
] ]
}); });
// Injecter la règle CSS pour la colonne cible
$('<style>')
.prop('type', 'text/css')
.html(`
table.dataTable tbody td:nth-child(5) {
color: inherit !important; /* Rétablir la couleur du texte */
}
`)
.appendTo('head');
})); }));

View File

@ -68,4 +68,4 @@
</div> </div>
</div> </div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>
<?php echo template::table([3, 2, 2, 2, 2, 1, 1], user::$users, ['Nom', 'Groupe', 'Profil', 'Étiquettes', 'Date dernière vue', '', ''], ['id' => 'dataTables']); ?> <?php echo template::table([3, 2, 2, 1, 3, 1, 1], user::$users, ['Nom', 'Role', 'Profil', 'Étiquettes', 'Dernière connexion', '', ''], ['id' => 'dataTables'], ['name','role','profile','tag','data-timestamp','edit','delete']); ?>

View File

@ -28,7 +28,7 @@
</div> </div>
<div class="col12"> <div class="col12">
<?php echo template::select('profilAddGroup', user::$groupProfils, [ <?php echo template::select('profilAddGroup', user::$groupProfils, [
'label' => 'Groupe associé', 'label' => 'Role associé',
'selected' => $this->getUrl(2) 'selected' => $this->getUrl(2)
]); ?> ]); ?>
</div> </div>

View File

@ -40,7 +40,7 @@
</div> </div>
<div class="col12"> <div class="col12">
<?php echo template::text('profilEditDisplayGroup', [ <?php echo template::text('profilEditDisplayGroup', [
'label' => 'Groupe associé', 'label' => 'Role associé',
'value' => helper::translate(self::$groups[$this->getUrl(2)]), 'value' => helper::translate(self::$groups[$this->getUrl(2)]),
'disabled' => true 'disabled' => true
]); ?> ]); ?>

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@ date_default_timezone_set('Europe/Paris');
$lang = isset($_GET['lang']) ? $_GET['lang'] : 'fr_FR'; $lang = isset($_GET['lang']) ? $_GET['lang'] : 'fr_FR';
setlocale(LC_CTYPE, $lang); setlocale(LC_CTYPE, $lang);
/* Lecture du groupe de l'utilisateur connecté pour attribuer les droits et les dossiers */ /* Lecture du role de l'utilisateur connecté pour attribuer les droits et les dossiers */
$userId = $_COOKIE['ZWII_USER_ID']; $userId = $_COOKIE['ZWII_USER_ID'];
$courseId = isset($_GET['fldr']) ? $_GET['fldr'] : ''; $courseId = isset($_GET['fldr']) ? $_GET['fldr'] : '';
$u = json_decode(file_get_contents('../../../site/data/user.json'), true); $u = json_decode(file_get_contents('../../../site/data/user.json'), true);
@ -25,8 +25,8 @@ $g = json_decode(file_get_contents('../../../site/data/profil.json'), true);
// Lecture les droits // Lecture les droits
if (!is_null($u) && !is_null($g) && !is_null($userId)) { if (!is_null($u) && !is_null($g) && !is_null($userId)) {
$group = $u['user'][$userId]['group']; $role = $u['user'][$userId]['role'];
switch ($group) { switch ($role) {
case 3: case 3:
// Accès admin // Accès admin
$file['delete'] = true; $file['delete'] = true;
@ -52,12 +52,12 @@ if (!is_null($u) && !is_null($g) && !is_null($userId)) {
case 1: case 1:
// Accès contrôlés par le profil // Accès contrôlés par le profil
$profil = $u['user'][$userId]['profil']; $profil = $u['user'][$userId]['profil'];
$file = $g['profil'][$group][$profil]['file']; $file = $g['profil'][$role][$profil]['file'];
$folder = $g['profil'][$group][$profil]['folder']; $folder = $g['profil'][$role][$profil]['folder'];
// membre sans profil déclaré ou accès interdit, pas d'accès // membre sans profil déclaré ou accès interdit, pas d'accès
if ( if (
is_null($profil) is_null($profil)
|| $g['profil'][$group][$profil]['filemanager'] === false || $g['profil'][$role][$profil]['filemanager'] === false
) { ) {
exit("<h1 style='color: red'>Accès interdit au gestionnaire de fichiers !</h1>"); exit("<h1 style='color: red'>Accès interdit au gestionnaire de fichiers !</h1>");
} }
@ -88,7 +88,7 @@ if (!is_null($u) && !is_null($g) && !is_null($userId)) {
} }
} }
/* Fin lecture du groupe de l'utilisateur connecté pour attribuer les droits et les dossiers */ /* Fin lecture du role de l'utilisateur connecté pour attribuer les droits et les dossiers */
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

BIN
core/vendor/zwiico/png/error.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -23,7 +23,7 @@ class blog extends common
const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json) const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json)
const EDIT_OWNER = 'owner'; const EDIT_OWNER = 'owner';
const EDIT_GROUP = 'group'; const EDIT_GROUP = 'role';
const EDIT_ALL = 'all'; const EDIT_ALL = 'all';
public static $actions = [ public static $actions = [
@ -112,7 +112,7 @@ class blog extends common
// Permissions d'un article // Permissions d'un article
public static $articleConsent = [ public static $articleConsent = [
self::EDIT_ALL => 'Tous les groupes', self::EDIT_ALL => 'Tous les groupes',
self::EDIT_GROUP => 'Groupe du propriétaire', self::EDIT_GROUP => 'Role du propriétaire',
self::EDIT_OWNER => 'Propriétaire' self::EDIT_OWNER => 'Propriétaire'
]; ];
@ -259,7 +259,7 @@ class blog extends common
$this->isPost() $this->isPost()
) { ) {
// Modification de l'userId // Modification de l'userId
if ($this->getUser('group') === self::GROUP_ADMIN) { if ($this->getUser('role') === self::GROUP_ADMIN) {
$newuserid = $this->getInput('blogAddUserId', helper::FILTER_STRING_SHORT, true); $newuserid = $this->getInput('blogAddUserId', helper::FILTER_STRING_SHORT, true);
} else { } else {
$newuserid = $this->getUser('id'); $newuserid = $this->getUser('id');
@ -284,7 +284,7 @@ class blog extends common
'state' => $this->getInput('blogAddState', helper::FILTER_BOOLEAN), 'state' => $this->getInput('blogAddState', helper::FILTER_BOOLEAN),
'title' => $this->getInput('blogAddTitle', helper::FILTER_STRING_SHORT, true), 'title' => $this->getInput('blogAddTitle', helper::FILTER_STRING_SHORT, true),
'userId' => $newuserid, 'userId' => $newuserid,
'editConsent' => $this->getInput('blogAddConsent') === self::EDIT_GROUP ? $this->getUser('group') : $this->getInput('blogAddConsent'), 'editConsent' => $this->getInput('blogAddConsent') === self::EDIT_GROUP ? $this->getUser('role') : $this->getInput('blogAddConsent'),
'commentMaxlength' => $this->getInput('blogAddCommentMaxlength'), 'commentMaxlength' => $this->getInput('blogAddCommentMaxlength'),
'commentApproved' => $this->getInput('blogAddCommentApproved', helper::FILTER_BOOLEAN), 'commentApproved' => $this->getInput('blogAddCommentApproved', helper::FILTER_BOOLEAN),
'commentClose' => $this->getInput('blogAddCommentClose', helper::FILTER_BOOLEAN), 'commentClose' => $this->getInput('blogAddCommentClose', helper::FILTER_BOOLEAN),
@ -493,13 +493,13 @@ class blog extends common
( // Propriétaire ( // Propriétaire
$this->getData(['module', $this->getUrl(0), 'posts', $value, 'editConsent']) === self::EDIT_OWNER $this->getData(['module', $this->getUrl(0), 'posts', $value, 'editConsent']) === self::EDIT_OWNER
and ($this->getData(['module', $this->getUrl(0), 'posts', $value, 'userId']) === $this->getUser('id') and ($this->getData(['module', $this->getUrl(0), 'posts', $value, 'userId']) === $this->getUser('id')
or $this->getUser('group') === self::GROUP_ADMIN) or $this->getUser('role') === self::GROUP_ADMIN)
) )
or ( or (
// Groupe // Role
$this->getData(['module', $this->getUrl(0), 'posts', $value, 'editConsent']) !== self::EDIT_OWNER $this->getData(['module', $this->getUrl(0), 'posts', $value, 'editConsent']) !== self::EDIT_OWNER
and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $value, 'editConsent']) and $this->getUser('role') >= $this->getData(['module', $this->getUrl(0), 'posts', $value, 'editConsent'])
) )
or ( or (
// Tout le monde // Tout le monde
@ -655,7 +655,7 @@ class blog extends common
$this->getUser('permission', __CLASS__, __FUNCTION__) === true && $this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost() $this->isPost()
) { ) {
if ($this->getUser('group') === self::GROUP_ADMIN) { if ($this->getUser('role') === self::GROUP_ADMIN) {
$newuserid = $this->getInput('blogEditUserId', helper::FILTER_STRING_SHORT, true); $newuserid = $this->getInput('blogEditUserId', helper::FILTER_STRING_SHORT, true);
} else { } else {
$newuserid = $this->getUser('id'); $newuserid = $this->getUser('id');
@ -683,7 +683,7 @@ class blog extends common
'publishedOn' => $this->getInput('blogEditPublishedOn', helper::FILTER_DATETIME, true), 'publishedOn' => $this->getInput('blogEditPublishedOn', helper::FILTER_DATETIME, true),
'state' => $this->getInput('blogEditState', helper::FILTER_BOOLEAN), 'state' => $this->getInput('blogEditState', helper::FILTER_BOOLEAN),
'userId' => $newuserid, 'userId' => $newuserid,
'editConsent' => $this->getInput('blogEditConsent') === self::EDIT_GROUP ? $this->getUser('group') : $this->getInput('blogEditConsent'), 'editConsent' => $this->getInput('blogEditConsent') === self::EDIT_GROUP ? $this->getUser('role') : $this->getInput('blogEditConsent'),
'commentMaxlength' => $this->getInput('blogEditCommentMaxlength'), 'commentMaxlength' => $this->getInput('blogEditCommentMaxlength'),
'commentApproved' => $this->getInput('blogEditCommentApproved', helper::FILTER_BOOLEAN), 'commentApproved' => $this->getInput('blogEditCommentApproved', helper::FILTER_BOOLEAN),
'commentClose' => $this->getInput('blogEditCommentClose', helper::FILTER_BOOLEAN), 'commentClose' => $this->getInput('blogEditCommentClose', helper::FILTER_BOOLEAN),
@ -707,10 +707,10 @@ class blog extends common
ksort(self::$users); ksort(self::$users);
foreach (self::$users as $userId => &$userFirstname) { foreach (self::$users as $userId => &$userFirstname) {
// Les membres ne sont pas éditeurs, les exclure de la liste // Les membres ne sont pas éditeurs, les exclure de la liste
if ($this->getData(['user', $userId, 'group']) < self::GROUP_EDITOR) { if ($this->getData(['user', $userId, 'role']) < self::GROUP_EDITOR) {
unset(self::$users[$userId]); unset(self::$users[$userId]);
} }
$userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']) . ' (' . self::$groupEdits[$this->getData(['user', $userId, 'group'])] . ')'; $userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']) . ' (' . self::$groupEdits[$this->getData(['user', $userId, 'role'])] . ')';
} }
unset($userFirstname); unset($userFirstname);
// Valeurs en sortie // Valeurs en sortie
@ -783,7 +783,7 @@ class blog extends common
$to = []; $to = [];
// Liste des destinataires // Liste des destinataires
foreach ($this->getData(['user']) as $userId => $user) { foreach ($this->getData(['user']) as $userId => $user) {
if ($user['group'] >= $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentGroupNotification'])) { if ($user['role'] >= $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentGroupNotification'])) {
$to[] = $user['mail']; $to[] = $user['mail'];
$firstname[] = $user['firstname']; $firstname[] = $user['firstname'];
$lastname[] = $user['lastname']; $lastname[] = $user['lastname'];

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Gelöschte Kommentare", "Commentaires supprimés": "Gelöschte Kommentare",
"Fermer les commentaires": "Schalten Sie die Kommentare aus", "Fermer les commentaires": "Schalten Sie die Kommentare aus",
"Gestion des commentaires": "Kommentarmanagement", "Gestion des commentaires": "Kommentarmanagement",
"Groupe du propriétaire": "Besitzergruppe", "Role du propriétaire": "Besitzergruppe",
"Image de couverture": "Berichterstattung", "Image de couverture": "Berichterstattung",
"Informations générales": "Allgemeine Informationen", "Informations générales": "Allgemeine Informationen",
"Lien du flux RSS": "Lien du flux RSS", "Lien du flux RSS": "Lien du flux RSS",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Deleted comments", "Commentaires supprimés": "Deleted comments",
"Fermer les commentaires": "Turn off the comments", "Fermer les commentaires": "Turn off the comments",
"Gestion des commentaires": "Comment management", "Gestion des commentaires": "Comment management",
"Groupe du propriétaire": "Owner's group", "Role du propriétaire": "Owner's role",
"Image de couverture": "Coverage", "Image de couverture": "Coverage",
"Informations générales": "General informations", "Informations générales": "General informations",
"Lien du flux RSS": "Lien du Flux RSS", "Lien du flux RSS": "Lien du Flux RSS",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Comentarios eliminados", "Commentaires supprimés": "Comentarios eliminados",
"Fermer les commentaires": "Cerrar los comentarios", "Fermer les commentaires": "Cerrar los comentarios",
"Gestion des commentaires": "Gestión de comentarios", "Gestion des commentaires": "Gestión de comentarios",
"Groupe du propriétaire": "Grupo de propietarios", "Role du propriétaire": "Grupo de propietarios",
"Image de couverture": "Imagen de portada", "Image de couverture": "Imagen de portada",
"Informations générales": "Información general", "Informations générales": "Información general",
"Lien du flux RSS": "Enlace de fuente RSS", "Lien du flux RSS": "Enlace de fuente RSS",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "", "Commentaires supprimés": "",
"Fermer les commentaires": "", "Fermer les commentaires": "",
"Gestion des commentaires": "", "Gestion des commentaires": "",
"Groupe du propriétaire": "", "Role du propriétaire": "",
"Image de couverture": "", "Image de couverture": "",
"Informations générales": "", "Informations générales": "",
"Lien du flux RSS": "", "Lien du flux RSS": "",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Σχόλια διαγράφονται", "Commentaires supprimés": "Σχόλια διαγράφονται",
"Fermer les commentaires": "Κλείσιμο σχολίων", "Fermer les commentaires": "Κλείσιμο σχολίων",
"Gestion des commentaires": "Διαχείριση σχολίων", "Gestion des commentaires": "Διαχείριση σχολίων",
"Groupe du propriétaire": "Ομάδα ιδιοκτήτη", "Role du propriétaire": "Ομάδα ιδιοκτήτη",
"Image de couverture": "εικόνα εξωφύλλου", "Image de couverture": "εικόνα εξωφύλλου",
"Informations générales": "Γενικές πληροφορίες", "Informations générales": "Γενικές πληροφορίες",
"Lien du flux RSS": "Σύνδεσμος τροφοδοσίας RSS", "Lien du flux RSS": "Σύνδεσμος τροφοδοσίας RSS",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Commenti cancellati", "Commentaires supprimés": "Commenti cancellati",
"Fermer les commentaires": "Disattiva i commenti", "Fermer les commentaires": "Disattiva i commenti",
"Gestion des commentaires": "Gestione dei commenti", "Gestion des commentaires": "Gestione dei commenti",
"Groupe du propriétaire": "Gruppo del proprietario", "Role du propriétaire": "Gruppo del proprietario",
"Image de couverture": "Copertura", "Image de couverture": "Copertura",
"Informations générales": "Informazioni generali", "Informations générales": "Informazioni generali",
"Lien du flux RSS": "Lien Du Flux RSS", "Lien du flux RSS": "Lien Du Flux RSS",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Comentários excluídos", "Commentaires supprimés": "Comentários excluídos",
"Fermer les commentaires": "Desligue os comentários", "Fermer les commentaires": "Desligue os comentários",
"Gestion des commentaires": "Gerenciamento de comentários", "Gestion des commentaires": "Gerenciamento de comentários",
"Groupe du propriétaire": "Grupo do proprietário", "Role du propriétaire": "Grupo do proprietário",
"Image de couverture": "Cobertura", "Image de couverture": "Cobertura",
"Informations générales": "Informações gerais", "Informations générales": "Informações gerais",
"Lien du flux RSS": "Lien du Flux RSS", "Lien du flux RSS": "Lien du Flux RSS",

View File

@ -27,7 +27,7 @@
"Commentaires supprimés": "Silinen yorumlar", "Commentaires supprimés": "Silinen yorumlar",
"Fermer les commentaires": "Yorumları kapat", "Fermer les commentaires": "Yorumları kapat",
"Gestion des commentaires": "Yorum yönetimi", "Gestion des commentaires": "Yorum yönetimi",
"Groupe du propriétaire": "Sahip grubu", "Role du propriétaire": "Sahip grubu",
"Image de couverture": "Kapak resmi", "Image de couverture": "Kapak resmi",
"Informations générales": "Genel bilgiler", "Informations générales": "Genel bilgiler",
"Lien du flux RSS": "RSS dağıtım bağlantısı", "Lien du flux RSS": "RSS dağıtım bağlantısı",

View File

@ -82,7 +82,7 @@
<?php echo template::select('blogAddUserId', blog::$users, [ <?php echo template::select('blogAddUserId', blog::$users, [
'label' => 'Auteur', 'label' => 'Auteur',
'selected' => $this->getUser('id'), 'selected' => $this->getUser('id'),
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN ? true : false 'disabled' => $this->getUser('role') !== self::GROUP_ADMIN ? true : false
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">

View File

@ -52,18 +52,18 @@
( // Propriétaire ( // Propriétaire
($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === blog::EDIT_OWNER ($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === blog::EDIT_OWNER
and ($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId']) === $this->getUser('id') and ($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId']) === $this->getUser('id')
or $this->getUser('group') === self::GROUP_ADMIN) or $this->getUser('role') === self::GROUP_ADMIN)
) )
or ( or (
// Groupe // Role
($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === self::GROUP_ADMIN ($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === self::GROUP_ADMIN
or $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === self::GROUP_EDITOR) or $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === self::GROUP_EDITOR)
and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) and $this->getUser('role') >= $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent'])
) )
or ( or (
// Tout le monde // Tout le monde
$this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === blog::EDIT_ALL $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === blog::EDIT_ALL
and $this->getUser('group') >= blog::$actions['config'] and $this->getUser('role') >= blog::$actions['config']
) )
) )
): ?> ): ?>

View File

@ -89,7 +89,7 @@
<?php echo template::select('blogEditUserId', blog::$users, [ <?php echo template::select('blogEditUserId', blog::$users, [
'label' => 'Auteur', 'label' => 'Auteur',
'selected' => $this->getUser('id'), 'selected' => $this->getUser('id'),
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN ? true : false 'disabled' => $this->getUser('role') !== self::GROUP_ADMIN ? true : false
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">

View File

@ -77,18 +77,18 @@
( // Propriétaire ( // Propriétaire
($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === blog::EDIT_OWNER ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === blog::EDIT_OWNER
and ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']) === $this->getUser('id') and ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId']) === $this->getUser('id')
or $this->getUser('group') === self::GROUP_ADMIN) or $this->getUser('role') === self::GROUP_ADMIN)
) )
or ( or (
// Groupe // Role
($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_ADMIN ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_ADMIN
or $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_EDITOR) or $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === self::GROUP_EDITOR)
and $this->getUser('group') >= $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) and $this->getUser('role') >= $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent'])
) )
or ( or (
// Tout le monde // Tout le monde
$this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === blog::EDIT_ALL $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === blog::EDIT_ALL
and $this->getUser('group') >= blog::$actions['config'] and $this->getUser('role') >= blog::$actions['config']
) )
) )
): ?> ): ?>

View File

@ -185,7 +185,7 @@ class form extends common
[ [
'button' => $this->getInput('formOptionButton'), 'button' => $this->getInput('formOptionButton'),
'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN), 'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN),
'group' => $this->getInput('formOptionGroup', helper::FILTER_INT), 'role' => $this->getInput('formOptionGroup', helper::FILTER_INT),
'user' => self::$listUsers[$this->getInput('formOptionUser', helper::FILTER_INT)], 'user' => self::$listUsers[$this->getInput('formOptionUser', helper::FILTER_INT)],
'mail' => $this->getInput('formOptionMail'), 'mail' => $this->getInput('formOptionMail'),
'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '', 'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '',
@ -454,19 +454,19 @@ class form extends common
'mail' 'mail'
]); ]);
$singlemail = $this->getData(['module', $this->getUrl(0), 'config', 'mail']); $singlemail = $this->getData(['module', $this->getUrl(0), 'config', 'mail']);
$group = $this->getData(['module', $this->getUrl(0), 'config', 'group']); $role = $this->getData(['module', $this->getUrl(0), 'config', 'role']);
// Verification si le mail peut être envoyé // Verification si le mail peut être envoyé
if ( if (
self::$inputNotices === [] && ( self::$inputNotices === [] && (
$group > 0 || $role > 0 ||
$singleuser !== '' || $singleuser !== '' ||
$singlemail !== '') $singlemail !== '')
) { ) {
// Utilisateurs dans le groupe // Utilisateurs dans le role
$to = []; $to = [];
if ($group > 0) { if ($role > 0) {
foreach ($this->getData(['user']) as $userId => $user) { foreach ($this->getData(['user']) as $userId => $user) {
if ($user['group'] >= $group) { if ($user['role'] >= $role) {
$to[] = $user['mail']; $to[] = $user['mail'];
} }
} }

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "Diese Aufnahme löschen?", "Supprimer cet enregistrement ?": "Diese Aufnahme löschen?",
"Supprimer tous les enregistrements ?": "Alle Aufnahmen löschen?", "Supprimer tous les enregistrements ?": "Alle Aufnahmen löschen?",
"Sélection": "Auswahl", "Sélection": "Auswahl",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Wählen Sie mindestens eine Gruppe, einen Benutzer, ein Benutzer oder geben Sie eine E -Mail ein. Ihr Server muss E -Mail -Sendungen zulassen.", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Wählen Sie mindestens eine Gruppe, einen Benutzer, ein Benutzer oder geben Sie eine E -Mail ein. Ihr Server muss E -Mail -Sendungen zulassen.",
"Type de signature": "Typ de Signature", "Type de signature": "Typ de Signature",
"Une colonne": "Eine Kolumne", "Une colonne": "Eine Kolumne",
"Validation du formulaire": "Validierung des Formulars", "Validation du formulaire": "Validierung des Formulars",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "Delete this recording?", "Supprimer cet enregistrement ?": "Delete this recording?",
"Supprimer tous les enregistrements ?": "Delete all recordings?", "Supprimer tous les enregistrements ?": "Delete all recordings?",
"Sélection": "Select", "Sélection": "Select",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Select at least one group, a user or enter an email. Your server must allow email shipments.", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Select at least one role, a user or enter an email. Your server must allow email shipments.",
"Type de signature": "Type de signature", "Type de signature": "Type de signature",
"Une colonne": "A column", "Une colonne": "A column",
"Validation du formulaire": "Form validation", "Validation du formulaire": "Form validation",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "¿Borrar este registro?", "Supprimer cet enregistrement ?": "¿Borrar este registro?",
"Supprimer tous les enregistrements ?": "¿Borrar todos los registros?", "Supprimer tous les enregistrements ?": "¿Borrar todos los registros?",
"Sélection": "Selección", "Sélection": "Selección",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Seleccione al menos un grupo, un usuario o ingrese un correo electrónico. Su servidor debe permitir el envío de correo.", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Seleccione al menos un grupo, un usuario o ingrese un correo electrónico. Su servidor debe permitir el envío de correo.",
"Type de signature": "Tipo de firma", "Type de signature": "Tipo de firma",
"Une colonne": "Una columna", "Une colonne": "Una columna",
"Validation du formulaire": "Validación del formulario", "Validation du formulaire": "Validación del formulario",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "", "Supprimer cet enregistrement ?": "",
"Supprimer tous les enregistrements ?": "", "Supprimer tous les enregistrements ?": "",
"Sélection": "", "Sélection": "",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "",
"Type de signature": "", "Type de signature": "",
"Une colonne": "", "Une colonne": "",
"Validation du formulaire": "", "Validation du formulaire": "",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "Να διαγράψω αυτό το αρχείο;", "Supprimer cet enregistrement ?": "Να διαγράψω αυτό το αρχείο;",
"Supprimer tous les enregistrements ?": "Διαγραφή όλων των εγγραφών;", "Supprimer tous les enregistrements ?": "Διαγραφή όλων των εγγραφών;",
"Sélection": "Επιλογή", "Sélection": "Επιλογή",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Επιλέξτε τουλάχιστον μία ομάδα, έναν χρήστη ή εισαγάγετε ένα email. Ο διακομιστής σας πρέπει να επιτρέπει την αποστολή αλληλογραφίας", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Επιλέξτε τουλάχιστον μία ομάδα, έναν χρήστη ή εισαγάγετε ένα email. Ο διακομιστής σας πρέπει να επιτρέπει την αποστολή αλληλογραφίας",
"Type de signature": "Τύπος υπογραφής", "Type de signature": "Τύπος υπογραφής",
"Une colonne": "1 στήλη", "Une colonne": "1 στήλη",
"Validation du formulaire": "Επικύρωση της φόρμας", "Validation du formulaire": "Επικύρωση της φόρμας",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "Elimina questa registrazione?", "Supprimer cet enregistrement ?": "Elimina questa registrazione?",
"Supprimer tous les enregistrements ?": "Elimina tutte le registrazioni?", "Supprimer tous les enregistrements ?": "Elimina tutte le registrazioni?",
"Sélection": "Selezione", "Sélection": "Selezione",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Seleziona almeno un gruppo, un utente o inserisci un'e -mail. Il tuo server deve consentire le spedizioni e -mail.", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Seleziona almeno un gruppo, un utente o inserisci un'e -mail. Il tuo server deve consentire le spedizioni e -mail.",
"Type de signature": "Tipo di firma", "Type de signature": "Tipo di firma",
"Une colonne": "Una colonna", "Une colonne": "Una colonna",
"Validation du formulaire": "Convalida del modulo", "Validation du formulaire": "Convalida del modulo",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "Excluir esta gravação?", "Supprimer cet enregistrement ?": "Excluir esta gravação?",
"Supprimer tous les enregistrements ?": "Excluir todas as gravações?", "Supprimer tous les enregistrements ?": "Excluir todas as gravações?",
"Sélection": "Seleção", "Sélection": "Seleção",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Selecione pelo menos um grupo, um usuário ou digite um email. Seu servidor deve permitir remessas por e -mail.", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "Selecione pelo menos um grupo, um usuário ou digite um email. Seu servidor deve permitir remessas por e -mail.",
"Type de signature": "Tipo de assinatura", "Type de signature": "Tipo de assinatura",
"Une colonne": "Uma coluna", "Une colonne": "Uma coluna",
"Validation du formulaire": "Validação do formulário", "Validation du formulaire": "Validação do formulário",

View File

@ -41,7 +41,7 @@
"Supprimer cet enregistrement ?": "Bu kayıt silinsin mi?", "Supprimer cet enregistrement ?": "Bu kayıt silinsin mi?",
"Supprimer tous les enregistrements ?": "Tüm kayıtlar silinsin mi?", "Supprimer tous les enregistrements ?": "Tüm kayıtlar silinsin mi?",
"Sélection": "Seçim", "Sélection": "Seçim",
"Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "En az bir grup, bir kullanıcı seçin veya bir e-posta girin. Sunucunuz posta göndermeye izin vermelidir.", "Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.": "En az bir grup, bir kullanıcı seçin veya bir e-posta girin. Sunucunuz posta göndermeye izin vermelidir.",
"Type de signature": "İmza türü", "Type de signature": "İmza türü",
"Une colonne": "Bir sütun", "Une colonne": "Bir sütun",
"Validation du formulaire": "Form doğrulama", "Validation du formulaire": "Form doğrulama",

View File

@ -3,7 +3,7 @@ class init extends form {
public static $defaultData = [ public static $defaultData = [
'button'=> '', 'button'=> '',
'captcha'=> false, 'captcha'=> false,
'group'=> 0, 'role'=> 0,
'user'=> '', 'user'=> '',
'mail'=> '', 'mail'=> '',
'pageId'=> '', 'pageId'=> '',

View File

@ -80,10 +80,10 @@
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Courriel'); ?></h4> <h4><?php echo helper::translate('Courriel'); ?></h4>
<?php echo template::checkbox('formOptionMailOptionsToggle', true, 'Envoyer par mail les données saisies :', [ <?php echo template::checkbox('formOptionMailOptionsToggle', true, 'Envoyer par mail les données saisies :', [
'checked' => (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || 'checked' => (bool) $this->getData(['module', $this->getUrl(0), 'config', 'role']) ||
!empty($this->getData(['module', $this->getUrl(0), 'config', 'user'])) || !empty($this->getData(['module', $this->getUrl(0), 'config', 'user'])) ||
!empty($this->getData(['module', $this->getUrl(0), 'config', 'mail'])), !empty($this->getData(['module', $this->getUrl(0), 'config', 'mail'])),
'help' => 'Sélectionnez au moins un groupe, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.' 'help' => 'Sélectionnez au moins un role, un utilisateur ou saisissez un email. Votre serveur doit autoriser les envois de mail.'
]); ?> ]); ?>
<div id="formOptionMailOptions" class="displayNone"> <div id="formOptionMailOptions" class="displayNone">
<div class="row"> <div class="row">
@ -103,7 +103,7 @@
<div class="col4"> <div class="col4">
<?php echo template::select('formOptionGroup', $groupMembers, [ <?php echo template::select('formOptionGroup', $groupMembers, [
'label' => 'A tous les groupes depuis', 'label' => 'A tous les groupes depuis',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'role']),
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">

View File

@ -42,7 +42,7 @@
$this->isConnected() === true $this->isConnected() === true
and and
( // Propriétaire ( // Propriétaire
($this->getUser('group') === self::GROUP_ADMIN) ($this->getUser('role') === self::GROUP_ADMIN)
) )
): ?> ): ?>
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1); ?>"> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1); ?>">

View File

@ -52,7 +52,7 @@
$this->isConnected() === true $this->isConnected() === true
and and
( // Propriétaire ( // Propriétaire
($this->getUser('group') === self::GROUP_ADMIN) ($this->getUser('role') === self::GROUP_ADMIN)
) )
): ?> ): ?>
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsId; ?>"> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsId; ?>">

View File

@ -59,7 +59,7 @@ class redirection extends common
// Message si l'utilisateur peut éditer la page // Message si l'utilisateur peut éditer la page
if ( if (
$this->isConnected() === true $this->isConnected() === true
&& $this->getUser('group') >= self::GROUP_EDITOR && $this->getUser('role') >= self::GROUP_EDITOR
&& $this->getUrl(1) !== 'force' && $this->getUrl(1) !== 'force'
) { ) {
// Valeurs en sortie // Valeurs en sortie

View File

@ -208,7 +208,7 @@ class search extends common
foreach ($this->getHierarchy(null, false, null) as $parentId => $childIds) { foreach ($this->getHierarchy(null, false, null) as $parentId => $childIds) {
if ( if (
$this->getData(['page', $parentId, 'disable']) === false && $this->getData(['page', $parentId, 'disable']) === false &&
$this->getUser('group') >= $this->getData(['page', $parentId, 'group']) && $this->getUser('role') >= $this->getData(['page', $parentId, 'role']) &&
$this->getData(['page', $parentId, 'block']) !== 'bar' $this->getData(['page', $parentId, 'block']) !== 'bar'
) { ) {
$url = $parentId; $url = $parentId;
@ -227,7 +227,7 @@ class search extends common
// Sous page // Sous page
if ( if (
$this->getData(['page', $childId, 'disable']) === false && $this->getData(['page', $childId, 'disable']) === false &&
$this->getUser('group') >= $this->getData(['page', $parentId, 'group']) && $this->getUser('role') >= $this->getData(['page', $parentId, 'role']) &&
$this->getData(['page', $parentId, 'block']) !== 'bar' $this->getData(['page', $parentId, 'block']) !== 'bar'
) { ) {
$url = $childId; $url = $childId;

View File

@ -113,10 +113,10 @@ class suscribe extends common
// Impossible de s'auto-éditer // Impossible de s'auto-éditer
( (
$this->getUser('id') === 'user' $this->getUser('id') === 'user'
and $this->getUrl('group') <= self::GROUP_VISITOR and $this->getUrl('role') <= self::GROUP_VISITOR
) )
// Impossible d'éditer un autre utilisateur // Impossible d'éditer un autre utilisateur
or ($this->getUrl('group') < self::GROUP_EDITOR) or ($this->getUrl('role') < self::GROUP_EDITOR)
) )
) { ) {
// Valeurs en sortie // Valeurs en sortie
@ -138,7 +138,7 @@ class suscribe extends common
[ [
'firstname' => $this->getData(['module', $this->getUrl(0), 'users', $this->getUrl(2), 'firstname']), 'firstname' => $this->getData(['module', $this->getUrl(0), 'users', $this->getUrl(2), 'firstname']),
'forgot' => 0, 'forgot' => 0,
'group' => $this->getInput('registrationUserEditGroup', helper::FILTER_INT), 'role' => $this->getInput('registrationUserEditGroup', helper::FILTER_INT),
// Le profil vaut 0 pour les amdins et 1 pour les autres membres, profil par défaut. // Le profil vaut 0 pour les amdins et 1 pour les autres membres, profil par défaut.
'profil' => $this->getInput('registrationUserEditGroup', helper::FILTER_INT) === self::GROUP_ADMIN 'profil' => $this->getInput('registrationUserEditGroup', helper::FILTER_INT) === self::GROUP_ADMIN
? 0 : 1, ? 0 : 1,
@ -165,7 +165,7 @@ class suscribe extends common
'state' => true 'state' => true
]); ]);
} }
// Changement temporaire de libellé du groupe 0 // Changement temporaire de libellé du role 0
self::$groups = self::$groupEdits; self::$groups = self::$groupEdits;
self::$groups[self::GROUP_BANNED] = 'En attente d\'approbation'; self::$groups[self::GROUP_BANNED] = 'En attente d\'approbation';
@ -203,7 +203,7 @@ class suscribe extends common
if ( if (
// L'utilisateur n'existe pas // L'utilisateur n'existe pas
$this->getData(['module', $this->getUrl(0), 'users', $this->getUrl(2)]) === null $this->getData(['module', $this->getUrl(0), 'users', $this->getUrl(2)]) === null
// Groupe insuffisant // Role insuffisant
&& $this->getUser('permission', __CLASS__, __FUNCTION__) !== true && $this->getUser('permission', __CLASS__, __FUNCTION__) !== true
) { ) {
// Valeurs en sortie // Valeurs en sortie
@ -303,7 +303,7 @@ class suscribe extends common
'lastname' => $userLastname, 'lastname' => $userLastname,
'mail' => $userMail, 'mail' => $userMail,
'password' => '', 'password' => '',
// pas de groupe afin de le différencier dans la liste des users // pas de role afin de le différencier dans la liste des users
'timer' => time(), 'timer' => time(),
'pseudo' => $userId, 'pseudo' => $userId,
'auth' => $auth, 'auth' => $auth,
@ -311,10 +311,10 @@ class suscribe extends common
] ]
]); ]);
// Mail d'avertissement aux administrateurs // Mail d'avertissement aux administrateurs
// Utilisateurs dans le groupe admin // Utilisateurs dans le role admin
$to = []; $to = [];
foreach ($this->getData(['user']) as $key => $user) { foreach ($this->getData(['user']) as $key => $user) {
if ($user['group'] == self::GROUP_ADMIN) { if ($user['role'] == self::GROUP_ADMIN) {
$to[] = $user['mail']; $to[] = $user['mail'];
} }
} }
@ -418,7 +418,7 @@ class suscribe extends common
'lastname' => $this->getData(['module', $this->getUrl(0), 'users', $userId, 'lastname']), 'lastname' => $this->getData(['module', $this->getUrl(0), 'users', $userId, 'lastname']),
'mail' => $this->getData(['module', $this->getUrl(0), 'users', $userId, 'mail']), 'mail' => $this->getData(['module', $this->getUrl(0), 'users', $userId, 'mail']),
'password' => $this->getInput('registrationValidPassword', helper::FILTER_PASSWORD, true), 'password' => $this->getInput('registrationValidPassword', helper::FILTER_PASSWORD, true),
'group' => self::GROUP_MEMBER, 'role' => self::GROUP_MEMBER,
'profil' => 1, 'profil' => 1,
'forgot' => 0, 'forgot' => 0,
'pseudo' => $userId, 'pseudo' => $userId,

View File

@ -25,11 +25,11 @@
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php if ($this->getUser('group') === self::GROUP_ADMIN): ?> <?php if ($this->getUser('role') === self::GROUP_ADMIN): ?>
<?php echo template::select('registrationUserEditGroup', suscribe::$groups, [ <?php echo template::select('registrationUserEditGroup', suscribe::$groups, [
'disabled' => ($this->getUrl(2) === $this->getUser('id')), 'disabled' => ($this->getUrl(2) === $this->getUser('id')),
'help' => ($this->getUrl(2) === $this->getUser('id') ? 'Impossible de modifier votre propre groupe.' : ''), 'help' => ($this->getUrl(2) === $this->getUser('id') ? 'Impossible de modifier votre propre role.' : ''),
'label' => 'Groupe', 'label' => 'Role',
'selected' => $this->getData(['module', $this->getUrl(0), 'registrationUsers', $this->getUrl(2), 'status']) 'selected' => $this->getData(['module', $this->getUrl(0), 'registrationUsers', $this->getUrl(2), 'status'])
]); ?> ]); ?>
<?php endif; ?> <?php endif; ?>
@ -40,7 +40,7 @@
<?php echo template::select('registrationUserEditProfil' . self::GROUP_MEMBER, suscribe::$userProfils[self::GROUP_MEMBER], [ <?php echo template::select('registrationUserEditProfil' . self::GROUP_MEMBER, suscribe::$userProfils[self::GROUP_MEMBER], [
'label' => 'Profil', 'label' => 'Profil',
'selected' => $this->getData(['user', $this->getUrl(2), 'profil']), 'selected' => $this->getData(['user', $this->getUrl(2), 'profil']),
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN, 'disabled' => $this->getUser('role') !== self::GROUP_ADMIN,
]); ?> ]); ?>
</div> </div>
<div class="registrationUserEditGroupProfil" <div class="registrationUserEditGroupProfil"
@ -48,7 +48,7 @@
<?php echo template::select('registrationUserEditProfil' . self::GROUP_EDITOR, suscribe::$userProfils[self::GROUP_EDITOR], [ <?php echo template::select('registrationUserEditProfil' . self::GROUP_EDITOR, suscribe::$userProfils[self::GROUP_EDITOR], [
'label' => 'Profil', 'label' => 'Profil',
'selected' => $this->getData(['user', $this->getUrl(2), 'profil']), 'selected' => $this->getData(['user', $this->getUrl(2), 'profil']),
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN, 'disabled' => $this->getUser('role') !== self::GROUP_ADMIN,
]); ?> ]); ?>
</div> </div>
</div> </div>