filtre des membres

This commit is contained in:
Fred Tempez 2023-10-09 19:38:35 +02:00
parent c21986a97e
commit bad28659df
4 changed files with 136 additions and 31 deletions

View File

@ -1,19 +1,24 @@
# Changelog # 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 ## 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 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. - 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. - 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. - 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. - 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. - Supprime la gestion d'erreur à l'étape 4 de la mise à jour automatique.
- Modifie l'URL de téléchargement des mises à jour. - 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. - Améliore l'affichage des dates lorsque le site est affiché dans une langue étrangère.
## Version 13.0.03 ## 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. - 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. - 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. - 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 - Module blog Version 7.1 : permission lors de la validation d'un formulaire
## Version 13.0.02 ## Version 13.0.02
# Corrections ### Corrections
- Bug de renommage de la base de données des fontes - Bug de renommage de la base de données des fontes
## Version 13.0.01 ## Version 13.0.01
# Corrections ### Corrections
- Mauvaise présentation de l'icône devant les pages enfants dans la liste de liens de TinyMCE. - 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. - Module redirection : édition de la page ou du module impossible.
## Version 13.0.00 ## 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. - 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. - 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. - 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. - 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. - 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. - 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. - Correction de bugs mineurs dans la sauvegarde et la suppression des modules installés.
- Problèmes de mise à jour depuis les versions 11. - Problèmes de mise à jour depuis les versions 11.
- Dépréciations liées à php 8.n - Dépréciations liées à php 8.n

View File

@ -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 = '13.0.04'; const ZWII_VERSION = '13.0.05';
// URL autoupdate // URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/cms/'; const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/cms/';

View File

@ -73,6 +73,12 @@ class user extends common
public static $profils = []; public static $profils = [];
public static $alphabet = [];
public static $courseGroups = [
'all' => 'Tout'
];
/** /**
* Ajout * Ajout
*/ */
@ -135,9 +141,9 @@ class user extends common
if ($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) { if ($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) {
$sent = $this->sendMail( $sent = $this->sendMail(
$userMail, $userMail,
'Compte créé sur ' . $this->getData(['locale', 'title']), 'Compte créé sur ' . $this->getData(['config', 'title']),
'Bonjour <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' . 'Bonjour <strong>' . $userFirstname . ' ' . $userLastname . '</strong>,<br><br>' .
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' . 'Un administrateur vous a créé un compte sur le site ' . $this->getData(['config', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('userAddId') . '<br>' . '<strong>Identifiant du compte :</strong> ' . $this->getInput('userAddId') . '<br>' .
'<small>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.</small>', '<small>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.</small>',
null, null,
@ -430,17 +436,69 @@ class user extends common
*/ */
public function index() public function index()
{ {
$userIdsFirstnames = helper::arrayColumn($this->getData(['user']), 'firstname'); // Liste des groupes et des profils
ksort($userIdsFirstnames); $courseGroups = $this->getData(['profil']);
foreach ($userIdsFirstnames as $userId => $userFirstname) { 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'])) { if ($this->getData(['user', $userId, 'group'])) {
$group = helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]); // Filtres
$profil = $this->getData(['profil', $this->getData(['user', $userId, 'group']), $this->getData(['user', $userId, 'profil']), 'name']); 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[] = [ self::$users[] = [
$userId, $userId,
$userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']), $this->getData(['user', $userId, 'firstname']) . ' ' . $userLastNames,
$group, helper::translate(self::$groups[(int) $this->getData(['user', $userId, 'group'])]),
empty($profil) ? $group : $profil, 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, [ template::button('userEdit' . $userId, [
'href' => helper::baseUrl() . 'user/edit/' . $userId, 'href' => helper::baseUrl() . 'user/edit/' . $userId,
'value' => template::ico('pencil'), 'value' => template::ico('pencil'),
@ -545,7 +603,8 @@ class user extends common
// Gère le chemin // Gère le chemin
$fileManager = $this->getInput('profilEditFileManager', helper::FILTER_BOOLEAN); $fileManager = $this->getInput('profilEditFileManager', helper::FILTER_BOOLEAN);
$path = $this->getInput('profilEditPath'); $path = $this->getInput('profilEditPath');
if ($group <= self::GROUP_ADMIN if (
$group <= self::GROUP_ADMIN
&& $fileManager && $fileManager
&& empty($path) && empty($path)
) { ) {
@ -681,12 +740,14 @@ class user extends common
// Gère le chemin // Gère le chemin
$fileManager = $this->getInput('profilAddFileManager', helper::FILTER_BOOLEAN); $fileManager = $this->getInput('profilAddFileManager', helper::FILTER_BOOLEAN);
$path = $this->getInput('profilAddPath'); $path = $this->getInput('profilAddPath');
if ($group <= self::GROUP_ADMIN if (
$group <= self::GROUP_ADMIN
&& $fileManager && $fileManager
&& empty($path) && empty($path)
) { ) {
$fileManager = false; $fileManager = false;
} }
if ($profil < self::MAX_PROFILS) { if ($profil < self::MAX_PROFILS) {
$profil = (string) ($profil + 1); $profil = (string) ($profil + 1);
// Données du formulaire // Données du formulaire
@ -1072,11 +1133,13 @@ class user extends common
and array_key_exists('nom', $item) and array_key_exists('nom', $item)
and array_key_exists('groupe', $item) and array_key_exists('groupe', $item)
and array_key_exists('email', $item) and array_key_exists('email', $item)
and array_key_exists('passe', $item)
and $item['nom'] and $item['nom']
and $item['prenom'] and $item['prenom']
and $item['id'] and $item['id']
and $item['email'] and $item['email']
and $item['groupe'] and $item['groupe']
and $item['passe']
) { ) {
// Validation du groupe // Validation du groupe
$item['groupe'] = (int) $item['groupe']; $item['groupe'] = (int) $item['groupe'];
@ -1113,7 +1176,7 @@ class user extends common
'pseudo' => $item['prenom'], 'pseudo' => $item['prenom'],
'signature' => 1, 'signature' => 1,
// Pseudo // Pseudo
'password' => uniqid(), 'password' => helper::filter($item['passe'], helper::FILTER_PASSWORD),
// A modifier à la première connexion // A modifier à la première connexion
"connectFail" => null, "connectFail" => null,
"connectTimeout" => null, "connectTimeout" => null,
@ -1131,9 +1194,9 @@ class user extends common
) { ) {
$sent = $this->sendMail( $sent = $this->sendMail(
$item['email'], $item['email'],
'Compte créé sur ' . $this->getData(['locale', 'title']), 'Compte créé sur ' . $this->getData(['config', 'title']),
'Bonjour <strong>' . $item['prenom'] . ' ' . $item['nom'] . '</strong>,<br><br>' . 'Bonjour <strong>' . $item['prenom'] . ' ' . $item['nom'] . '</strong>,<br><br>' .
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['locale', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' . 'Un administrateur vous a créé un compte sur le site ' . $this->getData(['config', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $userId . '<br>' . '<strong>Identifiant du compte :</strong> ' . $userId . '<br>' .
'<small>Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.</small>', '<small>Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.</small>',
null, null,

View File

@ -38,4 +38,41 @@
]); ?> ]); ?>
</div> </div>
</div> </div>
<?php echo template::formOpen('userFilterUserForm'); ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Filtres'); ?>
</h4>
<div class="row">
<div class="col3">
<?php echo template::select('userFilterGroup', $module::$courseGroups, [
'label' => 'Groupes / Profils',
'selected' => isset($_POST['userFilterGroup']) ? $_POST['userFilterGroup'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('userFilterFirstName', $module::$alphabet, [
'label' => 'Prénom commence par',
'selected' => isset($_POST['userFilterFirstName']) ? $_POST['userFilterFirstName'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('userFilterLastName', $module::$alphabet, [
'label' => 'Nom commence par',
'selected' => isset($_POST['userFilterLastName']) ? $_POST['userFilterLastName'] : 'all',
]); ?>
</div>
<div class="col2 offset1">
<?php echo template::submit('userFilterSubmit', [
'value' => 'Filtrer',
'uniqueSubmission' => true
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>
<?php echo template::table([2, 2 , 3, 3, 1, 1], $module::$users, ['Identifiant', 'Nom', 'Groupe', 'Profil', '', '']); ?> <?php echo template::table([2, 2 , 3, 3, 1, 1], $module::$users, ['Identifiant', 'Nom', 'Groupe', 'Profil', '', '']); ?>