aboutsummaryrefslogtreecommitdiff
path: root/src/service/Installation.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-03-24 22:39:29 +0100
committerpolo <ordipolo@gmx.fr>2026-03-24 22:40:33 +0100
commit3b369122645b07b290f7fcc7bccb4787745cd5ea (patch)
tree3f9c2d1fbd5fe8b26162202e9b1e6cd5c8a940f6 /src/service/Installation.php
parenta70dee9b5021a137ae07041c38921553442b0c11 (diff)
downloadcms-3b369122645b07b290f7fcc7bccb4787745cd5ea.tar.gz
cms-3b369122645b07b290f7fcc7bccb4787745cd5ea.tar.bz2
cms-3b369122645b07b290f7fcc7bccb4787745cd5ea.zip
mode maintenance, optimisation moins de contrôles en mode run, dossier service et déplacement fichiers, sessions et entité User préparées à l'implémentation hypothétique des rôles, entité AppMetadata, meilleure sécurité de fillStartingDatabase
Diffstat (limited to 'src/service/Installation.php')
-rw-r--r--src/service/Installation.php209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/service/Installation.php b/src/service/Installation.php
new file mode 100644
index 0000000..5c2a901
--- /dev/null
+++ b/src/service/Installation.php
@@ -0,0 +1,209 @@
1<?php
2// src/service/Installation.php
3
4declare(strict_types=1);
5
6use App\Entity\AppMetadata;
7use App\Entity\Page;
8use App\Entity\Node;
9use App\Entity\NodeData;
10use Doctrine\ORM\EntityManager;
11
12class Installation
13{
14 static public function phpDependancies(): void
15 {
16 $flag = false;
17 //$extensions = ['pdo_mysql', 'mbstring', 'ctype', 'json', 'tokenizer', 'zip', 'dom']; // les 5 premières sont pour doctrine
18 $extensions = ['pdo_mysql', 'mbstring', 'ctype', 'json', 'tokenizer'];
19 foreach($extensions as $extension){
20 if(!extension_loaded($extension))
21 {
22 echo("<p>l'extension <b>" . $extension . '</b> est manquante</p>');
23 $flag = true;
24 }
25 }
26 if(!extension_loaded('imagick') && !extension_loaded('gd')){
27 echo("<p>il manque une de ces extensions au choix pour le traitement des images: <b>imagick</b> (de préférence) ou <b>gd</b>.</p>");
28 $flag = true;
29 }
30 if($flag){
31 echo '<p>Réalisez les actions nécéssaires sur le serveur ou contactez l\'administrateur du site.<br>
32 Quand le problème sera résolu, il vous suffira de <a href="#">recharger la page<a>.</p>';
33 die;
34 }
35 }
36
37 static public function checkFilesAndFoldersRights(): void
38 {
39 // -- droits des fichiers et dossiers --
40 $droits_dossiers = 0700;
41 $droits_fichiers = 0600;
42
43 if(!file_exists('user_data')){
44 // créer le dossier user_data
45 mkdir('user_data/');
46 chmod('user_data/', $droits_dossiers);
47 echo '<p style="color: red;">Le dossier public/user_data introuvable et le serveur n\'a pas la permission de le créer.<br>
48 Pour faire ça bien:<br>sudo -u "serveur web" mkdir /chemin/du/site/public/user_data</p>
49 <p>Aide: "serveur web" se nomme "www-data" sur debian et ubuntu, il s\'appelera "http" sur d\'autres distributions.</p>';
50 die;
51 }
52
53 if(!file_exists('../config/config.ini')){
54 // aide à la création du config.ini
55 echo '<p>Le fichier config/config.ini est introuvable.</p>';
56 echo '<p>Il doit obligatoirement contenir les codes de la base de données, le protocole http ou https (et éventuellement le port) utilisé pour créer les liens internes.<br>
57 Un modèle est disponible, il s\'agit du fichier config/config-template.ini</p>
58 <p>Quand vous aurez terminé votre config.ini, donnez-lui par sécurité des droits 600.</p>';
59 die;
60 }
61 else{
62 // droits du config.ini
63 /*if(substr(sprintf('%o', fileperms('../config/config.ini')), -4) != 600){
64 chmod('../config/config.ini', $droits_fichiers);
65 }*/
66
67 // tester les liens internes
68 //
69
70 // le test de connexion à la BDD est dans le doctrine bootstrap
71 }
72 }
73
74
75 /* création d'un site minimal avec une page d'accueil à la toute 1ère visite du site, ne doit surtout pas être exécutée une seconde fois */
76
77 // protection 1 utilisé à chaque requête
78 static private function isFirstRun(EntityManager $entityManager): bool
79 {
80 $metadata = $entityManager->getRepository(AppMetadata::class)->find('installed');
81 return !$metadata || $metadata->getValue() !== '1';
82 }
83
84 // protection 2, qui vérifie vraiment que les tables concernées sont vides
85 static private function areTablesEmpty(EntityManager $entityManager): bool
86 {
87 $empty = true;
88 $entities = ['Page', 'Node', 'NodeData'];
89 foreach($entities as $entity){
90 $entity = 'App\Entity\\' . $entity; // nécéssaire quand on insère le nom avec une variable
91
92 if($entityManager
93 ->createQuery("SELECT e FROM $entity e")
94 ->setMaxResults(1)
95 ->getOneOrNullResult()){
96 $empty = false;
97 }
98 }
99
100 // cas anormal détecté, on remet en place la clé "installed"
101 if(!$empty){
102 self::preventReinstallation($entityManager);
103 }
104
105 return $empty;
106 }
107
108 // met en place la protection
109 static private function preventReinstallation(EntityManager $entityManager): void
110 {
111 $metadata = $entityManager->getRepository(AppMetadata::class)->find('installed');
112 if($metadata){
113 $metadata->setValue('1');
114 }
115 else{
116 $metadata = new AppMetadata('installed', '1');
117 $entityManager->persist($metadata);
118 }
119 $entityManager->flush();
120 }
121
122 static public function fillStartingDatabase(EntityManager $entityManager): void
123 {
124 if(!Installation::isFirstRun($entityManager)){
125 return;
126 }
127
128 // la BDD n'est pas vierge, on ne touche à rien
129 if(!self::areTablesEmpty($entityManager)){
130 return;
131 }
132
133 /* -- table page -- */
134 // paramètres: name_page, end_of_path, reachable, in_menu, hidden, position, parent
135 $accueil = new Page('Accueil', 'accueil', "Page d'accueil", true, true, false, 1, NULL);
136 $article = new Page('Article', 'article', "", true, false, false, NULL, NULL);
137 $connection = new Page('Connexion', 'connection', "Connexion", true, false, false, NULL, NULL);
138 $my_account = new Page('Mon compte', 'user_edit', "Mon compte", true, false, false, NULL, NULL);
139 $menu_paths = new Page("Menu et chemins", 'menu_paths', "Menu et chemins", true, false, false, NULL, NULL);
140 $menu_paths->addCSS('menu');
141 $menu_paths->addJS('menu');
142 $new_page = new Page('Nouvelle page', 'new_page', "Nouvelle page", true, false, false, NULL, NULL);
143 $new_page->addCSS('new_page');
144 $new_page->addJS('new_page');
145 $emails = new Page("Courriels", 'emails', "Consulter les courriels en base de données", true, false, false, NULL, NULL);
146 $emails->addCSS('show_emails');
147 $emails->addJS('form');
148
149 /* -- table node -- */
150 // paramètres: name_node, article_timestamp, attributes, position, parent, page, article
151 $head = new Node('head', 1, NULL, NULL, NULL);
152 $header = new Node('header', 2, NULL, NULL, NULL);
153 $nav = new Node('nav', 1, $header, NULL, NULL);
154 $main = new Node('main', 3, NULL, NULL, NULL);
155 $footer = new Node('footer', 4, NULL, NULL, NULL);
156 $breadcrumb = new Node('breadcrumb', 2, $header, NULL, NULL);
157 $login = new Node('login', 1, $main, $connection, NULL);
158 $user_edit = new Node('user_edit', 1, $main, $my_account, NULL);
159 $bloc_edit_menu = new Node('menu', 1, $main, $menu_paths, NULL);
160 $bloc_new_page = new Node('new_page', 1, $main, $new_page, NULL);
161 $bloc_emails = new Node('show_emails', 1, $main, $emails, NULL);
162
163 /* -- table node_data -- */
164 // paramètres: data, node, images
165 $head_data = new NodeData([], $head);
166 $header_data = new NodeData([], $header);
167 $footer_data = new NodeData([], $footer);
168 $emails_data = new NodeData([], $bloc_emails);
169
170 /* -- table page -- */
171 $entityManager->persist($accueil);
172 $entityManager->persist($article);
173 $entityManager->persist($connection);
174 $entityManager->persist($my_account);
175 $entityManager->persist($menu_paths);
176 $entityManager->persist($new_page);
177 $entityManager->persist($emails);
178
179 /* -- table node -- */
180 $entityManager->persist($head);
181 $entityManager->persist($header);
182 $entityManager->persist($nav);
183 $entityManager->persist($main);
184 $entityManager->persist($footer);
185 $entityManager->persist($breadcrumb);
186 $entityManager->persist($login);
187 $entityManager->persist($user_edit);
188 $entityManager->persist($bloc_edit_menu);
189 $entityManager->persist($bloc_new_page);
190 $entityManager->persist($bloc_emails);
191
192 /* -- table node_data -- */
193 $entityManager->persist($head_data);
194 $entityManager->persist($header_data);
195 $entityManager->persist($footer_data);
196 $entityManager->persist($emails_data);
197
198 $entityManager->flush();
199
200 // empêcher la réutilisation de cette fonction
201 self::preventReinstallation($entityManager);
202
203 // fin de l'installation
204 AppMode::set($entityManager, 'run');
205
206 // recharger la page?
207 //header('Location: ' . new URL);
208 }
209} \ No newline at end of file