aboutsummaryrefslogtreecommitdiff
path: root/src/View/templates
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-10-23 00:47:32 +0200
committerpolo <ordipolo@gmx.fr>2026-10-23 00:47:32 +0200
commitf27cca08ff786ceff1870147f6d6bad14d71117f (patch)
treed36597a72025313d6faf4ed228755fa267ebe2f6 /src/View/templates
parentc7309f900ef05bd5cb313110ec159b761af394ec (diff)
downloadcms-f27cca08ff786ceff1870147f6d6bad14d71117f.tar.gz
cms-f27cca08ff786ceff1870147f6d6bad14d71117f.tar.bz2
cms-f27cca08ff786ceff1870147f6d6bad14d71117f.zip
dossiers avec majuscule, namespace pour toutes les classes, autoload psr-4, UserDataService::createZip déplacé dans Backup
Diffstat (limited to 'src/View/templates')
-rw-r--r--src/View/templates/calendar.php14
-rw-r--r--src/View/templates/footer.php43
-rw-r--r--src/View/templates/form.php36
-rw-r--r--src/View/templates/form_admin.php73
-rw-r--r--src/View/templates/galery.php12
-rw-r--r--src/View/templates/head.php13
-rw-r--r--src/View/templates/header.php58
-rw-r--r--src/View/templates/login.php31
-rw-r--r--src/View/templates/maintenance.php65
-rw-r--r--src/View/templates/menu.php51
-rw-r--r--src/View/templates/modify_block.php61
-rw-r--r--src/View/templates/modify_page.php62
-rw-r--r--src/View/templates/new.php27
-rw-r--r--src/View/templates/new_page.php38
-rw-r--r--src/View/templates/news_block.php14
-rw-r--r--src/View/templates/post.php14
-rw-r--r--src/View/templates/post_block.php14
-rw-r--r--src/View/templates/show_emails.php30
-rw-r--r--src/View/templates/user_create.php54
-rw-r--r--src/View/templates/user_edit.php63
20 files changed, 773 insertions, 0 deletions
diff --git a/src/View/templates/calendar.php b/src/View/templates/calendar.php
new file mode 100644
index 0000000..fd920fd
--- /dev/null
+++ b/src/View/templates/calendar.php
@@ -0,0 +1,14 @@
1<?php
2declare(strict_types=1);
3use App\View\HeadBuilder;
4?>
5<section class="calendar" id="<?= $this->id_node ?>">
6 <?= HeadBuilder::insertJS('fullcalendar/index.global.min') ?>
7 <?= HeadBuilder::insertJS('fullcalendar/fr.global.min') ?>
8 <?= HeadBuilder::insertJS($calendar_js_file) ?>
9 <h3><?= $title ?></h3>
10 <div id="calendar_zone">
11 <div id="calendar"></div>
12 <aside id="event_modal" class="modal"></aside>
13 </div>
14</section> \ No newline at end of file
diff --git a/src/View/templates/footer.php b/src/View/templates/footer.php
new file mode 100644
index 0000000..cd8bd0a
--- /dev/null
+++ b/src/View/templates/footer.php
@@ -0,0 +1,43 @@
1<?php
2declare(strict_types=1);
3use App\Service\URL;
4?>
5 <footer>
6<?= $breadcrumb ?>
7 <div class="data">
8 <div class="contact">
9 <div id="footer_name">
10 <span id="footer_name_content"><?= htmlspecialchars($name ?? '') ?></span>
11 <?= $admin_footer_name ?>
12 </div>
13 <div id="footer_address">
14 <span id="footer_address_content"><?= htmlspecialchars($address ?? '') ?></span>
15 <?= $admin_footer_address ?>
16 </div>
17 <div id="footer_email">
18 <a id="footer_email_content" href="mailto:<?= htmlspecialchars($email ?? '') ?>"><?= htmlspecialchars($email ?? '') ?></a>
19 <?= $admin_footer_email ?>
20 </div>
21 </div>
22 <div id="footer_logo">
23 <a href="<?= new URL ?>"><img id="footer_logo_content" src="<?= $footer_logo ?? '' ?>" alt=""></a>
24 <?= $admin_footer_logo ?>
25 </div>
26<?php if(IS_ADMIN){ ?>
27 <script>
28 let footer_name = new InputText('footer_name');
29 let footer_address = new InputText('footer_address');
30 let footer_email = new InputText('footer_email');
31 let footer_logo = new InputFile('footer_logo');
32 </script>
33<?php } ?>
34 </div>
35 <div class="<?= $empty_admin_zone ?>"></div>
36 <div class="<?= $div_admin ?>">
37<?= $zone_admin ?>
38 </div>
39 <div id="toast"></div>
40 </footer>
41 </div>
42 </body>
43</html> \ No newline at end of file
diff --git a/src/View/templates/form.php b/src/View/templates/form.php
new file mode 100644
index 0000000..384bde9
--- /dev/null
+++ b/src/View/templates/form.php
@@ -0,0 +1,36 @@
1<?php declare(strict_types=1); ?>
2<section class="form" id="<?= $this->id_node ?>">
3 <h3><?= $title ?></h3>
4 <?= $admin_content ?>
5 <div class="form_inputs">
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="">
8
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() ?>)">
11
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>
14
15 <div class="full_width_column">
16 <label for="email_captcha_<?= $node->getNodeData()->getId() ?>" >Montrez que vous n'êtes pas un robot</label>
17 </div>
18
19 <label for="email_captcha_<?= $node->getNodeData()->getId() ?>" >Combien font <?= self::$captcha->getA() ?> fois <?= self::$captcha->getB() ?>?</label>
20 <div>
21 <input id="email_captcha_<?= $node->getNodeData()->getId() ?>" type="text" name="email_captcha" size="1" autocomplete="off">
22 </div>
23
24 <input id="form_id_hidden" type="hidden" name="form_id_hidden" value="">
25 <input id="email_hidden_<?= $node->getNodeData()->getId() ?>" type="hidden" name="email_hidden">
26
27 <div class="full_width_column">
28 <input type="submit" value="Envoyez votre message" onclick="sendVisitorEmail(<?= $node->getNodeData()->getId() ?>)">
29 </div>
30
31 <p class="send_email_success_<?= $node->getNodeData()->getId() ?> full_width_column"></p>
32 </div>
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 mieux répondre à votre demande et éventuellement dans d'autres buts (prospection). Ces données seront traitées automatiquement par notre serveur et conservées pendant au maximum <?= $retention_period ?> mois à compter de votre dernier message. Ce traitement repose sur votre consentement. Vous pouvez consulter, modifier ou supprimer vos données sur simple demande.
35 </i></p>
36</section> \ No newline at end of file
diff --git a/src/View/templates/form_admin.php b/src/View/templates/form_admin.php
new file mode 100644
index 0000000..47bca38
--- /dev/null
+++ b/src/View/templates/form_admin.php
@@ -0,0 +1,73 @@
1<?php
2// src/view/templates/form_params.php
3declare(strict_types=1);
4use App\Service\URL;
5// note: l'id ici n'est pas celui du noeud bloc mais celui de l'entrée dans node_data correspondante
6?>
7<div class="admin_form">
8 <p>
9 <label for="keep_emails_<?= $node->getNodeData()->getId() ?>">Conserver les e-mails en base de données</label>
10 <input type="checkbox" id="keep_emails_<?= $node->getNodeData()->getId() ?>" <?= $keep_emails ? 'checked' : '' ?> onclick="keepEmails(<?= $node->getNodeData()->getId() ?>)">
11 </p>
12 <p><i>Notez que ces enregistrements sont des données personnelles et sont concernés par le RGPD.</i></p>
13 <p><a href="<?= new URL(['page' => 'emails']) ?>"><button>Consulter les e-mails enregistrés</button></a></p>
14 <p>
15 <label for="retention_period_<?= $node->getNodeData()->getId() ?>">Durée de conservation (en mois)</label>
16 <input type="number" id="retention_period_<?= $node->getNodeData()->getId() ?>" min="0" value="<?= $retention_period ?>" size="2" onchange="setEmailsRetentionPeriod(<?= $node->getNodeData()->getId() ?>, 'retention_period')">
17 </p>
18 <p>
19 <label for="retention_period_sensible_<?= $node->getNodeData()->getId() ?>">Durée de conservation des emails sensibles(en mois)</label>
20 <input type="number" id="retention_period_sensible_<?= $node->getNodeData()->getId() ?>" min="0" value="<?= $retention_period_sensible ?>" size="2" onchange="setEmailsRetentionPeriod(<?= $node->getNodeData()->getId() ?>, 'retention_period_sensible')">
21 </p>
22
23</div>
24<div class="admin_form">
25 <h3>Paramètres d'envoi</h3>
26 <p>
27 <label for="smtp_host_<?= $node->getNodeData()->getId() ?>">Adresse serveur SMTP</label>
28 <input id="smtp_host_<?= $node->getNodeData()->getId() ?>" type="text" name="smtp_host" placeholder="smtp.messagerie.fr" value="<?= htmlspecialchars($smtp_host) ?>">
29 <input type="hidden" id="smtp_host_hidden_<?= $node->getNodeData()->getId() ?>" value="">
30 <button onclick="setEmailParam('smtp_host', <?= $node->getNodeData()->getId() ?>)">Valider</button>
31 </p>
32 <p>
33 <label for="smtp_secure_<?= $node->getNodeData()->getId() ?>">Chiffrement</label>
34 <select id="smtp_secure_<?= $node->getNodeData()->getId() ?>" name="smtp_secure" onchange="setEmailParam('smtp_secure', <?= $node->getNodeData()->getId() ?>)">
35 <option value="plain_text" >Aucun (port 25)</option>
36 <option value="tls" <?= htmlspecialchars($smtp_secure) === 'tls' ? 'selected' : '' ?>>StartTLS (port 587)</option>
37 <option value="ssl" <?= htmlspecialchars($smtp_secure) === 'ssl' ? 'selected' : '' ?>>SSL (port 465)</option>
38 </select>
39 <input type="hidden" id="smtp_secure_hidden_<?= $node->getNodeData()->getId() ?>" value="">
40 </p>
41 <p>
42 <label for="smtp_username_<?= $node->getNodeData()->getId() ?>">Identifiant (adresse e-mail)</label>
43 <input id="smtp_username_<?= $node->getNodeData()->getId() ?>" type="email" name="smtp_username" autocomplete="new-password" placeholder="mon-adresse@email.fr" value="<?= htmlspecialchars($smtp_username) ?>">
44 <input type="hidden" id="smtp_username_hidden_<?= $node->getNodeData()->getId() ?>" value="">
45 <button onclick="setEmailParam('smtp_username', <?= $node->getNodeData()->getId() ?>)">Valider</button>
46 </p>
47 <p>
48 <label for="smtp_password_<?= $node->getNodeData()->getId() ?>">Mot de passe</label>
49 <input id="smtp_password_<?= $node->getNodeData()->getId() ?>" type="password" name="smtp_password" autocomplete="new-password">
50 <input type="hidden" id="smtp_password_hidden_<?= $node->getNodeData()->getId() ?>" value="">
51 <button onclick="setEmailParam('smtp_password', <?= $node->getNodeData()->getId() ?>)">Valider</button>
52 </p>
53 <p><i>Il s'agit du service qui acheminera les messages envoyés par ce formulaire.<br>
54 Site web => serveur d'envoi => serveur de réception => votre application "mail"</i></p>
55 <p><i>
56 Ce formulaire utilise les paramètres dans le fichier config.ini sur le serveur à mois que vous n'en renseignez d'autres ci-dessus. Les adresses d'envoi et de réception peuvent être identiques.
57 </i></p>
58 <p><i>Le site web peut ne pas réussir à se connecter à certains fournisseurs.</i></p>
59</div>
60<div class="admin_form">
61 <h3>Paramètres de réception</h3>
62 <p>
63 <label for="email_dest_<?= $node->getNodeData()->getId() ?>">Adresse e-mail</label>
64 <input id="email_dest_<?= $node->getNodeData()->getId() ?>" type="email" name="email_dest" placeholder="mon-adresse@email.fr" value="<?= htmlspecialchars($email_dest) ?>">
65 <input type="hidden" id="email_dest_hidden_<?= $node->getNodeData()->getId() ?>" value="">
66 <button onclick="setEmailParam('email_dest', <?= $node->getNodeData()->getId() ?>)">Valider</button>
67 </p>
68</div>
69<div class="admin_form">
70 <p><button onclick="sendTestEmail(<?= $node->getNodeData()->getId() ?>)">Envoi d'un e-mail de test</button></p>
71 <p><i>Vérifie la connexion au serveur d'envoi. Pour tester la réception, consultez vos e-mails à l'adresse de réception.</i></p>
72 <p class="test_email_success_<?= $node->getNodeData()->getId() ?> full_width_column"></p>
73</div> \ No newline at end of file
diff --git a/src/View/templates/galery.php b/src/View/templates/galery.php
new file mode 100644
index 0000000..97f8cd8
--- /dev/null
+++ b/src/View/templates/galery.php
@@ -0,0 +1,12 @@
1<?php declare(strict_types=1); ?>
2<section class="galery" id="<?= $this->id_node ?>">
3 <h3><?= $title ?></h3>
4<?= $new_article ?>
5 <script>
6 var clone<?= $this->id_node ?> = document.currentScript.previousElementSibling.cloneNode(true);
7 </script>
8 <div class="galery_photos">
9<?= $content ?>
10 </div>
11 <script>enableGaleryScroller();</script>
12</section> \ No newline at end of file
diff --git a/src/View/templates/head.php b/src/View/templates/head.php
new file mode 100644
index 0000000..bce0a19
--- /dev/null
+++ b/src/View/templates/head.php
@@ -0,0 +1,13 @@
1<?php declare(strict_types=1); ?>
2<!DOCTYPE html>
3<html lang="fr">
4 <head>
5 <script>window.Config = {page: "<?= CURRENT_PAGE ?>", favicon: "<?= $favicon ?>"};</script>
6 <meta charset="utf-8">
7 <title><?= $title ?></title>
8 <link rel="icon" type="<?= $favicon_type ?>" href="<?= $favicon ?>">
9 <meta name="description" content="<?= $description ?>">
10 <meta name="viewport" content="width=device-width">
11 <?= $css ?>
12 <?= $js ?>
13 </head> \ No newline at end of file
diff --git a/src/View/templates/header.php b/src/View/templates/header.php
new file mode 100644
index 0000000..08bc478
--- /dev/null
+++ b/src/View/templates/header.php
@@ -0,0 +1,58 @@
1<?php
2declare(strict_types=1);
3use App\Service\URL;
4?>
5<body>
6 <div>
7 <header style="background-image: url('<?= $header_background ?? '' ?>');">
8 <div id="nav_zone">
9 <div class="nav_button">
10 <button onclick="toggleTouchMenu()">MENU</button>
11 </div>
12 <?= $nav ?>
13 </div>
14 <div class="header_above">
15 <div id="head_favicon">
16 <?= $admin_head_favicon ?>
17 </div>
18 <div id="header_background">
19 <?= $admin_header_background ?>
20 </div>
21 </div>
22 <div class="header_content">
23 <div class="header_left_col">
24 <div id="header_logo">
25 <a href="<?= new URL ?>"><img id="header_logo_content" src="<?= $header_logo ?? '' ?>" alt=""></a>
26 <?= $admin_header_logo ?>
27 </div>
28 </div>
29 <div class="header_center_col">
30 <h1 id="header_title">
31 <a id="header_title_content" href="<?= new URL ?>"><?= htmlspecialchars($title ?? '') ?></a>
32 <?= $admin_header_title ?>
33 </h1>
34 <h2 id="header_description">
35 <span id="header_description_content"><?= htmlspecialchars($description ?? '') ?></span>
36 <?= $admin_header_description ?>
37 </h2>
38 </div>
39 <div class="header_right_col">
40 <div id="header_social">
41 <div id="header_social_content">
42 <?= $social_networks ?>
43 </div>
44 </div>
45 <?= $breadcrumb ?? '' ?>
46 </div>
47 </div>
48<?php if(IS_ADMIN){ ?>
49 <script>
50 document.getElementById("head_favicon_content").src = window.Config.favicon;
51 let head_favicon = new InputFileFavicon('head_favicon');
52 let header_background = new InputFileHeaderBackground('header_background');
53 let header_logo = new InputFile('header_logo');
54 let header_title = new InputText('header_title');
55 let header_description = new InputText('header_description');
56 </script>
57<?php } ?>
58 </header> \ No newline at end of file
diff --git a/src/View/templates/login.php b/src/View/templates/login.php
new file mode 100644
index 0000000..3257690
--- /dev/null
+++ b/src/View/templates/login.php
@@ -0,0 +1,31 @@
1<?php declare(strict_types=1); ?>
2 <section>
3 <h3>Connexion à l'espace d'administration</h3>
4 <div class="basic_div">
5 <p>Veuillez saisir votre identifiant et votre mot de passe.</p>
6 <p style="color: red; font-style: italic;"><?= $error ?></p>
7 <form method="post" action="<?= $link_form ?>" >
8 <p><label for="login" >Identifiant:</label>
9 <input id="login" type="text" name="login" autofocus required></p>
10 <p><label for="password" >Mot de passe:</label>
11 <input id="password" type="password" name="password" required></p>
12 <input type="hidden" name="connection_hidden">
13
14 <p>Montrez que vous n'êtes pas un robot.<br>
15 <label for="captcha" >Combien font <?= $captcha->getA() ?> fois <?= $captcha->getB() ?>?</label>
16 <input required type="text" id="captcha" name="captcha" autocomplete="off" size="1">
17 </p>
18
19 <input type="submit" value="Valider">
20 </form>
21 <p>Au fait? Vous n'utilisez pas votre propre ordinateur ou téléphone?<br/>
22 Utilisez la navigation privée.</p>
23 </div>
24 </section>
25 <section>
26 <div class="basic_div">
27 <a href="<?= $link_exit ?>" >
28 <button>Retour au site</button>
29 </a>
30 </div>
31 </section> \ No newline at end of file
diff --git a/src/View/templates/maintenance.php b/src/View/templates/maintenance.php
new file mode 100644
index 0000000..5a8a46d
--- /dev/null
+++ b/src/View/templates/maintenance.php
@@ -0,0 +1,65 @@
1<?php
2declare(strict_types=1);
3use App\Service\URL;
4?>
5<section class="maintenance">
6 <h3>Maintenance du site</h3>
7 <div class="basic_div">
8 <p>
9 <button onclick="displayLogs()">Consulter les journaux de connexion</button><br>
10 <i>Qui a essayé de se connecter, quand et a-t'il réussi?</i>
11 </p>
12 <div id="log_table"></div>
13 <p><button onclick="cleanLogs()">Effacer les journaux de connexion</button></p>
14
15 </div>
16 <div class="basic_div">
17 <p>
18 <a href="<?= new URL(['page' => 'emails']) ?>"><button>Consulter les emails</button></a>
19 <i>reçus depuis tous les formulaires de contact</i>
20 </p>
21 </div>
22 <div class="basic_div">
23 <p>
24 <a href="<?= new URL(['action' => 'get_mysqldump']) ?>">
25 <button id="get_mysqldump" onclick="preventClickSpam(this)">Télécharger une sauvegarde de la base de données</button>
26 </a><br>
27 <i>Obtenir un fichier SQL à conserver. Une sauvegarde (désignée par "auto") est réalisée à chaque connexion au mode admin.</i>
28 </p>
29 </div>
30 <div class="basic_div">
31 <p>Restaurer la base de données à partir d'un fichier SQL.<br>
32 <i>Attention, l'actuelle BDD sera écrasée! (à l'exception de la table <?= TABLE_PREFIX ?>user)</i>
33 </p>
34 <form action="<?= new URL(['from' => 'maintenance', 'action' => 'restore_database']) ?>" method="post">
35 <label for="selected_sql">Utiliser une sauvegarde conservée sur le serveur:</label><br>
36 <select id="selected_sql" name="selected_sql">
37 <?= $backup_options ?>
38 </select>
39 <input type="hidden" name="hidden" value="">
40 <input type="submit" value="Valider" onclick="return confirm('Voulez-vous vraiment restaurer la base de données? Toutes les données seront supprimées et remplacées par les nouvelles.')">
41 </form>
42 <form enctype="multipart/form-data" action="<?= new URL(['from' => 'maintenance', 'action' => 'restore_database']) ?>" method="post">
43 <label for="uploaded_sql">Utiliser un fichier sur votre ordinateur:</label><br>
44 <input id="uploaded_sql" type="file" accept=".sql" name="uploaded_sql">
45 <input type="hidden" name="hidden" value="">
46 <input type="submit" value="Valider" onclick="return confirm('Voulez-vous vraiment restaurer la base de données? Toutes les données seront supprimées et remplacées par les nouvelles.')">
47 </form>
48 </div>
49 <div class="basic_div">
50 <p>
51 <a href="<?= new URL(['from' => 'maintenance', 'action' => 'get_all_media']) ?>">
52 <button id="get_all_media" onclick="preventClickSpam(this)">Récupérer l'ensemble des fichiers mutimedia</button>
53 </a><br>
54 <i>Toutes vos photos et vos documents dans un .zip</i>
55 </p>
56 <p>
57 <button onclick="openExplorer()" style="color: grey">Explorateur de fichiers</button><br>
58 <i>Gérer les fichiers multimedia, fonction actuellement indisponible</i>
59 </p>
60 </div>
61
62 <div class="basic_div">
63 <a href="http://nageurs.localhost/index.php"><button>Retour au site</button></a>
64 </div>
65</section> \ No newline at end of file
diff --git a/src/View/templates/menu.php b/src/View/templates/menu.php
new file mode 100644
index 0000000..5a15fdb
--- /dev/null
+++ b/src/View/templates/menu.php
@@ -0,0 +1,51 @@
1<?php
2declare(strict_types=1);
3use App\Service\URL;
4?>
5<section class="menu">
6 <h3>Menu et chemins</h3>
7 <div class="new_page_button">
8 <p>Créer une <a href="<?= new URL(['page' => 'new_page']) ?>"><button style="color: #ff1d04;">Nouvelle page</button></a>.</p>
9 </div>
10 <div class="url_form_zone">
11 <p>Créer une entrée dans le menu avec une adresse vers un site quelconque:</p>
12 <form method="post" action="<?= new URL(['from' => 'menu_paths']) ?>">
13 <p>
14 <label for="label_input">Nom dans le menu:</label>
15 <input id="label_input" type="text" name="label_input">
16 </p>
17 <p>
18 <label for="url_input">Adresse (collez votre lien):</label>
19 <input id="url_input" type="url" name="url_input" placeholder="https://..." onchange="controlURL(this)">
20 </p>
21 <p>
22 <label>Placer le lien juste après cette entrée:</label>
23 <select id="location" name="location">
24 <?= $this->options ?>
25 </select>
26 </p>
27 <input type="submit" onclick="createUrlEntry()" value="Valider">
28 </form>
29 </div>
30 <aside>
31 <p>Modifier le menu:</p>
32 <div class="controls_explanations">
33 <p><img src="assets/arrow-left.svg"> remonter dans l'arbre</p>
34 <p><img src="assets/arrow-right.svg"> devenir une branche de l'élément précédent</p>
35 <p><img src="assets/arrow-up.svg"><img src="assets/arrow-down.svg"> déplacer la branche parmi celles de même niveau</p>
36 <p><input type="checkbox" checked> afficher/cacher</p>
37 <p><img src="assets/save.svg"> enregistrer une modification</p>
38 <p><img src="assets/delete-bin.svg"> supprimer un lien</p>
39 </div>
40 </aside>
41 <div id="menu_edit_buttons">
42<?= $this->html ?>
43 </div>
44</section>
45<section>
46 <div class="basic_div">
47 <a href="<?= new URL ?>">
48 <button>Retour au site</button>
49 </a>
50 </div>
51</section> \ No newline at end of file
diff --git a/src/View/templates/modify_block.php b/src/View/templates/modify_block.php
new file mode 100644
index 0000000..bb5abd3
--- /dev/null
+++ b/src/View/templates/modify_block.php
@@ -0,0 +1,61 @@
1<?php
2declare(strict_types=1);
3use App\Service\URL;
4?>
5<div class="modify_one_block" id="bloc_edit_<?= $child_node->getId() ?>">
6 <div class="block_options">
7 <label for="bloc_rename_<?= $child_node->getId() ?>">Type <b><?= App\Entity\Presentation::BLOCKS[$child_node->getName()] ?? '<i>erreur base de données</i>' ?></b>
8 </label>
9 <p>
10 <input type="text" id="bloc_rename_<?= $child_node->getId() ?>" name="bloc_rename_title" value="<?= $child_node->getNodeData()->getdata()['title'] ?>" required>
11 <button onclick="renamePageBloc(<?= $child_node->getId() ?>)">Renommer</button>
12 </p>
13 <div>
14 <p>
15 <img class="action_icon" onclick="switchBlocsPositions(<?= $child_node->getId() ?>, 'up')" src="assets/arrow-up.svg">
16 <img class="action_icon" onclick="switchBlocsPositions(<?= $child_node->getId() ?>, 'down')" src="assets/arrow-down.svg">
17 </p>
18 <form method="post" action="<?= new URL(['page' => CURRENT_PAGE]) ?>">
19 <input type="hidden" name="delete_bloc_id" value="<?= $child_node->getId() ?>">
20 <input type="hidden" name="delete_bloc_hidden">
21 <input type="submit" value="Supprimer" onclick="return confirm('Voulez-vous vraiment supprimer ce bloc?');">
22 </form>
23 </div>
24 </div>
25<?php
26if($child_node->getName() === 'news_block'){
27?>
28 <div class="news_order">
29 <label>Ordre des articles</label>
30 <select id="articles_order_select_<?= $child_node->getId() ?>" onchange="articlesOrderSelect(<?= $child_node->getId() ?>)">
31 <option value="antichrono" <?= $order === 'antichrono' ? 'selected' : '' ?>>Antichronologique</option>
32 <option value="chrono" <?= $order === 'chrono' ? 'selected' : '' ?>>Chronologique</option>
33 </select>
34 </div>
35<?php
36}
37if(App\Entity\Presentation::hasPresentation($child_node->getName())){
38?>
39 <div class="grid_options">
40 <div>
41 <label for="presentation_select_<?= $child_node->getId() ?>">Présentation</label>
42 <select id="presentation_select_<?= $child_node->getId() ?>" onchange="changePresentation(<?= $child_node->getId() ?>)">
43 <?= $this->makePresentationOptions($child_node->getNodeData()->getPresentation()) ?>
44 </select>
45 </div>
46 <div id="cols_min_width_edit_<?= $child_node->getId() ?>" class="<?= ($child_node->getNodeData()->getPresentation() === 'grid' ? '' : 'hidden') ?>">
47 <label for="cols_min_width_select_<?= $child_node->getId() ?>">Largeur minimum </label>
48 <input type="number" id="cols_min_width_select_<?= $child_node->getId() ?>" onchange="changeColsMinWidth(<?= $child_node->getId() ?>)" min="150" max="400" value="<?= $child_node->getNodeData()->getColsMinWidth() ?>"> pixels
49 </div>
50 </div>
51 <div class="pagination_limit">
52 <label for="pagination_limit_<?= $child_node->getId() ?>">
53 Nombre max d'articles affichés
54 <input type="number" id="pagination_limit_<?= $child_node->getId() ?>" name="pagination_limit" onchange="changePaginationLimit(<?= $child_node->getId() ?>)" min="0" max="30" value="<?= $child_node->getNodeData()->getPaginationLimit() ?>">
55 <i>(mettre 0 désactive la pagination)</i>
56 </label>
57 </div>
58<?php
59}
60?>
61</div> \ No newline at end of file
diff --git a/src/View/templates/modify_page.php b/src/View/templates/modify_page.php
new file mode 100644
index 0000000..773277b
--- /dev/null
+++ b/src/View/templates/modify_page.php
@@ -0,0 +1,62 @@
1<?php
2declare(strict_types=1);
3use App\Model\Model;
4use App\Service\URL;
5?>
6<section class="page_modification">
7 <h3>Modification de la page</h3>
8 <div class="edit_page_zone">
9 <div class="edit_page_title_zone">
10 <p id="edit_page_title">
11 <label for="page_name">Titre de la page</label>
12 <input type="text" id="page_name" name="edit_page_title" value="<?= Model::$page_path->getLast()->getPageName() ?>" onchange="makePageNamePath()" required>
13 <button onclick="changePageTitle('<?= Model::$page_path->getLast()->getId() ?>')">Renommer</button>
14 </p>
15 <form id="edit_page_menu_path" method="post" action="<?= new URL(['page' => CURRENT_PAGE]) ?>">
16 <label for="page_name_path">Chemin en "snake_case"</label>
17 <input type="text" id="page_name_path" name="page_menu_path" value="<?= Model::$page_path->getLast()->getEndOfPath() ?>" placeholder="ex: nouvelle_page" required>
18 <input type="hidden" name="page_id" value="<?= Model::$page_path->getLast()->getId() ?>"><input type="hidden" name="page_name_path_hidden">
19 <input type="submit" value="Modifier">
20 </form>
21 </div>
22 <div id="edit_description">
23 <label for="description_textarea">Description sous le titre dans les moteurs de recherche</label>
24 <div>
25 <textarea id="description_textarea" name="edit_description" cols="40" rows="3" placeholder="ex: nous faisons ceci et cela, etc" required><?= Model::$page_path->getLast()->getDescription(); ?></textarea>
26 <button onclick="changeDescription('<?= Model::$page_path->getLast()->getId() ?>')">Modifier</button>
27 </div>
28 </div>
29 </div>
30 <div class="delete_page_zone">
31 <form method="post" action="<?= new URL(['page' => CURRENT_PAGE]) ?>">
32 <label>Supprimer cette page</label>
33 <input type="hidden" name="page_id" value="<?= Model::$page_path->getLast()->getId() ?>">
34 <input type="hidden" name="submit_hidden">
35 <input type="submit" value="Supprimer" onclick="return confirm('Voulez-vous vraiment supprimer cette page?');">
36 </form>
37 </div>
38 <div class="edit_block_zone">
39 <div class="new_block">
40 <p>Ajouter un bloc de page</p>
41 <form method="post" action="<?= new URL(['page' => CURRENT_PAGE]) ?>">
42 <p><label for="bloc_title">Titre</label>
43 <input type="text" id="bloc_title" name="bloc_title" required></p>
44 <p><label for="bloc_select">Type</label>
45 <select id="bloc_select" name="bloc_select" required>
46 <?= $options ?>
47 </select>
48 <input type="hidden" name="bloc_title_hidden">
49 <input type="submit" value="Valider"></p>
50 </form>
51 <div class="explanations">
52 <p><b>Articles libres</b>: textes riches générés par l'éditeur et librement positionnables</p>
53 <p><b>Actualités</b>: contenus structurés avec titre, aperçu, date et possédant une page dédiée</p>
54 <!-- <p><b>Galerie</b>: photos parcourables en mode plein écran (cette fonctionalité n'est pas encore disponible)</p> -->
55 </div>
56 </div>
57 <div class="modify_block">
58 <p>Modifier un bloc</p>
59 <?= $bloc_edit ?>
60 </div>
61 </div>
62</section> \ No newline at end of file
diff --git a/src/View/templates/new.php b/src/View/templates/new.php
new file mode 100644
index 0000000..30b244f
--- /dev/null
+++ b/src/View/templates/new.php
@@ -0,0 +1,27 @@
1<?php declare(strict_types=1); ?>
2<article>
3 <div class="new_content <?= $overflow ?>" id="<?= $id ?>">
4 <div class="data" id="<?= $id_title ?>">
5 <?= $title ?>
6 </div>
7 <?= $title_buttons ?>
8 <div class="data new_content_text" id="<?= $id_preview ?>">
9 <?= $preview ?>
10 </div>
11 <?= $preview_buttons ?>
12 <div class="data article_content_text" id="<?= $id_content ?>">
13 <?= $content ?>
14 </div>
15 <?= $article_buttons ?>
16 <div class="under_an_article">
17 <p>
18 <img src="assets/calendar.svg">
19 <span class="data local_date" id="<?= $id_date ?>" date-utc="<?= $date ?>">Chargement...</span>
20 </p>
21 </div>
22 <?= $date_buttons ?>
23 <div class="article_admin_zone">
24 <?= $admin_buttons ?>
25 </div>
26 </div>
27</article> \ No newline at end of file
diff --git a/src/View/templates/new_page.php b/src/View/templates/new_page.php
new file mode 100644
index 0000000..535d88d
--- /dev/null
+++ b/src/View/templates/new_page.php
@@ -0,0 +1,38 @@
1<?php
2declare(strict_types=1);
3use App\Service\URL;
4?>
5<section class="new_page">
6 <h3>Création d'une nouvelle page</h3>
7 <div class="form_zone">
8 <form method="post" action="<?= new URL ?>">
9 <p>
10 <label for="page_name">Nom de la page</label>
11 <input id="page_name" type="text" name="page_name" onchange="makePageNamePath()" required>
12 </p>
13 <p>
14 <label for="page_name_path">Chemin de l'URL</label>
15 <input id="page_name_path" type="text" name="page_name_path" placeholder="ex: nouvelle_page" required>
16 </p>
17 <p>
18 <label for="page_location">Placer la page juste après cette entrée</label>
19 <select id="page_location" name="page_location">
20 <?= $this->options ?>
21 </select>
22 </p>
23 <input type="hidden" name="new_page_hidden">
24 <p>
25 <label class="label_textarea" for="page_description">Description qui apparaît sous le titre dans les moteurs de recherche</label>
26 <textarea id="page_description" name="page_description" cols="35" rows="3" placeholder="ex: nous faisons ceci et cela, etc"></textarea>
27 </p>
28 <input type="submit" value="Créer la page">
29 </form>
30 </div>
31</section>
32<section>
33 <div class="basic_div">
34 <a href="<?= new URL ?>">
35 <button>Retour au site</button>
36 </a>
37 </div>
38</section> \ No newline at end of file
diff --git a/src/View/templates/news_block.php b/src/View/templates/news_block.php
new file mode 100644
index 0000000..43dbe01
--- /dev/null
+++ b/src/View/templates/news_block.php
@@ -0,0 +1,14 @@
1<?php declare(strict_types=1); ?>
2<section class="<?= $section_class ?>" block-type="<?= $node->getName() ?>" id="<?= $this->id_node ?>">
3 <h3><?= $title ?></h3>
4<?= $new_article ?>
5 <script>
6 var clone<?= $this->id_node ?> = document.currentScript.previousElementSibling.cloneNode(true);
7 </script>
8 <div class="section_child" style="<?= $cols_min_width ?>">
9<?= $content ?>
10 </div>
11 <div class="fetch_articles">
12 <button class="<?= $fetch_button_hidden ?>" onclick="fetchArticles(<?= $this->id_node ?>)">Articles suivants</button>
13 </div>
14</section> \ No newline at end of file
diff --git a/src/View/templates/post.php b/src/View/templates/post.php
new file mode 100644
index 0000000..d0d01b2
--- /dev/null
+++ b/src/View/templates/post.php
@@ -0,0 +1,14 @@
1<?php declare(strict_types=1); ?>
2<article>
3 <div class="post_content">
4 <div class="article_title_zone">
5 <?= $share_button ?>
6 </div>
7 <div id="<?= $id ?>">
8 <?= $html ?>
9 </div>
10 <div class="article_admin_zone">
11 <?= $admin_buttons ?>
12 </div>
13 </div>
14</article> \ No newline at end of file
diff --git a/src/View/templates/post_block.php b/src/View/templates/post_block.php
new file mode 100644
index 0000000..43dbe01
--- /dev/null
+++ b/src/View/templates/post_block.php
@@ -0,0 +1,14 @@
1<?php declare(strict_types=1); ?>
2<section class="<?= $section_class ?>" block-type="<?= $node->getName() ?>" id="<?= $this->id_node ?>">
3 <h3><?= $title ?></h3>
4<?= $new_article ?>
5 <script>
6 var clone<?= $this->id_node ?> = document.currentScript.previousElementSibling.cloneNode(true);
7 </script>
8 <div class="section_child" style="<?= $cols_min_width ?>">
9<?= $content ?>
10 </div>
11 <div class="fetch_articles">
12 <button class="<?= $fetch_button_hidden ?>" onclick="fetchArticles(<?= $this->id_node ?>)">Articles suivants</button>
13 </div>
14</section> \ No newline at end of file
diff --git a/src/View/templates/show_emails.php b/src/View/templates/show_emails.php
new file mode 100644
index 0000000..f561dc7
--- /dev/null
+++ b/src/View/templates/show_emails.php
@@ -0,0 +1,30 @@
1<?php declare(strict_types=1); ?>
2<section class="show_emails">
3 <h3>Table "<?= TABLE_PREFIX ?>email" de la base de données</h3>
4 <p><i>
5 Les e-mails ci-dessous sont des copies de ceux arrivés dans votre boite de messagerie depuis tous les formulaires existant sur le site. Ils sont conservés dans un but pratique (historique, prospection) ou dans tout autre but justifiant leur conservation. Cette conservation est optionnelle et règlementée par la loi européenne RGPD.<br>
6 <b>Notez qu'utiliser cette application ne vous garantit pas d'être en conformité avec la loi, c'est un outil vous permettant de faire les choses comme vous l'entendez. Si tout ceci vous gêne, désactivez le stockage des e-mails et supprimez ceux déjà enregistrés (ci-dessous).</b>
7 </i></p>
8 <h4>Durées de conservation</h4>
9 <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ù les personnes concernées le demandent.<br>
11 </i></p>
12 <p><i>
13 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 est considéré inactif).<br>
14 Les e-mails sensibles quand à eux sont supprimés 5 ans après être devenus sensibles (durée juridique d'une preuve).
15 </i></p>
16 <p><i>
17 Un nettoyeur supprimant les messages dépassant ces durées est exécuté au moment de votre connexion au mode administrateur.<br>
18 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".
19 </i></p>
20 <h4>Données sensibles</h4>
21 <p><i>
22 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>
23 Lorsqu'une personne demande la suppression de ses données personnelles du serveur, les e-mails sensibles peuvent être conservés, vous aurez noté que la durée de conservation est calculée différement.
24 </i></p>
25 <p><i>
26 Les spams ne sont pas sensibles, c'est juste de la pollution, supprimez-les!
27 </i></p>
28
29 <?= $emails ?>
30</section> \ No newline at end of file
diff --git a/src/View/templates/user_create.php b/src/View/templates/user_create.php
new file mode 100644
index 0000000..662d9ac
--- /dev/null
+++ b/src/View/templates/user_create.php
@@ -0,0 +1,54 @@
1<?php
2declare(strict_types=1);
3use App\Service\Captcha;
4
5$error_messages = [
6 'error_non_valid_captcha' => 'Erreur au test anti-robot, veuillez saisir un nombre entier.',
7 'captcha_server_error' => 'captcha_server_error',
8 'bad_solution_captcha' => 'Erreur au test anti-robot, veuillez réessayer.',
9 'bad_login_or_password' => 'Mauvais identifiant ou mot de passe, veuillez réessayer.',
10 'different_passwords' => 'Les deux mots de passe saisis sont différents',
11 'forbidden_characters' => 'Caractères interdits: espaces, tabulations, sauts CR/LF.'
12];
13$error = isset($_GET['error']) ? $error_messages[$_GET['error']] : '';
14
15$captcha = new Captcha;
16$_SESSION['captcha'] = $captcha->getSolution(); // enregistrement de la réponse du captcha pour vérification
17?>
18<!DOCTYPE html>
19<html lang="fr">
20 <head>
21 <meta charset="utf-8">
22 <title>Bienvenue</title>
23 <link rel="icon" type="image/png" href="assets/favicon48x48.png">
24 <link rel="stylesheet" href="css/body.css">
25 <meta name="viewport" content="width=device-width, initial-scale=1.0">
26 </head>
27 <body>
28 <main>
29 <section>
30 <h3>Bienvenue.</h3>
31 <p style="text-align: center;">Pour commencer, veuillez créer un compte administrateur.</p>
32 <div class="basic_div">
33 <p style="color: red; font-style: italic;"><?= $error ?></p>
34 <form method="post" action="index.php?action=create_user" >
35 <p><label for="login" >Identifiant:</label>
36 <input id="login" type="text" name="login" autofocus required></p>
37 <p><label for="password" >Mot de passe:</label>
38 <input id="password" type="password" name="password" required></p>
39 <p><label for="password_confirmation" >Confirmer le mot de passe:</label>
40 <input id="password_confirmation" type="password" name="password_confirmation" required></p>
41 <input type="hidden" name="create_user_hidden">
42
43 <p>Montrez que vous n'êtes pas un robot.<br>
44 <label for="captcha" >Combien font <?= $captcha->getA() ?> fois <?= $captcha->getB() ?>?</label>
45 <input required type="text" id="captcha" name="captcha" autocomplete="off" size="1">
46 </p>
47
48 <input type="submit" value="Valider">
49 </form>
50 </div>
51 </section>
52 </main>
53 </body>
54</html> \ No newline at end of file
diff --git a/src/View/templates/user_edit.php b/src/View/templates/user_edit.php
new file mode 100644
index 0000000..9191e7d
--- /dev/null
+++ b/src/View/templates/user_edit.php
@@ -0,0 +1,63 @@
1<?php declare(strict_types=1); ?>
2 <section>
3 <div class="user_edit_header">
4 <div class="empty_column"></div>
5 <h3>Mon compte</h3>
6 <div>
7 <img class="user_icon" src="assets/user_hollow.svg">
8 <div><?= $_SESSION['user']['username'] ?></div>
9 </div>
10 </div>
11 <div class="user_edit_flex">
12 <div class="basic_div">
13 <p>Modifier mon <b>nom d'utilisateur</b>.</p>
14 <p style="color: red; font-style: italic;"><?= $error_username ?></p>
15 <p style="color: green; font-style: italic;"><?= $success_username ?></p>
16 <form method="post" action="<?= $link_user_form ?>" >
17 <p><label for="login" >Ancien nom:</label>
18 <input id="login" type="text" name="login" required></p>
19 <p><label for="password" >Mot de passe:</label>
20 <input id="password" type="password" name="password" required ></p>
21 <p><label for="new_login" >Nouveau nom:</label>
22 <input id="new_login" type="text" name="new_login" required></p>
23 <input type="hidden" name="modify_username_hidden">
24
25 <p>Montrez que vous n'êtes pas un robot.<br>
26 <label for="captcha" >Combien font <?= $captcha->getA() ?> fois <?= $captcha->getB() ?>?</label>
27 <input required type="text" id="captcha" name="captcha" autocomplete="off" size="1">
28 </p>
29
30 <input type="submit" value="Valider">
31 </form>
32 </div>
33 <div class="basic_div">
34 <p>Modifier mon <b>mot de passe</b>.</p>
35 <p style="color: red; font-style: italic;"><?= $error_password ?></p>
36 <p style="color: green; font-style: italic;"><?= $success_password ?></p>
37 <form method="post" action="<?= $link_password_form ?>" >
38 <p><label for="login" >Nom:</label>
39 <input id="login" type="text" name="login" required></p>
40 <p><label for="password" >Ancien mot de passe:</label>
41 <input id="password" type="password" name="password" required ></p>
42 <p><label for="new_password" >Nouveau mot de passe:</label>
43 <input id="new_password" type="password" name="new_password" required autocomplete="off"></p>
44 <input type="hidden" name="modify_password_hidden">
45
46 <p>Montrez que vous n'êtes pas un robot.<br>
47 <label for="captcha" >Combien font <?= $captcha->getA() ?> fois <?= $captcha->getB() ?>?</label>
48 <input required type="text" id="captcha" name="captcha" autocomplete="off" size="1">
49 </p>
50
51 <input type="submit" value="Valider">
52 </form>
53 </div>
54 </div>
55 </section>
56 <section>
57 <div class="basic_div">
58 <a href="<?= $link_exit ?>">
59 <button>Retour au site</button></a>
60 <a href="<?= $link_logout ?>">
61 <button>Déconnexion</button></a>
62 </div>
63 </section> \ No newline at end of file