aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--public/index.php6
-rw-r--r--src/model/DatabaseSettingUp.php152
-rw-r--r--src/service/Installation.php153
3 files changed, 162 insertions, 149 deletions
diff --git a/public/index.php b/public/index.php
index db8808e..7d53b5c 100644
--- a/public/index.php
+++ b/public/index.php
@@ -48,11 +48,11 @@ AppMode::load($entityManager);
48if(IS_ADMIN && AppMode::is('maintenance')){ 48if(IS_ADMIN && AppMode::is('maintenance')){
49 Installation::phpDependancies(); 49 Installation::phpDependancies();
50 Installation::checkFilesAndFoldersRights(); 50 Installation::checkFilesAndFoldersRights();
51 51}
52if(AppMode::is('maintenance')){
52 // si appelée pour la 1ère fois, remplit la BDD et active le mode "run" 53 // si appelée pour la 1ère fois, remplit la BDD et active le mode "run"
53 Installation::fillStartingDatabase($entityManager); 54 DatabaseSettingUp::run($entityManager);
54} 55}
55
56$request = Request::createFromGlobals(); 56$request = Request::createFromGlobals();
57 57
58// en mode maintenance laisser la possibilité de se logger, bloquer le reste du site aux visiteurs 58// en mode maintenance laisser la possibilité de se logger, bloquer le reste du site aux visiteurs
diff --git a/src/model/DatabaseSettingUp.php b/src/model/DatabaseSettingUp.php
new file mode 100644
index 0000000..9ff7344
--- /dev/null
+++ b/src/model/DatabaseSettingUp.php
@@ -0,0 +1,152 @@
1<?php
2// src/model/DatabaseSettingUp.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
12/* 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 */
13class DatabaseSettingUp
14{
15 static public function run(EntityManager $entityManager): void
16 {
17 if(!self::isFirstRun($entityManager)){
18 return;
19 }
20
21 // la BDD n'est pas vierge, on ne touche à rien
22 if(!self::areTablesEmpty($entityManager)){
23 return;
24 }
25
26 self::fillStartingDatabase($entityManager);
27
28 // empêcher la réutilisation de cette fonction
29 self::preventReinstallation($entityManager);
30
31 // fin de l'installation
32 AppMode::set($entityManager, 'run');
33
34 // recharger la page?
35 //header('Location: ' . new URL);
36 }
37
38 // protection 1 utilisé à chaque requête
39 static private function isFirstRun(EntityManager $entityManager): bool
40 {
41 $metadata = $entityManager->getRepository(AppMetadata::class)->find('installed');
42 return !$metadata || $metadata->getValue() !== '1';
43 }
44
45 // protection 2, qui vérifie vraiment que les tables concernées sont vides
46 static private function areTablesEmpty(EntityManager $entityManager): bool
47 {
48 $empty = true;
49 $entities = ['Page', 'Node', 'NodeData'];
50 foreach($entities as $entity){
51 $entity = 'App\Entity\\' . $entity; // nécéssaire quand on insère le nom avec une variable
52
53 if($entityManager
54 ->createQuery("SELECT e FROM $entity e")
55 ->setMaxResults(1)
56 ->getOneOrNullResult()){
57 $empty = false;
58 }
59 }
60
61 // cas anormal détecté, on remet en place la clé "installed"
62 if(!$empty){
63 self::preventReinstallation($entityManager);
64 }
65
66 return $empty;
67 }
68
69 static private function fillStartingDatabase(EntityManager $entityManager): void
70 {
71 /* -- table page -- */
72 // paramètres: name_page, end_of_path, reachable, in_menu, hidden, position, parent
73 $accueil = new Page('Accueil', 'accueil', "Page d'accueil", true, true, false, 1, NULL);
74 $article = new Page('Article', 'article', "", true, false, false, NULL, NULL);
75 $connection = new Page('Connexion', 'connection', "Connexion", true, false, false, NULL, NULL);
76 $my_account = new Page('Mon compte', 'user_edit', "Mon compte", true, false, false, NULL, NULL);
77 $menu_paths = new Page("Menu et chemins", 'menu_paths', "Menu et chemins", true, false, false, NULL, NULL);
78 $menu_paths->addCSS('menu');
79 $menu_paths->addJS('menu');
80 $new_page = new Page('Nouvelle page', 'new_page', "Nouvelle page", true, false, false, NULL, NULL);
81 $new_page->addCSS('new_page');
82 $new_page->addJS('new_page');
83 $emails = new Page("Courriels", 'emails', "Consulter les courriels en base de données", true, false, false, NULL, NULL);
84 $emails->addCSS('show_emails');
85 $emails->addJS('form');
86
87 /* -- table node -- */
88 // paramètres: name_node, article_timestamp, attributes, position, parent, page, article
89 $head = new Node('head', 1, NULL, NULL, NULL);
90 $header = new Node('header', 2, NULL, NULL, NULL);
91 $nav = new Node('nav', 1, $header, NULL, NULL);
92 $main = new Node('main', 3, NULL, NULL, NULL);
93 $footer = new Node('footer', 4, NULL, NULL, NULL);
94 $breadcrumb = new Node('breadcrumb', 2, $header, NULL, NULL);
95 $login = new Node('login', 1, $main, $connection, NULL);
96 $user_edit = new Node('user_edit', 1, $main, $my_account, NULL);
97 $bloc_edit_menu = new Node('menu', 1, $main, $menu_paths, NULL);
98 $bloc_new_page = new Node('new_page', 1, $main, $new_page, NULL);
99 $bloc_emails = new Node('show_emails', 1, $main, $emails, NULL);
100
101 /* -- table node_data -- */
102 // paramètres: data, node, images
103 $head_data = new NodeData([], $head);
104 $header_data = new NodeData([], $header);
105 $footer_data = new NodeData([], $footer);
106 $emails_data = new NodeData([], $bloc_emails);
107
108 /* -- table page -- */
109 $entityManager->persist($accueil);
110 $entityManager->persist($article);
111 $entityManager->persist($connection);
112 $entityManager->persist($my_account);
113 $entityManager->persist($menu_paths);
114 $entityManager->persist($new_page);
115 $entityManager->persist($emails);
116
117 /* -- table node -- */
118 $entityManager->persist($head);
119 $entityManager->persist($header);
120 $entityManager->persist($nav);
121 $entityManager->persist($main);
122 $entityManager->persist($footer);
123 $entityManager->persist($breadcrumb);
124 $entityManager->persist($login);
125 $entityManager->persist($user_edit);
126 $entityManager->persist($bloc_edit_menu);
127 $entityManager->persist($bloc_new_page);
128 $entityManager->persist($bloc_emails);
129
130 /* -- table node_data -- */
131 $entityManager->persist($head_data);
132 $entityManager->persist($header_data);
133 $entityManager->persist($footer_data);
134 $entityManager->persist($emails_data);
135
136 $entityManager->flush();
137 }
138
139 // met en place la protection
140 static private function preventReinstallation(EntityManager $entityManager): void
141 {
142 $metadata = $entityManager->getRepository(AppMetadata::class)->find('installed');
143 if($metadata){
144 $metadata->setValue('1');
145 }
146 else{
147 $metadata = new AppMetadata('installed', '1');
148 $entityManager->persist($metadata);
149 }
150 $entityManager->flush();
151 }
152} \ No newline at end of file
diff --git a/src/service/Installation.php b/src/service/Installation.php
index 5c2a901..059c093 100644
--- a/src/service/Installation.php
+++ b/src/service/Installation.php
@@ -3,19 +3,13 @@
3 3
4declare(strict_types=1); 4declare(strict_types=1);
5 5
6use App\Entity\AppMetadata;
7use App\Entity\Page;
8use App\Entity\Node;
9use App\Entity\NodeData;
10use Doctrine\ORM\EntityManager;
11
12class Installation 6class Installation
13{ 7{
14 static public function phpDependancies(): void 8 static public function phpDependancies(): void
15 { 9 {
16 $flag = false; 10 $flag = false;
17 //$extensions = ['pdo_mysql', 'mbstring', 'ctype', 'json', 'tokenizer', 'zip', 'dom']; // les 5 premières sont pour doctrine 11 $extensions = ['pdo_mysql', 'mbstring', 'ctype', 'json', 'tokenizer', 'imagick']; // les 5 premières sont pour doctrine
18 $extensions = ['pdo_mysql', 'mbstring', 'ctype', 'json', 'tokenizer']; 12 // ajouter plus tard zip pour les backup
19 foreach($extensions as $extension){ 13 foreach($extensions as $extension){
20 if(!extension_loaded($extension)) 14 if(!extension_loaded($extension))
21 { 15 {
@@ -23,10 +17,13 @@ class Installation
23 $flag = true; 17 $flag = true;
24 } 18 }
25 } 19 }
26 if(!extension_loaded('imagick') && !extension_loaded('gd')){ 20
21 /*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>"); 22 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; 23 $flag = true;
29 } 24 }*/
25 // si imagick n'est pas disponible, essayer gd (reste encore à coder)
26
30 if($flag){ 27 if($flag){
31 echo '<p>Réalisez les actions nécéssaires sur le serveur ou contactez l\'administrateur du site.<br> 28 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>'; 29 Quand le problème sera résolu, il vous suffira de <a href="#">recharger la page<a>.</p>';
@@ -70,140 +67,4 @@ class Installation
70 // le test de connexion à la BDD est dans le doctrine bootstrap 67 // le test de connexion à la BDD est dans le doctrine bootstrap
71 } 68 }
72 } 69 }
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 70} \ No newline at end of file