From bad28659dfc0ec11185c968a7505fec278f9fe5f Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 9 Oct 2023 19:38:35 +0200 Subject: [PATCH] filtre des membres --- CHANGES.md | 19 +++-- core/core.php | 2 +- core/module/user/user.php | 109 ++++++++++++++++++++------ core/module/user/view/index/index.php | 37 +++++++++ 4 files changed, 136 insertions(+), 31 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 2dce02cb..3d174af0 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,19 +1,24 @@ # Changelog +## Version 13.0.05 +### Améliorations +- Ajoute des filtres des membres, groupes/profils, prénoms et noms commençant par telle lettre. +- Restaure la gestion d'erreur à l'étape 4 de la mise à jour automatique. + ## Version 13.0.04 -# Corrections +### Corrections - Corrige un bug de sécurité. Lorsqu'un profil dispose des droits d'accès au gestionnaire de fichiers et qu'aucun dossier est sélectionné, la racine du site était affichée. - Corrige un problème d'affichage des commentaires des profils dans l'édition d'un compte. - Erreur d'édition d'un profil de niveau 1, exemple membre simple. - Le profil de membre simple affichait le gestionnaire de fichiers dans tous les cas. - Importation d'utilisateurs en masse, le bouton de téléchargement d'un modèle était inopérant. -# Améliorations +### Améliorations - Supprime la gestion d'erreur à l'étape 4 de la mise à jour automatique. - Modifie l'URL de téléchargement des mises à jour. - Améliore l'affichage des dates lorsque le site est affiché dans une langue étrangère. ## Version 13.0.03 -# Améliorations +### Améliorations - Déplacement du bouton de gestion des langues à la droite du sélecteur de langues dans la barre d'administration. Le sélecteur de langue est toujours affiché même si le français est la seule langue disponible. - Suppression d'appels inutiles à une fonction de contrôle CSRF. - Supprime les fonctions liées à la gestion des données des modules contenant des bugs variés. @@ -25,16 +30,16 @@ - Module blog Version 7.1 : permission lors de la validation d'un formulaire ## Version 13.0.02 -# Corrections +### Corrections - Bug de renommage de la base de données des fontes ## Version 13.0.01 -# Corrections +### Corrections - Mauvaise présentation de l'icône devant les pages enfants dans la liste de liens de TinyMCE. - Module redirection : édition de la page ou du module impossible. ## Version 13.0.00 -# Améliorations +### Améliorations - Gestion des profils d'utilisateurs dans les groupes de membres et d'éditeurs (modérateurs). Les profils définissent avec précision les autorisations d'accès à toutes les fonctions du CMS. - Améliore la gestion de la base de données et la génération du fichier de journalisation, stockage des données JSON, forçage au format objet. - Erreurs fictives pendant la mise à jour en ligne, améliorations du dialogue AJAX entre PHP et JQUERY avec un affichage précis des erreurs. @@ -42,7 +47,7 @@ - Format d'image avif si supporté par la version installée de php. - Remplacement du service ScreenShot API par un sélecteur manuel ; affiche les paramètres d'images recommandées et ceux de l'image sélectionnée. - Nouvelles options de page qui autorise un déplacement latéral dans la hiérarchie du menu à l'aide de deux boutons personnalisables parmi 3 modèles. -# Corrections +### Corrections - Correction de bugs mineurs dans la sauvegarde et la suppression des modules installés. - Problèmes de mise à jour depuis les versions 11. - Dépréciations liées à php 8.n diff --git a/core/core.php b/core/core.php index 161a0673..1cdd5a7b 100644 --- a/core/core.php +++ b/core/core.php @@ -51,7 +51,7 @@ class common const ACCESS_TIMER = 1800; // Numéro de version - const ZWII_VERSION = '13.0.04'; + const ZWII_VERSION = '13.0.05'; // URL autoupdate const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/cms/'; diff --git a/core/module/user/user.php b/core/module/user/user.php index 641fcb10..5e42c5cc 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -73,6 +73,12 @@ class user extends common public static $profils = []; + public static $alphabet = []; + + public static $courseGroups = [ + 'all' => 'Tout' + ]; + /** * Ajout */ @@ -135,9 +141,9 @@ class user extends common if ($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) { $sent = $this->sendMail( $userMail, - 'Compte créé sur ' . $this->getData(['locale', 'title']), + 'Compte créé sur ' . $this->getData(['config', 'title']), 'Bonjour ' . $userFirstname . ' ' . $userLastname . ',

' . - 'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.

' . + 'Un administrateur vous a créé un compte sur le site ' . $this->getData(['config', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.

' . 'Identifiant du compte : ' . $this->getInput('userAddId') . '
' . 'Nous ne conservons pas les mots de passe, en conséquence nous vous conseillons de conserver ce message tant que vous ne vous êtes pas connecté. Vous pourrez modifier votre mot de passe après votre première connexion.', null, @@ -430,17 +436,69 @@ class user extends common */ public function index() { - $userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname'); - ksort($userIdsFirstnames); - foreach ($userIdsFirstnames as $userId => $userFirstname) { + // Liste des groupes et des profils + $courseGroups = $this->getData(['profil']); + foreach ($courseGroups as $groupId => $groupValue) { + switch ($groupId) { + case "-1": + case "0": + case "3": + break; + case "1": + case "2": + foreach ($groupValue as $profilId => $profilValue) { + if ($profilId) { + self::$courseGroups[$groupId . $profilId] = sprintf(helper::translate('Groupe %s - Profil %s'), self::$groupPublics[$groupId], $profilValue['name']); + } + } + } + } + + // Liste alphabétique + self::$alphabet = range('A', 'Z'); + $alphabet = range('A', 'Z'); + self::$alphabet = array_combine($alphabet, self::$alphabet); + self::$alphabet = array_merge(['all' => 'Tout'], self::$alphabet); + + // Liste des membres + $userIdsLastNames = helper::arrayColumn($this->getData(['user']), 'lastname'); + ksort($userIdsLastNames); + foreach ($userIdsLastNames as $userId => $userLastNames) { if ($this->getData(['user', $userId, 'group'])) { - $group = helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]); - $profil = $this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name']); + // Filtres + if ($this->isPost()) { + // Groupe et profils + $group = (string) $this->getData(['user', $userId, 'group']); + $profil = (string) $this->getData(['user', $userId, 'profil']); + $firstName = $this->getData(['user', $userId, 'firstname']); + $lastName = $this->getData(['user', $userId, 'lastname']); + if ( + $this->getInput('userFilterGroup', helper::FILTER_INT) > 0 + && $this->getInput('userFilterGroup', helper::FILTER_STRING_SHORT) !== $group . $profil + ) + continue; + // Première lettre du prénom + if ( + $this->getInput('userFilterFirstName', helper::FILTER_STRING_SHORT) !== 'all' + && $this->getInput('userFilterFirstName', helper::FILTER_STRING_SHORT) !== strtoupper(substr($firstName, 0, 1)) + ) + continue; + // Première lettre du nom + if ( + $this->getInput('userFilterLastName', helper::FILTER_STRING_SHORT) !== 'all' + && $this->getInput('userFilterLastName', helper::FILTER_STRING_SHORT) !== strtoupper(substr($lastName, 0, 1)) + ) + continue; + } + + // Formatage de la liste self::$users[] = [ $userId, - $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']), - $group, - empty($profil) ? $group : $profil, + $this->getData(['user', $userId, 'firstname']) . ' ' . $userLastNames, + helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]), + empty($this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name'])) + ? helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]) + : $this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name']), template::button('userEdit' . $userId, [ 'href' => helper::baseUrl() . 'user/edit/' . $userId, 'value' => template::ico('pencil'), @@ -499,7 +557,7 @@ class user extends common foreach ($groupData as $profilId => $profilData) { self::$userGroups[$groupId . '.' . $profilId] = [ $groupId . '-' . $profilId, - helper::translate(self::$groups[$groupId]). '
Profil : ' . helper::translate($profilData['name']), + helper::translate(self::$groups[$groupId]) . '
Profil : ' . helper::translate($profilData['name']), nl2br(helper::translate($profilData['comment'])), template::button('profilEdit' . $groupId . $profilId, [ 'href' => helper::baseUrl() . 'user/profilEdit/' . $groupId . '/' . $profilId, @@ -540,16 +598,17 @@ class user extends common // Effacer les données du numéro de profil ancien $group = $this->getInput('profilEditGroup', helper::FILTER_STRING_SHORT, true); // 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); // Gère le chemin $fileManager = $this->getInput('profilEditFileManager', helper::FILTER_BOOLEAN); $path = $this->getInput('profilEditPath'); - if ($group <= self::GROUP_ADMIN - && $fileManager + if ( + $group <= self::GROUP_ADMIN + && $fileManager && empty($path) - ) { - $fileManager = false; + ) { + $fileManager = false; } if ($profil !== $profil) { $this->deleteData(['profil', $group, $oldProfil]); @@ -681,12 +740,14 @@ class user extends common // Gère le chemin $fileManager = $this->getInput('profilAddFileManager', helper::FILTER_BOOLEAN); $path = $this->getInput('profilAddPath'); - if ($group <= self::GROUP_ADMIN - && $fileManager + if ( + $group <= self::GROUP_ADMIN + && $fileManager && empty($path) - ) { - $fileManager = false; + ) { + $fileManager = false; } + if ($profil < self::MAX_PROFILS) { $profil = (string) ($profil + 1); // Données du formulaire @@ -1072,11 +1133,13 @@ class user extends common and array_key_exists('nom', $item) and array_key_exists('groupe', $item) and array_key_exists('email', $item) + and array_key_exists('passe', $item) and $item['nom'] and $item['prenom'] and $item['id'] and $item['email'] and $item['groupe'] + and $item['passe'] ) { // Validation du groupe $item['groupe'] = (int) $item['groupe']; @@ -1113,7 +1176,7 @@ class user extends common 'pseudo' => $item['prenom'], 'signature' => 1, // Pseudo - 'password' => uniqid(), + 'password' => helper::filter($item['passe'], helper::FILTER_PASSWORD), // A modifier à la première connexion "connectFail" => null, "connectTimeout" => null, @@ -1131,9 +1194,9 @@ class user extends common ) { $sent = $this->sendMail( $item['email'], - 'Compte créé sur ' . $this->getData(['locale', 'title']), + 'Compte créé sur ' . $this->getData(['config', 'title']), 'Bonjour ' . $item['prenom'] . ' ' . $item['nom'] . ',

' . - 'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.

' . + 'Un administrateur vous a créé un compte sur le site ' . $this->getData(['config', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.

' . 'Identifiant du compte : ' . $userId . '
' . 'Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.', null, diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 5a3f67c1..80e36a37 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -38,4 +38,41 @@ ]); ?> + +
+
+
+

+ +

+
+
+ 'Groupes / Profils', + 'selected' => isset($_POST['userFilterGroup']) ? $_POST['userFilterGroup'] : 'all', + ]); ?> +
+
+ 'Prénom commence par', + 'selected' => isset($_POST['userFilterFirstName']) ? $_POST['userFilterFirstName'] : 'all', + ]); ?> +
+
+ 'Nom commence par', + 'selected' => isset($_POST['userFilterLastName']) ? $_POST['userFilterLastName'] : 'all', + ]); ?> +
+
+ 'Filtrer', + 'uniqueSubmission' => true + ]); ?> +
+
+
+
+
+ \ No newline at end of file