Merge branch 'import_user' into blog_v3

This commit is contained in:
Prof Langues 2020-10-08 15:37:50 +02:00
commit 96d2fc2e0d
10 changed files with 226 additions and 12 deletions

View File

@ -13,11 +13,13 @@
- Approbation des commentaires - Approbation des commentaires
## version 10.3.02 ## version 10.3.02
- Correction : - Corrections :
- Icône de pied de page github manquante. - Icône de pied de page github manquante.
- Mauvaise redirection après changement de mot de passe d'un membre.
- Modifications : - Modifications :
- Nouvelles images de captcha. - Nouvelles images de captcha.
- Option de configuration, captcha demandé à la connexion. - Option de configuration, captcha demandé à la connexion.
- Module User : importation d'un liste d'utilisateur dans un fichier plat (CSV).
## version 10.3.01 ## version 10.3.01
- Corrections : - Corrections :

View File

@ -0,0 +1,8 @@
# Bloque l'accès aux données
Order deny,allow
Deny from all
# Sauf l'accès au modèle csv
<Files template.csv>
Order Allow,Deny
Allow from all
</Files>

View File

@ -0,0 +1,2 @@
id;nom;prenom;email;groupe
jbon;Bon;Jean;jean.bon@email.fr;1
1 id nom prenom email groupe
2 jbon Bon Jean jean.bon@email.fr 1

View File

@ -17,11 +17,12 @@ class user extends common {
public static $actions = [ public static $actions = [
'add' => self::GROUP_ADMIN, 'add' => self::GROUP_ADMIN,
'delete' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN,
'edit' => self::GROUP_MEMBER, 'import' => self::GROUP_ADMIN,
'forgot' => self::GROUP_VISITOR,
'index' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN,
'login' => self::GROUP_VISITOR, 'edit' => self::GROUP_MEMBER,
'logout' => self::GROUP_MEMBER, 'logout' => self::GROUP_MEMBER,
'forgot' => self::GROUP_VISITOR,
'login' => self::GROUP_VISITOR,
'reset' => self::GROUP_VISITOR 'reset' => self::GROUP_VISITOR
]; ];
@ -39,6 +40,12 @@ class user extends common {
public static $userLongtime = false; public static $userLongtime = false;
public static $separators = [
';' => ';',
',' => ',',
':' => ':'
];
/** /**
* Ajout * Ajout
*/ */
@ -73,6 +80,11 @@ class user extends common {
'lastname' => $userLastname, 'lastname' => $userLastname,
'mail' => $userMail, 'mail' => $userMail,
'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true), 'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true),
"connectFail" => null,
"connectTimeout" => null,
"accessUrl" => null,
"accessTimer" => null,
"accessCsrf" => null
] ]
]); ]);
@ -85,7 +97,6 @@ class user extends common {
'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(['config', '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>' .
'<strong>Mot de passe du compte :</strong> ' . $this->getInput('userAddPassword') . '<br><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
); );
@ -355,8 +366,9 @@ class user extends common {
if($this->isPost()) { if($this->isPost()) {
// Check la captcha // Check la captcha
if( if(
$this->getData(['config','connect','captcha'])
//$this->getInput('userLoginCaptcha', helper::FILTER_INT) !== $this->getInput('userLoginCaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('userLoginCaptchaSecondNumber', helper::FILTER_INT)) //$this->getInput('userLoginCaptcha', helper::FILTER_INT) !== $this->getInput('userLoginCaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('userLoginCaptchaSecondNumber', helper::FILTER_INT))
password_verify($this->getInput('userLoginCaptcha', helper::FILTER_INT), $this->getInput('userLoginCaptchaResult') ) === false ) AND password_verify($this->getInput('userLoginCaptcha', helper::FILTER_INT), $this->getInput('userLoginCaptchaResult') ) === false )
{ {
self::$inputNotices['userLoginCaptcha'] = 'Incorrect'; self::$inputNotices['userLoginCaptcha'] = 'Incorrect';
} }
@ -434,7 +446,7 @@ class user extends common {
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => 'Connexion réussie', 'notification' => 'Connexion réussie',
'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))), 'redirect' => helper::baseUrl(),
'state' => true 'state' => true
]); ]);
} }
@ -550,9 +562,115 @@ class user extends common {
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => 'Réinitialisation du mot de passe', 'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => 'Réinitialisation de votre mot de passe',
'view' => 'reset' 'view' => 'reset'
]); ]);
} }
} }
/**
* Importation CSV d'utilisateurs
*/
public function import() {
// Soumission du formulaire
$notification = '';
$success = true;
if($this->isPost()) {
// Lecture du CSV et construction du tableau
$file = $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true);
$filePath = self::FILE_DIR . 'source/' . $file;
if ($file AND file_exists($filePath)) {
$rows = array_map(function($row) { return str_getcsv($row, $this->getInput('userImportSeparator') ); }, file($filePath));
$header = array_shift($rows);
$csv = array();
foreach($rows as $row) {
$csv[] = array_combine($header, $row);
}
// Stockage des données
foreach($csv as $item ) {
// N'insére que les utilisateurs dont l'id n'existe pas
// Vérifier la présence des champs
if( array_key_exists('id', $item)
AND array_key_exists('prenom',$item)
AND array_key_exists('nom',$item)
AND array_key_exists('groupe',$item)
AND array_key_exists('email',$item)
AND !$this->getData(['user',helper::filter($item['id'] , helper::FILTER_ID)])
)
{
// Nettoyage de l'identifiant
$userId = helper::filter($item['id'] , helper::FILTER_ID);
// Enregistre le user
$this->setData([
'user',
$userId, [
'firstname' => $item['prenom'],
'forgot' => 0,
'group' => (int) $item['groupe'],
'lastname' => $item['nom'],
'mail' => $item['email'],
'pseudo' => $item['prenom'],
'signature' => 1, // Pseudo
'password' => uniqid(), // A modifier à la première connexion
"connectFail" => null,
"connectTimeout" => null,
"accessUrl" => null,
"accessTimer" => null,
"accessCsrf" => null
]]);
// Icône de notification
$item['notification'] = template::ico('check');
// Envoi du mail
if ($this->getInput('userImportNotification',helper::FILTER_BOOLEAN) === true) {
$sent = $this->sendMail(
$item['email'],
'Compte créé sur ' . $this->getData(['config', 'title']),
'Bonjour <strong>' . $item['prenom'] . ' ' . $item['nom'] . '</strong>,<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>' .
'<small>Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.</small>'
);
if ($sent === true) {
// Mail envoyé changement de l'icône
$item['notification'] = template::ico('comment') ;
}
}
} else {
$item['notification'] = template::ico('cancel');
}
// Création du tableau de confirmation
self::$users[] = [
$userId,
$item['nom'],
$item['prenom'],
self::$groups[$item['groupe']],
$item['prenom'],
$item['email'],
$item['notification']
];
}
if (empty(self::$users)) {
$notification = 'Rien à importer' ;
$success = false;
} else {
$notification = 'Importation effectuée' ;
$success = true;
}
} else {
$notification = 'Erreur de lecture, vérifiez les permissions';
$success = false;
}
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Importation',
'view' => 'import',
'notification' => $notification,
'state' => $success
]);
}
} }

View File

@ -5,7 +5,6 @@
<div class="row"> <div class="row">
<div class="col3 offset6"> <div class="col3 offset6">
<?php echo template::button('userForgotBack', [ <?php echo template::button('userForgotBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user/login/' . $this->getUrl(2), 'href' => helper::baseUrl() . 'user/login/' . $this->getUrl(2),
'ico' => 'left', 'ico' => 'left',
'value' => 'Retour' 'value' => 'Retour'

16
core/module/user/view/import/import.css vendored Normal file
View File

@ -0,0 +1,16 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
@import url("site/data/admin.css");

View File

@ -0,0 +1,62 @@
<?php echo template::formOpen('userImportForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('userImportBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('userImportSubmit', [
'value' => 'Importer'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Importation de fichier plat CSV</h4>
<div class="row">
<div class="col6">
<?php echo template::file('userImportCSVFile', [
'label' => 'Liste d\'utilisateurs :'
]); ?>
</div>
<div class="col2">
<?php echo template::select('userImportSeparator', $module::$separators, [
'label' => 'Séparateur'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::checkbox('userImportNotification', true, 'Envoyer un message de confirmation', [
'checked' => false
]); ?>
</div>
</div>
<div class="row">
<div class="col1">
<p>Aide :</p>
</div>
<div class="col11">
<p>Les en-têtes obligatoires sont : id, nom, prenom, email et groupe
( 1 : membre - 2 : éditeur - 3 : administrateur )
<p>Voir ce <a href="core/module/user/ressource/template.csv">modèle</a> à compléter avec un tableur.
Enregistrement au format CSV, séparateur ; ou , ou :</p>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>
<?php if ($module::$users): ?>
<?php echo template::table([1, 3, 3, 1, 1, 2, 1, 1 ], $module::$users, ['Identifiant', 'Nom', 'Prénom','Groupe', 'Pseudo', 'eMail', 'Succès']); ?>
<div class="row">
<div class="col12 textAlignCenter">
<?php echo template::ico('check');?> Compte créé | <?php echo template::ico('comment');?> Compte créé et notifié | <?php echo template::ico('cancel');?> Erreur
</div>
</div>
<?php endif;?>

View File

@ -7,7 +7,14 @@
'value' => 'Accueil' 'value' => 'Accueil'
]); ?> ]); ?>
</div> </div>
<div class="col2 offset8"> <div class="col2 offset6">
<?php echo template::button('userImport', [
'href' => helper::baseUrl() . 'user/import',
'ico' => 'plus',
'value' => 'Importation'
]); ?>
</div>
<div class="col2">
<?php echo template::button('userAdd', [ <?php echo template::button('userAdd', [
'href' => helper::baseUrl() . 'user/add', 'href' => helper::baseUrl() . 'user/add',
'ico' => 'plus', 'ico' => 'plus',

View File

@ -119,7 +119,7 @@ $config = array(
| If you want to be forced to assign the extension starting from the mime type | If you want to be forced to assign the extension starting from the mime type
| |
*/ */
'mime_extension_rename' => true, 'mime_extension_rename' => false,
/* /*

View File

@ -1,5 +1,5 @@
<article> <article>
<div class="row"> <div class="row">
<div class="col10"> <div class="col10">
<div class="blogDate"> <div class="blogDate">
<i class="far fa-calendar-alt"></i> <i class="far fa-calendar-alt"></i>