forked from ZwiiCMS-Team/ZwiiCMS
Merge branch 'import_user' into blog_v3
This commit is contained in:
commit
96d2fc2e0d
@ -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 :
|
||||||
|
8
core/module/user/ressource/.htaccess
Normal file
8
core/module/user/ressource/.htaccess
Normal 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>
|
2
core/module/user/ressource/template.csv
Normal file
2
core/module/user/ressource/template.csv
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
id;nom;prenom;email;groupe
|
||||||
|
jbon;Bon;Jean;jean.bon@email.fr;1
|
|
@ -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
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
16
core/module/user/view/import/import.css
vendored
Normal 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");
|
62
core/module/user/view/import/import.php
Normal file
62
core/module/user/view/import/import.php
Normal 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;?>
|
@ -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',
|
||||||
|
2
core/vendor/filemanager/config/config.php
vendored
2
core/vendor/filemanager/config/config.php
vendored
@ -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,
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user