From a5327a959cf82c8b4ddefa3cb056166e492d9ef9 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 4 Oct 2020 17:12:33 +0200 Subject: [PATCH 01/20] bouton gris --- module/blog/view/article/article.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php index 620e2129..b8435286 100644 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -85,6 +85,7 @@
'buttonGrey', 'value' => 'Annuler' ]); ?>
From 3d140e1a360536c7ee049b945c42361e2b3e303d Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 4 Oct 2020 17:14:15 +0200 Subject: [PATCH 02/20] Init --- core/module/user/user.php | 19 ++++++++++++++++--- core/module/user/view/forgot/forgot.php | 1 - core/module/user/view/import/import.css | 16 ++++++++++++++++ core/module/user/view/import/import.php | 12 ++++++++++++ core/module/user/view/index/index.php | 8 +++++++- 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 core/module/user/view/import/import.css create mode 100644 core/module/user/view/import/import.php diff --git a/core/module/user/user.php b/core/module/user/user.php index f26a61e9..8e876b1a 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -17,11 +17,12 @@ class user extends common { public static $actions = [ 'add' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, - 'edit' => self::GROUP_MEMBER, - 'forgot' => self::GROUP_VISITOR, + 'import' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, - 'login' => self::GROUP_VISITOR, + 'edit' => self::GROUP_MEMBER, 'logout' => self::GROUP_MEMBER, + 'forgot' => self::GROUP_VISITOR, + 'login' => self::GROUP_VISITOR, 'reset' => self::GROUP_VISITOR ]; @@ -536,4 +537,16 @@ class user extends common { ]); } } + + /** + * Importation CSV d'utilisateurs + */ + public function import() { + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Importation d\'utilisateurs', + 'view' => 'import' + ]); + + } } \ No newline at end of file diff --git a/core/module/user/view/forgot/forgot.php b/core/module/user/view/forgot/forgot.php index 76931e3e..29dc17e8 100644 --- a/core/module/user/view/forgot/forgot.php +++ b/core/module/user/view/forgot/forgot.php @@ -5,7 +5,6 @@
'buttonGrey', 'href' => helper::baseUrl() . 'user/login/' . $this->getUrl(2), 'ico' => 'left', 'value' => 'Retour' diff --git a/core/module/user/view/import/import.css b/core/module/user/view/import/import.css new file mode 100644 index 00000000..2aa6edae --- /dev/null +++ b/core/module/user/view/import/import.css @@ -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 + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @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"); \ No newline at end of file diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php new file mode 100644 index 00000000..a26375b8 --- /dev/null +++ b/core/module/user/view/import/import.php @@ -0,0 +1,12 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'user', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ \ No newline at end of file diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 351e095d..3c39ac74 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -7,7 +7,13 @@ 'value' => 'Accueil' ]); ?>
-
+
+ helper::baseUrl() . 'user/import', + 'value' => 'Importation CSV' + ]); ?> +
+
helper::baseUrl() . 'user/add', 'ico' => 'plus', From 7aad2deb53aaaf8ebbce6c551ad82a828d15c653 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 4 Oct 2020 18:34:34 +0200 Subject: [PATCH 03/20] module ok reste les tests et les notifications --- core/module/user/user.php | 36 +++++++++++++++++++++-- core/module/user/view/import/import.php | 37 +++++++++++++++++++----- site/export.csv | 4 +++ site/tmp/5f79e3644fdca.png | Bin 0 -> 15697 bytes site/tmp/5f79e3644fdd8.png | Bin 0 -> 12925 bytes site/tmp/5f79e380687eb.png | Bin 0 -> 15697 bytes site/tmp/5f79e380687ee.png | Bin 0 -> 11138 bytes 7 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 site/export.csv create mode 100644 site/tmp/5f79e3644fdca.png create mode 100644 site/tmp/5f79e3644fdd8.png create mode 100644 site/tmp/5f79e380687eb.png create mode 100644 site/tmp/5f79e380687ee.png diff --git a/core/module/user/user.php b/core/module/user/user.php index 8e876b1a..15143fc6 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -19,6 +19,7 @@ class user extends common { 'delete' => self::GROUP_ADMIN, 'import' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, + 'csvstring_to_array' => self::GROUP_ADMIN, 'edit' => self::GROUP_MEMBER, 'logout' => self::GROUP_MEMBER, 'forgot' => self::GROUP_VISITOR, @@ -542,11 +543,42 @@ class user extends common { * Importation CSV d'utilisateurs */ public function import() { + // Soumission du formulaire + if($this->isPost()) { + // Lecture du CSV et construction du tableau + $file = helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true); + $rows = array_map(function($row) { return str_getcsv($row, ';'); }, file($file)); + $header = array_shift($rows); + $csv = array(); + foreach($rows as $row) { + $csv[] = array_combine($header, $row); + } + // Stockage des données + foreach($csv as $item ) { + $userId = $item['id']; + if($this->getData(['user', $userId])) { + self::$inputNotices['userAddId'] = 'Identifiant déjà utilisé'; + $check=false; + } + $this->setData([ + 'user', + $userId, + [ + 'firstname' => $item['prenom'], + 'forgot' => 0, + 'group' => $item['groupe'], + 'lastname' => $item['nom'], + 'mail' => $item['email'], + 'password' => uniqid() + ] + ]); + } + } // Valeurs en sortie $this->addOutput([ - 'title' => 'Importation d\'utilisateurs', + 'title' => 'Importation', 'view' => 'import' ]); - } + } \ No newline at end of file diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index a26375b8..5a44029b 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -1,12 +1,33 @@
-
- 'buttonGrey', - 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'user', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+
+
+
+
+
+

Importation de fichier plat CSV

+
+
+ bla bla expliquant le format d'import à respecter +
+
+ 'Liste d\'utilisateurs :' + ]); ?> +
+ +
+
+
+
\ No newline at end of file diff --git a/site/export.csv b/site/export.csv new file mode 100644 index 00000000..b841b3ee --- /dev/null +++ b/site/export.csv @@ -0,0 +1,4 @@ +1;"Haddock";"Archibald";"Muséum d'histoire naturelle";"Décoratrice";"Rue de l'Ecole-de-Médecine ";1205;"Genève";111;"ah@free.fr"; +2;"Castafiore";"Bianca";"Musée de Saint-Imier";"Conservatrice";"Heideweg 45 ";2503;"Biel/Bienne";222;"bc@free.fr"; +3;"Lampion";"Séraphin";"Musée Charles Clos Olsommer";"Conservatrice et commissaire d'exposition";"Zudannazstrasse 4 ";3970;"Salgesch";333;"sl@laposte.net"; +4;"Tournesol";"Trypho";"Fondation de l'Hermitage";"Chargée de projets d'exposition";2;" route du Signal CP 42";1000;"Lausanne 8 Bellevaux";444;"tt@ac-toulouse.fr" diff --git a/site/tmp/5f79e3644fdca.png b/site/tmp/5f79e3644fdca.png new file mode 100644 index 0000000000000000000000000000000000000000..53af242fa986ee69d7c4c659b01b900cf559a175 GIT binary patch literal 15697 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 DmV+Q5 literal 0 HcmV?d00001 diff --git a/site/tmp/5f79e3644fdd8.png b/site/tmp/5f79e3644fdd8.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4a06c01318287ac3da77a2038c04cf49b8ad43 GIT binary patch literal 12925 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 literal 0 HcmV?d00001 diff --git a/site/tmp/5f79e380687eb.png b/site/tmp/5f79e380687eb.png new file mode 100644 index 0000000000000000000000000000000000000000..53af242fa986ee69d7c4c659b01b900cf559a175 GIT binary patch literal 15697 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 DmV+Q5 literal 0 HcmV?d00001 diff --git a/site/tmp/5f79e380687ee.png b/site/tmp/5f79e380687ee.png new file mode 100644 index 0000000000000000000000000000000000000000..a8162d3fa96f2cf244f4ada8e9b117b1c6f0c078 GIT binary patch literal 11138 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 UD1}NB;{X5v07*qoM6N<$f>Bx!xBvhE literal 0 HcmV?d00001 From db6e2c3a971ba3b221e9ca12c2eb108e33944afc Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 5 Oct 2020 09:49:06 +0200 Subject: [PATCH 04/20] tag article --- module/blog/view/article/article.php | 216 ++++++++++++++------------- 1 file changed, 109 insertions(+), 107 deletions(-) diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php index b8435286..5b573ebc 100644 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -1,120 +1,122 @@ -
-
-
- - getData(['module', $this->getUrl(0), $this->getUrl(1), 'publishedOn'])); ?> - à getData(['module', $this->getUrl(0), $this->getUrl(1), 'publishedOn'])); ?> +
+
+
+
+ + getData(['module', $this->getUrl(0), $this->getUrl(1), 'publishedOn'])); ?> + à getData(['module', $this->getUrl(0), $this->getUrl(1), 'publishedOn'])); ?> +
+ getUser('group') >= self::GROUP_ADMIN + AND $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + ): ?> +
+ helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1) . '/' . $_SESSION['csrf'], + 'value' => 'Editer' + ]); ?> +
+
- getUser('group') >= self::GROUP_ADMIN - AND $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') - ): ?> -
- helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1) . '/' . $_SESSION['csrf'], - 'value' => 'Editer' - ]); ?> -
- -
- getData(['module', $this->getUrl(0), $this->getUrl(1), 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'pictureSize']); ?> - getData(['module', $this->getUrl(0), $this->getUrl(1), 'hidePicture']) == false) { - echo '' . $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'picture']) . ''; - } ?> + getData(['module', $this->getUrl(0), $this->getUrl(1), 'pictureSize']) === null ? '100' : $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'pictureSize']); ?> + getData(['module', $this->getUrl(0), $this->getUrl(1), 'hidePicture']) == false) { + echo '' . $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'picture']) . ''; + } ?> -getData(['module', $this->getUrl(0), $this->getUrl(1), 'content']); ?> -

- getData(['user', $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'userId']), 'firstname']); ?> - getData(['user', $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'userId']), 'lastname']); ?> -

-getData(['module', $this->getUrl(0), $this->getUrl(1), 'closeComment'])): ?> -

Cet article ne reçoit pas de commentaire.

- -

- getData(['module', $this->getUrl(0), $this->getUrl(1), 'comment'])); ?> - - 0 ? $commentsNb . ' ' . 'commentaire' . $s : 'Pas encore de commentaire'; ?> -

- - 'Rédiger un commentaire...', - 'readonly' => true - ]); ?> -
- getUser('password') === $this->getInput('ZWII_USER_PASSWORD')): ?> - 'Nom', - 'readonly' => true, - 'value' => $this->getUser('firstname') . ' ' . $this->getUser('lastname') + getData(['module', $this->getUrl(0), $this->getUrl(1), 'content']); ?> +

+ getData(['user', $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'userId']), 'firstname']); ?> + getData(['user', $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'userId']), 'lastname']); ?> +

+ getData(['module', $this->getUrl(0), $this->getUrl(1), 'closeComment'])): ?> +

Cet article ne reçoit pas de commentaire.

+ +

+ getData(['module', $this->getUrl(0), $this->getUrl(1), 'comment'])); ?> + + 0 ? $commentsNb . ' ' . 'commentaire' . $s : 'Pas encore de commentaire'; ?> +

+ + 'Rédiger un commentaire...', + 'readonly' => true + ]); ?> +
+ getUser('password') === $this->getInput('ZWII_USER_PASSWORD')): ?> + 'Nom', + 'readonly' => true, + 'value' => $this->getUser('firstname') . ' ' . $this->getUser('lastname') + ]); ?> + $this->getUser('id') + ]); ?> + +
+
+ 'Nom' + ]); ?> +
+
+
Ou
+
+
+ helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()) . '__comment', + 'value' => 'Connexion' + ]); ?> +
+
+ + 'Commentaire', + 'maxlength' => '500' ]); ?> - $this->getUser('id') - ]); ?> - + getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?> +
+
+ +
+
+
-
- 'Nom' +
+ 'buttonGrey', + 'value' => 'Annuler' ]); ?>
-
-
Ou
-
-
- helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()) . '__comment', - 'value' => 'Connexion' +
+ 'Envoyer', + 'ico' => '' ]); ?>
- - 'Commentaire', - 'maxlength' => '500' - ]); ?> - getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?> -
-
- -
-
- -
-
- 'buttonGrey', - 'value' => 'Annuler' - ]); ?> -
-
- 'Envoyer', - 'ico' => '' - ]); ?> -
-
- - + + -
-
- $comment): ?> -
-

- - getData(['user', $comment['userId'], 'firstname']) . ' ' . $this->getData(['user', $comment['userId'], 'lastname']); ?> - - - - le -

- -
- +
+
+ $comment): ?> +
+

+ + getData(['user', $comment['userId'], 'firstname']) . ' ' . $this->getData(['user', $comment['userId'], 'lastname']); ?> + + + + le +

+ +
+ +
-
- + + \ No newline at end of file From 03568f66411d7abb476b92f82c7f008b5d531ed0 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Mon, 5 Oct 2020 16:56:30 +0200 Subject: [PATCH 05/20] verif et tableau de confirmation --- core/module/user/ressource/.htaccess | 8 +++ core/module/user/ressource/template.csv | 2 + core/module/user/user.php | 91 ++++++++++++++++++------- core/module/user/view/import/import.php | 21 ++++-- site/export.csv | 4 -- 5 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 core/module/user/ressource/.htaccess create mode 100644 core/module/user/ressource/template.csv delete mode 100644 site/export.csv diff --git a/core/module/user/ressource/.htaccess b/core/module/user/ressource/.htaccess new file mode 100644 index 00000000..e8a0ad3a --- /dev/null +++ b/core/module/user/ressource/.htaccess @@ -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 + +Order Allow,Deny + Allow from all + \ No newline at end of file diff --git a/core/module/user/ressource/template.csv b/core/module/user/ressource/template.csv new file mode 100644 index 00000000..ff495590 --- /dev/null +++ b/core/module/user/ressource/template.csv @@ -0,0 +1,2 @@ +id;nom;prenom;email;groupe +jbon;Bon;Jean;jean.bon@email.fr;1 diff --git a/core/module/user/user.php b/core/module/user/user.php index 15143fc6..f6483a80 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -33,6 +33,12 @@ class user extends common { public static $userLongtime = false; + public static $separators = [ + ';' => ';', + ',' => ',', + ':' => ':' + ]; + /** * Ajout */ @@ -543,41 +549,74 @@ class user extends common { * Importation CSV d'utilisateurs */ public function import() { + $notification = ''; + $success = true; // Soumission du formulaire if($this->isPost()) { // Lecture du CSV et construction du tableau - $file = helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true); - $rows = array_map(function($row) { return str_getcsv($row, ';'); }, file($file)); - $header = array_shift($rows); - $csv = array(); - foreach($rows as $row) { - $csv[] = array_combine($header, $row); - } - // Stockage des données - foreach($csv as $item ) { - $userId = $item['id']; - if($this->getData(['user', $userId])) { - self::$inputNotices['userAddId'] = 'Identifiant déjà utilisé'; - $check=false; + $file = $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true); + $filePath = helper::baseUrl(false) . self::FILE_DIR . 'source/' . $file; + if (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); } - $this->setData([ - 'user', - $userId, - [ - 'firstname' => $item['prenom'], - 'forgot' => 0, - 'group' => $item['groupe'], - 'lastname' => $item['nom'], - 'mail' => $item['email'], - 'password' => uniqid() - ] - ]); + // Stockage des données + foreach($csv as $item ) { + // Nettoyage de l'identifiant + $userId = helper::filter($item['id'] , self::FILTER_ID); + // N'insére que les utilisateurs dont l'id n'existe pas + if( !$this->getData(['user', $userId]) ) { + // Vérifier la présence des champs + if ( $item['prenom'] + AND $item['nom'] + AND $item['groupe'] + AND $item['email'] + AND $userId ) + { + // Enregistre le user + $this->setData([ + 'user', + $userId, [ + 'firstname' => $item['prenom'], + 'forgot' => 0, + 'group' => $item['groupe'], + 'lastname' => $item['nom'], + 'mail' => $item['email'], + 'pseudo' => $item['prenom'], + 'signature' => 1, // Pseudo + 'password' => uniqid() // A modifier à la première connexion + ]]); + + // Création du tableau de confirmation + self::$users[] = [ + $userId, + $item['nom'], + $item['prenom'], + self::$groups[$item['groupe']], + $item['prenom'], + $item['email'] + ]; + $notification = 'Import efectué'; + $success = true; + } else { + $success = 3; + } + } + } + } else { + $notification = 'Erreur de lecture : ' . $file; + $success = false; } } // Valeurs en sortie $this->addOutput([ 'title' => 'Importation', - 'view' => 'import' + 'view' => 'import', + 'notification' => $notification, + 'state' => $success ]); } diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 5a44029b..2b9bd631 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -17,17 +17,26 @@

Importation de fichier plat CSV

-
- bla bla expliquant le format d'import à respecter -
-
+
'Liste d\'utilisateurs :' ]); ?>
- +
+ 'Séparateur' + ]); ?> +
+
+

Les en-têtes obligatoires sont id, nom, prenom, email et groupe.

+

Valeurs de groupe : 1 membre - 2 éditeur - 3 administrateur

+

Modèle à ouvrir avec un tableur.

+
- \ No newline at end of file + + + + \ No newline at end of file diff --git a/site/export.csv b/site/export.csv deleted file mode 100644 index b841b3ee..00000000 --- a/site/export.csv +++ /dev/null @@ -1,4 +0,0 @@ -1;"Haddock";"Archibald";"Muséum d'histoire naturelle";"Décoratrice";"Rue de l'Ecole-de-Médecine ";1205;"Genève";111;"ah@free.fr"; -2;"Castafiore";"Bianca";"Musée de Saint-Imier";"Conservatrice";"Heideweg 45 ";2503;"Biel/Bienne";222;"bc@free.fr"; -3;"Lampion";"Séraphin";"Musée Charles Clos Olsommer";"Conservatrice et commissaire d'exposition";"Zudannazstrasse 4 ";3970;"Salgesch";333;"sl@laposte.net"; -4;"Tournesol";"Trypho";"Fondation de l'Hermitage";"Chargée de projets d'exposition";2;" route du Signal CP 42";1000;"Lausanne 8 Bellevaux";444;"tt@ac-toulouse.fr" From 5291f058a7e47f3a0ba9081193fe1eda71a3099b Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Tue, 6 Oct 2020 08:29:14 +0200 Subject: [PATCH 06/20] =?UTF-8?q?Import=20focntionnel=20avec=20v=C3=A9rifi?= =?UTF-8?q?cation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/user/user.php | 75 ++++++++++++------------- core/module/user/view/import/import.php | 2 +- 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index f6483a80..71d9ea57 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -555,7 +555,7 @@ class user extends common { if($this->isPost()) { // Lecture du CSV et construction du tableau $file = $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true); - $filePath = helper::baseUrl(false) . self::FILE_DIR . 'source/' . $file; + $filePath = self::FILE_DIR . 'source/' . $file; if (file_exists ($filePath)) { $rows = array_map(function($row) { return str_getcsv($row, $this->getInput('userImportSeparator') ); }, file($filePath)); $header = array_shift($rows); @@ -566,45 +566,44 @@ class user extends common { // Stockage des données foreach($csv as $item ) { // Nettoyage de l'identifiant - $userId = helper::filter($item['id'] , self::FILTER_ID); + $userId = helper::filter($item['id'] , helper::FILTER_ID); // N'insére que les utilisateurs dont l'id n'existe pas - if( !$this->getData(['user', $userId]) ) { - // Vérifier la présence des champs - if ( $item['prenom'] - AND $item['nom'] - AND $item['groupe'] - AND $item['email'] - AND $userId ) - { - // Enregistre le user - $this->setData([ - 'user', - $userId, [ - 'firstname' => $item['prenom'], - 'forgot' => 0, - 'group' => $item['groupe'], - 'lastname' => $item['nom'], - 'mail' => $item['email'], - 'pseudo' => $item['prenom'], - 'signature' => 1, // Pseudo - 'password' => uniqid() // A modifier à la première connexion - ]]); - - // Création du tableau de confirmation - self::$users[] = [ - $userId, - $item['nom'], - $item['prenom'], - self::$groups[$item['groupe']], - $item['prenom'], - $item['email'] - ]; - $notification = 'Import efectué'; - $success = true; - } else { - $success = 3; - } + // Vérifier la présence des champs + if( !$this->getData(['user', $userId]) + AND $item['prenom'] + AND $item['nom'] + AND $item['groupe'] + AND $item['email'] + AND $userId ) + { + // Enregistre le user + $this->setData([ + 'user', + $userId, [ + 'firstname' => $item['prenom'], + 'forgot' => 0, + 'group' => $item['groupe'], + 'lastname' => $item['nom'], + 'mail' => $item['email'], + 'pseudo' => $item['prenom'], + 'signature' => 1, // Pseudo + 'password' => uniqid() // A modifier à la première connexion + ]]); + $item['notification'] = 'Ok'; + } else { + $item['notification'] = 'Pb'; } + + // Création du tableau de confirmation + self::$users[] = [ + $userId, + $item['nom'], + $item['prenom'], + self::$groups[$item['groupe']], + $item['prenom'], + $item['email'], + $item['notification'] + ]; } } else { $notification = 'Erreur de lecture : ' . $file; diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 2b9bd631..7c00af95 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -38,5 +38,5 @@
- + \ No newline at end of file From afeb66fd7de34dbe204b0f65a6c3e70bfcffd517 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Tue, 6 Oct 2020 09:57:32 +0200 Subject: [PATCH 07/20] =?UTF-8?q?d=C3=A9sactiver=20mime=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/vendor/filemanager/config/config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/filemanager/config/config.php b/core/vendor/filemanager/config/config.php index 29537313..73e03b8b 100644 --- a/core/vendor/filemanager/config/config.php +++ b/core/vendor/filemanager/config/config.php @@ -119,7 +119,7 @@ $config = array( | If you want to be forced to assign the extension starting from the mime type | */ - 'mime_extension_rename' => true, + 'mime_extension_rename' => false, /* From 97c820c7d61a86a9e72b6ccc5e6ceb5c2a45c041 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Tue, 6 Oct 2020 10:24:56 +0200 Subject: [PATCH 08/20] aide --- core/module/user/view/import/import.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 7c00af95..102d5581 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -27,10 +27,11 @@ 'label' => 'Séparateur' ]); ?>
-
-

Les en-têtes obligatoires sont id, nom, prenom, email et groupe.

-

Valeurs de groupe : 1 membre - 2 éditeur - 3 administrateur

-

Modèle à ouvrir avec un tableur.

+
+
Contenu du fichier d'import :
+

Les en-têtes obligatoires sont : id, nom, prenom, email et groupe.

+

Groupes 1 : membre - 2 : éditeur - 3 : administrateur

+

Voir ce modèle à renseigner avec un tableur.

From 29a41a8d9987c3fbf9f58ae4caf30b4256b18ed5 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Tue, 6 Oct 2020 15:25:12 +0200 Subject: [PATCH 09/20] =?UTF-8?q?am=C3=A9lioration=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/user/user.php | 10 +++++----- core/module/user/view/import/import.php | 10 ++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 71d9ea57..cd8e4b22 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -549,8 +549,6 @@ class user extends common { * Importation CSV d'utilisateurs */ public function import() { - $notification = ''; - $success = true; // Soumission du formulaire if($this->isPost()) { // Lecture du CSV et construction du tableau @@ -589,9 +587,9 @@ class user extends common { 'signature' => 1, // Pseudo 'password' => uniqid() // A modifier à la première connexion ]]); - $item['notification'] = 'Ok'; + $item['notification'] = template::ico('check'); } else { - $item['notification'] = 'Pb'; + $item['notification'] = template::ico('cancel'); } // Création du tableau de confirmation @@ -605,8 +603,10 @@ class user extends common { $item['notification'] ]; } + $notification = 'importation effectuée' ; + $success = true; } else { - $notification = 'Erreur de lecture : ' . $file; + $notification = 'Erreur de lecture, vérifiez les permissions'; $success = false; } } diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 102d5581..e080a004 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -9,7 +9,9 @@ ]); ?>
- + 'Importer' + ]); ?>
@@ -28,10 +30,10 @@ ]); ?>
-
Contenu du fichier d'import :

Les en-têtes obligatoires sont : id, nom, prenom, email et groupe.

Groupes 1 : membre - 2 : éditeur - 3 : administrateur

-

Voir ce modèle à renseigner avec un tableur.

+

Voir ce modèle à compléter avec un tableur.

+

Enregistrement au format CSV, séparateur ; ou , ou :

@@ -39,5 +41,5 @@
- + \ No newline at end of file From 61fb84d59485e5aa399dc56ba281e51eb2028e27 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Tue, 6 Oct 2020 15:55:17 +0200 Subject: [PATCH 10/20] =?UTF-8?q?libell=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/user/view/index/index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 3c39ac74..483ad22c 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -10,7 +10,8 @@
helper::baseUrl() . 'user/import', - 'value' => 'Importation CSV' + 'ico' => 'plus', + 'value' => 'Importation' ]); ?>
From 2f97898e6ec8bc2b0fc00460a67c863d03bf0565 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Tue, 6 Oct 2020 15:56:49 +0200 Subject: [PATCH 11/20] =?UTF-8?q?d=C3=A9claration=20notification=20et=20su?= =?UTF-8?q?ccess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/user/user.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/module/user/user.php b/core/module/user/user.php index cd8e4b22..047dd7a3 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -550,6 +550,8 @@ class user extends common { */ 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); From ef6928547b82f86afbb6f05da37490995be41087 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 6 Oct 2020 18:28:21 +0200 Subject: [PATCH 12/20] Bug connexion dans captcha --- core/module/user/user.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index f26a61e9..279c23ba 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -336,8 +336,9 @@ class user extends common { if($this->isPost()) { // Check la captcha if( + $this->getData(['config','connect','captcha']) //$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'; } From fe2425bf5db4ad5ff431db0d9954e16fa48827d0 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 7 Oct 2020 18:53:40 +0200 Subject: [PATCH 13/20] bug changement de mot de passe --- CHANGES.md | 4 +++- core/module/user/user.php | 28 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1097e39b..92dbb691 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,13 @@ # Changelog ## version 10.3.02 -- Correction : +- Corrections : - Icône de pied de page github manquante. + - Mauvaise redirection après changement de mot de passe d'un membre. - Modifications : - Nouvelles images de captcha. - Option de configuration, captcha demandé à la connexion. + - Module User : importation d'un liste d'utilisateur dans un fichier plat (CSV). ## version 10.3.01 - Corrections : diff --git a/core/module/user/user.php b/core/module/user/user.php index 090dbb8e..80521627 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -19,7 +19,6 @@ class user extends common { 'delete' => self::GROUP_ADMIN, 'import' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, - 'csvstring_to_array' => self::GROUP_ADMIN, 'edit' => self::GROUP_MEMBER, 'logout' => self::GROUP_MEMBER, 'forgot' => self::GROUP_VISITOR, @@ -61,7 +60,7 @@ class user extends common { $userFirstname = $this->getInput('userAddFirstname', helper::FILTER_STRING_SHORT, true); $userLastname = $this->getInput('userAddLastname', helper::FILTER_STRING_SHORT, true); $userMail = $this->getInput('userAddMail', helper::FILTER_MAIL, true); - + // Stockage des données $this->setData([ 'user', @@ -424,7 +423,8 @@ class user extends common { // Valeurs en sortie $this->addOutput([ 'notification' => 'Connexion réussie', - 'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))), + //'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))), + 'redirect' => helper::baseUrl(), 'state' => true ]); } @@ -540,7 +540,8 @@ class user extends common { } // Valeurs en sortie $this->addOutput([ - 'title' => 'Réinitialisation du mot de passe', + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => 'Réinitialisation de votre mot de passe', 'view' => 'reset' ]); } @@ -568,14 +569,14 @@ class user extends common { foreach($csv as $item ) { // Nettoyage de l'identifiant $userId = helper::filter($item['id'] , helper::FILTER_ID); - // N'insére que les utilisateurs dont l'id n'existe pas + // N'insére que les utilisateurs dont l'id n'existe pas // Vérifier la présence des champs - if( !$this->getData(['user', $userId]) + if( !$this->getData(['user', $userId]) AND $item['prenom'] AND $item['nom'] AND $item['groupe'] - AND $item['email'] - AND $userId ) + AND $item['email'] + AND $userId ) { // Enregistre le user $this->setData([ @@ -583,14 +584,19 @@ class user extends common { $userId, [ 'firstname' => $item['prenom'], 'forgot' => 0, - 'group' => $item['groupe'], + 'group' => (int) $item['groupe'], 'lastname' => $item['nom'], 'mail' => $item['email'], 'pseudo' => $item['prenom'], 'signature' => 1, // Pseudo - 'password' => uniqid() // A modifier à la première connexion + 'password' => uniqid(), // A modifier à la première connexion + "connectFail" => null, + "connectTimeout" => null, + "accessUrl" => null, + "accessTimer" => null, + "accessCsrf" => null ]]); - $item['notification'] = template::ico('check'); + $item['notification'] = template::ico('check'); } else { $item['notification'] = template::ico('cancel'); } From 5a151c577c55b175159aaa6df8a69023a3b0ebda Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 7 Oct 2020 19:01:57 +0200 Subject: [PATCH 14/20] bug changement de mot de passe --- core/module/user/user.php | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 090dbb8e..80521627 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -19,7 +19,6 @@ class user extends common { 'delete' => self::GROUP_ADMIN, 'import' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, - 'csvstring_to_array' => self::GROUP_ADMIN, 'edit' => self::GROUP_MEMBER, 'logout' => self::GROUP_MEMBER, 'forgot' => self::GROUP_VISITOR, @@ -61,7 +60,7 @@ class user extends common { $userFirstname = $this->getInput('userAddFirstname', helper::FILTER_STRING_SHORT, true); $userLastname = $this->getInput('userAddLastname', helper::FILTER_STRING_SHORT, true); $userMail = $this->getInput('userAddMail', helper::FILTER_MAIL, true); - + // Stockage des données $this->setData([ 'user', @@ -424,7 +423,8 @@ class user extends common { // Valeurs en sortie $this->addOutput([ 'notification' => 'Connexion réussie', - 'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))), + //'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))), + 'redirect' => helper::baseUrl(), 'state' => true ]); } @@ -540,7 +540,8 @@ class user extends common { } // Valeurs en sortie $this->addOutput([ - 'title' => 'Réinitialisation du mot de passe', + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => 'Réinitialisation de votre mot de passe', 'view' => 'reset' ]); } @@ -568,14 +569,14 @@ class user extends common { foreach($csv as $item ) { // Nettoyage de l'identifiant $userId = helper::filter($item['id'] , helper::FILTER_ID); - // N'insére que les utilisateurs dont l'id n'existe pas + // N'insére que les utilisateurs dont l'id n'existe pas // Vérifier la présence des champs - if( !$this->getData(['user', $userId]) + if( !$this->getData(['user', $userId]) AND $item['prenom'] AND $item['nom'] AND $item['groupe'] - AND $item['email'] - AND $userId ) + AND $item['email'] + AND $userId ) { // Enregistre le user $this->setData([ @@ -583,14 +584,19 @@ class user extends common { $userId, [ 'firstname' => $item['prenom'], 'forgot' => 0, - 'group' => $item['groupe'], + 'group' => (int) $item['groupe'], 'lastname' => $item['nom'], 'mail' => $item['email'], 'pseudo' => $item['prenom'], 'signature' => 1, // Pseudo - 'password' => uniqid() // A modifier à la première connexion + 'password' => uniqid(), // A modifier à la première connexion + "connectFail" => null, + "connectTimeout" => null, + "accessUrl" => null, + "accessTimer" => null, + "accessCsrf" => null ]]); - $item['notification'] = template::ico('check'); + $item['notification'] = template::ico('check'); } else { $item['notification'] = template::ico('cancel'); } From 643a60ddd56742560d789d1f4f02e3397dfb58b8 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 7 Oct 2020 19:03:35 +0200 Subject: [PATCH 15/20] =?UTF-8?q?donn=C3=A9es=20lors=20de=20l'ajout=20du?= =?UTF-8?q?=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/user/user.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/module/user/user.php b/core/module/user/user.php index 80521627..9f56862c 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -72,6 +72,11 @@ class user extends common { 'lastname' => $userLastname, 'mail' => $userMail, 'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true), + "connectFail" => null, + "connectTimeout" => null, + "accessUrl" => null, + "accessTimer" => null, + "accessCsrf" => null ] ]); From a2b2896d80be393c850e7f1c9d6207c5e482fb31 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 7 Oct 2020 19:39:31 +0200 Subject: [PATCH 16/20] envoi email en test --- core/module/user/user.php | 12 +++++++++++- core/module/user/view/import/import.php | 26 ++++++++++++++++++------- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 9f56862c..4b0bb545 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -89,7 +89,6 @@ class user extends common { 'Bonjour ' . $userFirstname . ' ' . $userLastname . ',

' . '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') . '
' . - 'Mot de passe du compte : ' . $this->getInput('userAddPassword') . '

' . '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 ); @@ -619,6 +618,17 @@ class user extends common { } $notification = 'importation effectuée' ; $success = true; + // Envoi du mail + if ($this->getInput('userImportNotification',self::FILTER_BOOLEAN)) { + $this->sendMail( + $item['email'], + 'Compte créé sur ' . $this->getData(['config', 'title']), + 'Bonjour ' . $item['prenom'] . ' ' . $item['nom'] . ',

' . + '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é.' + ); + } } else { $notification = 'Erreur de lecture, vérifiez les permissions'; $success = false; diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index e080a004..4d1935d3 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -19,21 +19,33 @@

Importation de fichier plat CSV

-
+
'Liste d\'utilisateurs :' ]); ?>
-
+
'Séparateur' ]); ?>
-
-

Les en-têtes obligatoires sont : id, nom, prenom, email et groupe.

-

Groupes 1 : membre - 2 : éditeur - 3 : administrateur

-

Voir ce modèle à compléter avec un tableur.

-

Enregistrement au format CSV, séparateur ; ou , ou : +

+
+
+ false + ]); ?> +
+
+
+
+

Aide :

+
+
+

Les en-têtes obligatoires sont : id, nom, prenom, email et groupe + ( 1 : membre - 2 : éditeur - 3 : administrateur ) +

Voir ce modèle à compléter avec un tableur. + Enregistrement au format CSV, séparateur ; ou , ou :

From 5dfbe9a60db448d07289ac802578e50577a962f9 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Thu, 8 Oct 2020 10:33:53 +0200 Subject: [PATCH 17/20] =?UTF-8?q?modif=20alogo=20de=20check=20+=20notifica?= =?UTF-8?q?tion=20=C3=A0=20revoir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/user/user.php | 66 ++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 4b0bb545..68ece578 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -562,7 +562,7 @@ class user extends common { // Lecture du CSV et construction du tableau $file = $this->getInput('userImportCSVFile',helper::FILTER_STRING_SHORT, true); $filePath = self::FILE_DIR . 'source/' . $file; - if (file_exists ($filePath)) { + 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(); @@ -571,17 +571,18 @@ class user extends common { } // Stockage des données foreach($csv as $item ) { - // Nettoyage de l'identifiant - $userId = helper::filter($item['id'] , helper::FILTER_ID); // N'insére que les utilisateurs dont l'id n'existe pas // Vérifier la présence des champs - if( !$this->getData(['user', $userId]) - AND $item['prenom'] - AND $item['nom'] - AND $item['groupe'] - AND $item['email'] - AND $userId ) + 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', $item['id']]) + ) { + // Nettoyage de l'identifiant + $userId = helper::filter($item['id'] , helper::FILTER_ID); // Enregistre le user $this->setData([ 'user', @@ -600,35 +601,36 @@ class user extends common { "accessTimer" => null, "accessCsrf" => null ]]); - $item['notification'] = template::ico('check'); + // Création du tableau de confirmation + self::$users[] = [ + $userId, + $item['nom'], + $item['prenom'], + self::$groups[$item['groupe']], + $item['prenom'], + $item['email'], + $item['notification'] + ]; + // Envoi du mail + if ($this->getInput('userImportNotification',helper::FILTER_BOOLEAN) === true) { + $sent = $this->sendMail( + $item['email'], + 'Compte créé sur ' . $this->getData(['config', 'title']), + 'Bonjour ' . $item['prenom'] . ' ' . $item['nom'] . ',

' . + '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é.' + ); + $item['notification'] = $sent === true ? 'Mail' : template::ico('check') ; + } else { + $item['notification'] = template::ico('check'); + } } 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'] - ]; } $notification = 'importation effectuée' ; $success = true; - // Envoi du mail - if ($this->getInput('userImportNotification',self::FILTER_BOOLEAN)) { - $this->sendMail( - $item['email'], - 'Compte créé sur ' . $this->getData(['config', 'title']), - 'Bonjour ' . $item['prenom'] . ' ' . $item['nom'] . ',

' . - '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é.' - ); - } } else { $notification = 'Erreur de lecture, vérifiez les permissions'; $success = false; From 50fd8a3c9d9b8fc342352b488539f838505f4707 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Thu, 8 Oct 2020 12:49:09 +0200 Subject: [PATCH 18/20] Notifications en cours --- core/module/user/user.php | 42 +++++++++++++++---------- core/module/user/view/import/import.php | 5 +++ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 68ece578..838ca97c 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -571,6 +571,7 @@ class user extends common { } // 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) @@ -578,7 +579,7 @@ class user extends common { AND array_key_exists('nom',$item) AND array_key_exists('groupe',$item) AND array_key_exists('email',$item) - AND !$this->getData(['user', $item['id']]) + AND !$this->getData(['user',helper::filter($item['id'] , helper::FILTER_ID)]) ) { // Nettoyage de l'identifiant @@ -601,16 +602,9 @@ class user extends common { "accessTimer" => null, "accessCsrf" => null ]]); - // Création du tableau de confirmation - self::$users[] = [ - $userId, - $item['nom'], - $item['prenom'], - self::$groups[$item['groupe']], - $item['prenom'], - $item['email'], - $item['notification'] - ]; + + // Icône de notification + $item['notification'] = template::ico('check'); // Envoi du mail if ($this->getInput('userImportNotification',helper::FILTER_BOOLEAN) === true) { $sent = $this->sendMail( @@ -621,16 +615,32 @@ class user extends common { 'Identifiant du compte : ' . $userId . '
' . 'Un mot de passe provisoire vous été attribué, à la première connexion cliquez sur Mot de passe Oublié.' ); - $item['notification'] = $sent === true ? 'Mail' : template::ico('check') ; - } else { - $item['notification'] = template::ico('check'); + if ($sent === true) { + // Mail envoyé changement de l'icône + $item['notification'] = template::ico('comment') ; + } } + // Création du tableau de confirmation + self::$users[] = [ + $userId, + $item['nom'], + $item['prenom'], + self::$groups[$item['groupe']], + $item['prenom'], + $item['email'], + $item['notification'] + ]; } else { $item['notification'] = template::ico('cancel'); } } - $notification = 'importation effectuée' ; - $success = true; + 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; diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 4d1935d3..7364775b 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -54,4 +54,9 @@ +
+
+ Compte créé | Compte créé et notifié | Erreur +
+
\ No newline at end of file From 332127401fac10366681755a570875ff550d7e76 Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Thu, 8 Oct 2020 12:55:19 +0200 Subject: [PATCH 19/20] Notifications --- core/module/user/user.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 838ca97c..c05bb350 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -620,19 +620,19 @@ class user extends common { $item['notification'] = template::ico('comment') ; } } - // Création du tableau de confirmation - self::$users[] = [ - $userId, - $item['nom'], - $item['prenom'], - self::$groups[$item['groupe']], - $item['prenom'], - $item['email'], - $item['notification'] - ]; } 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' ; From d0c14aaa4991086afa09fbb73ee356be32d26b3b Mon Sep 17 00:00:00 2001 From: Prof Langues Date: Thu, 8 Oct 2020 15:21:10 +0200 Subject: [PATCH 20/20] merge 10302 --- core/module/user/user.php | 1 - 1 file changed, 1 deletion(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index c05bb350..592d76d8 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -427,7 +427,6 @@ class user extends common { // Valeurs en sortie $this->addOutput([ 'notification' => 'Connexion réussie', - //'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))), 'redirect' => helper::baseUrl(), 'state' => true ]);