aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2025-12-17 13:33:07 +0100
committerpolo <ordipolo@gmx.fr>2025-12-17 13:33:07 +0100
commit8393acd0366ee3408db103ba29e8686bab127f42 (patch)
treebf6f6170caea009f9ffeb5b5827536cf893c9820
parentfc14268ad5d644680a5802eb1af4691bb9294dd5 (diff)
downloadcms-8393acd0366ee3408db103ba29e8686bab127f42.tar.gz
cms-8393acd0366ee3408db103ba29e8686bab127f42.tar.bz2
cms-8393acd0366ee3408db103ba29e8686bab127f42.zip
choix d'enregistrer ou non les messages en BDD, non par défaut dans EmailServiceHEADmain
-rw-r--r--public/css/form.css3
-rw-r--r--public/js/form.js49
-rw-r--r--src/EmailService.php4
-rw-r--r--src/controller/ContactFormController.php9
-rw-r--r--src/model/entities/NodeData.php2
-rw-r--r--src/router.php3
-rw-r--r--src/view/templates/form.php12
-rw-r--r--src/view/templates/form_admin.php7
-rw-r--r--src/view/templates/show_emails.php10
9 files changed, 79 insertions, 20 deletions
diff --git a/public/css/form.css b/public/css/form.css
index 09d4140..30673c9 100644
--- a/public/css/form.css
+++ b/public/css/form.css
@@ -2,7 +2,6 @@
2 background-color: white; 2 background-color: white;
3 margin: auto; 3 margin: auto;
4 padding: 10px; 4 padding: 10px;
5 max-width: 800px;
6 display: grid; 5 display: grid;
7 grid-template-columns: auto 1fr; 6 grid-template-columns: auto 1fr;
8 gap: 10px; 7 gap: 10px;
@@ -35,7 +34,7 @@
35.form .admin_form i{ 34.form .admin_form i{
36 font-size: smaller; 35 font-size: smaller;
37} 36}
38.form_gdpr{ 37.form_warning{
39 font-size: smaller; 38 font-size: smaller;
40} 39}
41 40
diff --git a/public/js/form.js b/public/js/form.js
index b498b40..7cee970 100644
--- a/public/js/form.js
+++ b/public/js/form.js
@@ -26,6 +26,39 @@ function setEmailParam(what_param, id){
26 }); 26 });
27} 27}
28 28
29function keepEmails(block_id){
30 const form = document.getElementById('keep_emails_' + block_id);
31 const warning = document.getElementById('form_warning_' + block_id);
32 if(!form || !warning){
33 return;
34 }
35
36 fetch('index.php?action=keep_emails', {
37 method: 'POST',
38 headers: {
39 'Content-Type': 'application/json'
40 },
41 body: JSON.stringify({
42 id: block_id,
43 checked: form.checked
44 })
45 })
46 .then(response => response.json())
47 .then(data => {
48 if(data.success){
49 form.checked = data.checked;
50 data.checked ? warning.classList.remove('hidden') : warning.classList.add('hidden');
51 toastNotify(data.checked ? "Les e-mails seront conservés. Pensez au RGPD." : "Les nouveaux e-mails ne seront pas conservés.");
52 }
53 else{
54 toastNotify("Erreur, le réglage n'a pas été enregistré par le serveur.");
55 }
56 })
57 .catch(error => {
58 console.error('Erreur:', error);
59 });
60}
61
29function checkCase(id){ 62function checkCase(id){
30 if(document.getElementById('email_address_' + id).value.match('[A-Z]')){ 63 if(document.getElementById('email_address_' + id).value.match('[A-Z]')){
31 toastNotify("Votre e-mail comporte une lettre majuscule, il s'agit probablement d'une erreur."); 64 toastNotify("Votre e-mail comporte une lettre majuscule, il s'agit probablement d'une erreur.");
@@ -136,8 +169,11 @@ function deleteEmail(id){
136 }) 169 })
137 .then(response => response.json()) 170 .then(response => response.json())
138 .then(data => { 171 .then(data => {
139 table_row.remove(); 172 if(data.success){
140 toastNotify("E-mail supprimé"); 173 table_row.remove();
174 toastNotify("E-mail supprimé");
175 }
176 else{}
141 }) 177 })
142 .catch(error => { 178 .catch(error => {
143 console.error('Erreur:', error); 179 console.error('Erreur:', error);
@@ -165,9 +201,12 @@ function toggleSensitiveEmail(id){
165 }) 201 })
166 .then(response => response.json()) 202 .then(response => response.json())
167 .then(data => { 203 .then(data => {
168 checkbox.checked = data.checked; 204 if(data.success){
169 deletion_date.innerHTML = data.deletion_date; 205 checkbox.checked = data.checked;
170 console.log(data.checked ? "Cet e-mail est maintenant considéré comme sensible." : "Cet e-mail n'est plus sensible."); 206 deletion_date.innerHTML = data.deletion_date;
207 console.log(data.checked ? "Cet e-mail est maintenant considéré comme sensible." : "Cet e-mail n'est plus sensible.");
208 }
209 else{}
171 }) 210 })
172 .catch(error => { 211 .catch(error => {
173 console.error('Erreur:', error); 212 console.error('Erreur:', error);
diff --git a/src/EmailService.php b/src/EmailService.php
index 8671817..5d1b2eb 100644
--- a/src/EmailService.php
+++ b/src/EmailService.php
@@ -11,6 +11,8 @@ use App\Entity\NodeData;
11 11
12class EmailService 12class EmailService
13{ 13{
14 const KEEP_EMAILS_DEFAULT = false;
15
14 static public function send(EntityManager $entityManager, NodeData $form_data, bool $test_email, string $name = '', string $email = '', string $message = ''): bool 16 static public function send(EntityManager $entityManager, NodeData $form_data, bool $test_email, string $name = '', string $email = '', string $message = ''): bool
15 { 17 {
16 $mail = new PHPMailer(true); // true => exceptions 18 $mail = new PHPMailer(true); // true => exceptions
@@ -64,7 +66,7 @@ class EmailService
64 $mail->send(); 66 $mail->send();
65 67
66 // copie en BDD 68 // copie en BDD
67 if(!$test_email){ 69 if(!$test_email && ($form_data->getData()['keep_emails'] ?? self::KEEP_EMAILS_DEFAULT)){
68 $db_email = new Email($name, $email, Config::$email_dest, $message); 70 $db_email = new Email($name, $email, Config::$email_dest, $message);
69 $entityManager->persist($db_email); 71 $entityManager->persist($db_email);
70 self::updateLastContactDate($entityManager, $email); 72 self::updateLastContactDate($entityManager, $email);
diff --git a/src/controller/ContactFormController.php b/src/controller/ContactFormController.php
index 01faa72..243740f 100644
--- a/src/controller/ContactFormController.php
+++ b/src/controller/ContactFormController.php
@@ -7,6 +7,15 @@ use Doctrine\ORM\EntityManager;
7 7
8class ContactFormController 8class ContactFormController
9{ 9{
10 static public function keepEmails(EntityManager $entityManager, array $json): void
11 {
12 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']);
13 $form_data->updateData('keep_emails', $json['checked'] ? true : false);
14 $entityManager->persist($form_data);
15 $entityManager->flush();
16 echo json_encode(['success' => true, 'checked' => $json['checked']]);
17 die;
18 }
10 static public function setEmailParam(EntityManager $entityManager, array $json): void 19 static public function setEmailParam(EntityManager $entityManager, array $json): void
11 { 20 {
12 $form = new FormValidation($json, 'email_params'); 21 $form = new FormValidation($json, 'email_params');
diff --git a/src/model/entities/NodeData.php b/src/model/entities/NodeData.php
index 19670fe..4c07a69 100644
--- a/src/model/entities/NodeData.php
+++ b/src/model/entities/NodeData.php
@@ -70,7 +70,7 @@ class NodeData
70 { 70 {
71 $this->data = $data; 71 $this->data = $data;
72 }*/ 72 }*/
73 public function updateData(string $key, string|array $value = ''): void 73 public function updateData(string $key, string|bool|array $value = ''): void
74 { 74 {
75 if($value !== ''){ 75 if($value !== ''){
76 $this->data[$key] = $value; 76 $this->data[$key] = $value;
diff --git a/src/router.php b/src/router.php
index d2eba18..228fae2 100644
--- a/src/router.php
+++ b/src/router.php
@@ -112,6 +112,9 @@ elseif($request->getMethod() === 'POST'){
112 } 112 }
113 113
114 /* -- bloc Formulaire -- */ 114 /* -- bloc Formulaire -- */
115 elseif($_GET['action'] === 'keep_emails'){
116 ContactFormController::keepEmails($entityManager, $json);
117 }
115 elseif($_GET['action'] === 'set_email_param'){ 118 elseif($_GET['action'] === 'set_email_param'){
116 ContactFormController::setEmailParam($entityManager, $json); 119 ContactFormController::setEmailParam($entityManager, $json);
117 } 120 }
diff --git a/src/view/templates/form.php b/src/view/templates/form.php
index df1dd0f..54dcd02 100644
--- a/src/view/templates/form.php
+++ b/src/view/templates/form.php
@@ -3,20 +3,20 @@
3 <h3><?= $title ?></h3> 3 <h3><?= $title ?></h3>
4 <?= $admin_content ?> 4 <?= $admin_content ?>
5 <div class="form_inputs"> 5 <div class="form_inputs">
6 <label for="email_name">Votre nom</label> 6 <label for="email_name_<?= $node->getNodeData()->getId() ?>">Votre nom</label>
7 <input id="email_name_<?= $node->getNodeData()->getId() ?>" type="text" name="email_name" value=""> 7 <input id="email_name_<?= $node->getNodeData()->getId() ?>" type="text" name="email_name" value="">
8 8
9 <label for="email_address">Votre e-mail</label> 9 <label for="email_address_<?= $node->getNodeData()->getId() ?>">Votre e-mail</label>
10 <input id="email_address_<?= $node->getNodeData()->getId() ?>" type="email" name="email_address" placeholder="mon-adresse@email.fr" value="" onchange="checkCase(<?= $node->getNodeData()->getId() ?>)"> 10 <input id="email_address_<?= $node->getNodeData()->getId() ?>" type="email" name="email_address" placeholder="mon-adresse@email.fr" value="" onchange="checkCase(<?= $node->getNodeData()->getId() ?>)">
11 11
12 <label for="email_message">Votre message</label> 12 <label for="email_message_<?= $node->getNodeData()->getId() ?>">Votre message</label>
13 <textarea id="email_message_<?= $node->getNodeData()->getId() ?>" type="text" name="email_message" rows="4"></textarea> 13 <textarea id="email_message_<?= $node->getNodeData()->getId() ?>" type="text" name="email_message" rows="4"></textarea>
14 14
15 <div class="full_width_column"> 15 <div class="full_width_column">
16 <label for="captcha" >Montrez que vous n'êtes pas un robot</label> 16 <label for="email_captcha_<?= $node->getNodeData()->getId() ?>" >Montrez que vous n'êtes pas un robot</label>
17 </div> 17 </div>
18 18
19 <label for="email_captcha" >Combien font <?= self::$captcha->getA() ?> fois <?= self::$captcha->getB() ?>?</label> 19 <label for="email_captcha_<?= $node->getNodeData()->getId() ?>" >Combien font <?= self::$captcha->getA() ?> fois <?= self::$captcha->getB() ?>?</label>
20 <div> 20 <div>
21 <input id="email_captcha_<?= $node->getNodeData()->getId() ?>" type="text" name="email_captcha" size="1" autocomplete="off"> 21 <input id="email_captcha_<?= $node->getNodeData()->getId() ?>" type="text" name="email_captcha" size="1" autocomplete="off">
22 </div> 22 </div>
@@ -30,7 +30,7 @@
30 30
31 <p class="send_email_success_<?= $node->getNodeData()->getId() ?> full_width_column"></p> 31 <p class="send_email_success_<?= $node->getNodeData()->getId() ?> full_width_column"></p>
32 </div> 32 </div>
33 <p class="form_gdpr"><i> 33 <p id="form_warning_<?= $node->getNodeData()->getId() ?>" class="form_warning <?= ($keep_emails ?? false) ? '' : 'hidden' ?>"><i>
34 Une copie de votre e-mail (nom, adresse et message) sera conservée dans notre base de données dans le but de pouvoir répondre à votre demande et et éventuellement dans un but de prospection. Ces données seront traitées automatiquement par notre serveur et conservées pendant au maximum 3 ans à compter de votre dernier message.<br> 34 Une copie de votre e-mail (nom, adresse et message) sera conservée dans notre base de données dans le but de pouvoir répondre à votre demande et et éventuellement dans un but de prospection. Ces données seront traitées automatiquement par notre serveur et conservées pendant au maximum 3 ans à compter de votre dernier message.<br>
35 Ce traitement repose sur votre consentement. Vous pouvez consulter, modifier ou supprimer vos données en base de données sur simple demande. 35 Ce traitement repose sur votre consentement. Vous pouvez consulter, modifier ou supprimer vos données en base de données sur simple demande.
36 </i></p> 36 </i></p>
diff --git a/src/view/templates/form_admin.php b/src/view/templates/form_admin.php
index cabfeb0..bf281b5 100644
--- a/src/view/templates/form_admin.php
+++ b/src/view/templates/form_admin.php
@@ -4,7 +4,12 @@ declare(strict_types=1);
4// note: l'id ici n'est pas celui du noeud bloc mais celui de l'entrée dans node_data correspondante 4// note: l'id ici n'est pas celui du noeud bloc mais celui de l'entrée dans node_data correspondante
5?> 5?>
6<div class="admin_form"> 6<div class="admin_form">
7 <a href="<?= new URL(['page' => 'emails']) ?>"><button>Consulter tous les e-mails</button></a> 7 <p>
8 <label for="keep_emails_<?= $node->getNodeData()->getId() ?>">Conserver les e-mails en base de données</label>
9 <input type="checkbox" id="keep_emails_<?= $node->getNodeData()->getId() ?>" <?= ($keep_emails ?? false) ? 'checked' : '' ?> onclick="keepEmails(<?= $node->getNodeData()->getId() ?>)">
10 </p>
11 <p><i>Notez que ces enregistrements sont des données personnelles et sont concernés par le RGPD.</i></p>
12 <p><a href="<?= new URL(['page' => 'emails']) ?>"><button>Consulter les e-mails enregistrés</button></a></p>
8</div> 13</div>
9<div class="admin_form"> 14<div class="admin_form">
10 <h3>Paramètres d'envoi</h3> 15 <h3>Paramètres d'envoi</h3>
diff --git a/src/view/templates/show_emails.php b/src/view/templates/show_emails.php
index 9954c6f..2cb102e 100644
--- a/src/view/templates/show_emails.php
+++ b/src/view/templates/show_emails.php
@@ -2,18 +2,20 @@
2<section class="show_emails"> 2<section class="show_emails">
3 <h3>Table "<?= TABLE_PREFIX ?>email" de la base de données</h3> 3 <h3>Table "<?= TABLE_PREFIX ?>email" de la base de données</h3>
4 <p><i> 4 <p><i>
5 Les e-mails ci-dessous sont des copies de ceux arrivés dans votre boite de messagerie. Ils sont conservés dans un but pratique et éventuellement dans un but de prospection, ou dans tout autre but permettant de justifier leur conservation.<br> 5 Les e-mails ci-dessous sont des copies de ceux arrivés dans votre boite de messagerie (qui en théorie sont également concernés par le RGPD) depuis tous les formulaires existant sur le site. Ils sont conservés dans un but pratique et éventuellement dans un but de prospection, ou dans tout autre but justifiant leur conservation.
6 Ils sont "effacés" automatiquement au bout d'un certain temps comme le requièrt le RGPD. Un nettoyeur est exécuté à chaque connexion au mode admin ou éventuellement à l'aide d'une tâche CRON (le serveur doit pour ça être configuré pour exécuter periodiquement la commande "php /chemin/du/site/bin/cron.php").
7 </i></p> 6 </i></p>
8 <h4>Durées de conservation</h4> 7 <h4>Durées de conservation</h4>
9 <p><i> 8 <p><i>
10 Ce sont des durées maximales, les données peuvent être supprimées plus tôt ou même immédiatement. Le faire est d'ailleurs une obligation dans le cas où leur expéditeur le demande.<br> 9 Ce sont des durées maximales, les données peuvent être supprimées plus tôt ou même immédiatement. Le faire est d'ailleurs une obligation dans le cas où les personnes concernées le demandent.<br>
11 Théoriquement, ce même nettoyage des vieux messages devrait être également réalisé par vous-même dans votre boite de messagerie.
12 </i></p> 10 </i></p>
13 <p><i> 11 <p><i>
14 Les e-mails ordinaires d'un même expéditeur (même adresse e-mail) sont tous supprimés simultanément lorsque le plus récent d'entre eux atteint les 3 ans (utilisateur "inactif").<br> 12 Les e-mails ordinaires d'un même expéditeur (même adresse e-mail) sont tous supprimés simultanément lorsque le plus récent d'entre eux atteint les 3 ans (utilisateur "inactif").<br>
15 Les e-mails sensibles quand à eux sont supprimés 5 ans après être devenus sensibles (durée juridique d'une preuve). 13 Les e-mails sensibles quand à eux sont supprimés 5 ans après être devenus sensibles (durée juridique d'une preuve).
16 </i></p> 14 </i></p>
15 <p><i>
16 Un nettoyeur supprimant les messages dépassant ces durées est exécuté au moment de votre connexion au mode administrateur.<br>
17 Si vos connexions sont rares, il est possible d'automatiser ce nettoyage à l'aide d'une tâche CRON. Pour cela, vous devez configurer le serveur pour qu'il exécute periodiquement la commande "php /chemin/du/site/bin/cron.php".
18 </i></p>
17 <h4>Données sensibles</h4> 19 <h4>Données sensibles</h4>
18 <p><i> 20 <p><i>
19 Un e-mail peut-être considéré comme "sensible". Vous pouvez rendre un e-mail sensible lorsqu'il possède une valeur de preuve dans le cas d'un litige.<br> 21 Un e-mail peut-être considéré comme "sensible". Vous pouvez rendre un e-mail sensible lorsqu'il possède une valeur de preuve dans le cas d'un litige.<br>