aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2025-08-27 16:08:29 +0200
committerpolo <ordipolo@gmx.fr>2025-08-27 16:08:29 +0200
commite642cd51d7e8599537f8514bef8d5d16096dddf8 (patch)
treeb9ad8356fe8b572f6271ef5016d599d0768e9a65
parent6c28cf85e1b5921e4fb77be230651bc22e83b801 (diff)
downloadcms-e642cd51d7e8599537f8514bef8d5d16096dddf8.zip
optimisation UserController::existUsers, gestion des $response par le routeur, erreur article déjà supprimé
-rw-r--r--public/index.php23
-rw-r--r--public/js/tinymce.js2
-rw-r--r--src/controller/ArticleController.php6
-rw-r--r--src/controller/CalendarController.php3
-rw-r--r--src/controller/UserController.php10
-rw-r--r--src/router.php149
-rw-r--r--src/view/NewsBlockBuilder.php2
-rw-r--r--src/view/PostBlockBuilder.php5
8 files changed, 114 insertions, 86 deletions
diff --git a/public/index.php b/public/index.php
index 89bb203..6149f7a 100644
--- a/public/index.php
+++ b/public/index.php
@@ -1,15 +1,20 @@
1<?php 1<?php
2// public/index/php 2// public/index/php
3 3
4/* plan d'action pour symfonyfier le site 4/* plan d'action pour "symfonyfier" le site
51/ intégrer les classes Request et Response sans changer modifier les liens 5A -
62/ méthodes HTTP: GET, HEAD, POST, PUT, PATCH, DELETE, etc, pour un pré-routage (légères modifications des liens) 6 1/ de vrais contrôleurs: classes et méthodes prenant une requête en entrée et retournant une réponse
73/ passer à des chemins modernes "ciblant des ressources" genre /chemin/de/la/page 7 (début de séparation contrôleurs et classes métier, exemple: ViewController/Director)
8 le mode modification de page doit thérioquement être appelé comme ça: /chemin/de/la/page/modif_page 8 2/ routeur structuré: méthodes GET et POST, content-type, admin
9 apparemment, le from=nom_page pour les formulaires ne se fait pas... 9 3/ routeur amélioré: pré-routage avec méthodes HTTP: GET, HEAD, POST, PUT, PATCH, DELETE, etc
104/ utiliser le routeur de symfony: nécéssite que tous les contrôleurs soient des classes avec un namespace 10 4/ réécriture avec les classes Request et Response sans toucher les liens
115/ http-foundation possède aussi une classe Session. intéressant! 11B -
12*/ 12 1/ passer à des chemins modernes "ciblant des ressources" genre /chemin/de/la/page
13 le mode modification de page doit thérioquement être appelé comme ça: /chemin/de/la/page/modif_page
14 apparemment, le from=nom_page pour les formulaires ne se fait pas...
15 2/ utiliser le routeur de symfony: nécéssite que tous les contrôleurs soient des classes avec un namespace */
16
17// http-foundation possède aussi une classe Session. intéressant!
13 18
14declare(strict_types=1); 19declare(strict_types=1);
15 20
diff --git a/public/js/tinymce.js b/public/js/tinymce.js
index 29b82bf..f153246 100644
--- a/public/js/tinymce.js
+++ b/public/js/tinymce.js
@@ -145,7 +145,7 @@ function openEditor(id, page = '') {
145 const formData = new FormData(); 145 const formData = new FormData();
146 formData.append("file", blobInfo.blob()); 146 formData.append("file", blobInfo.blob());
147 147
148 fetch("index.php?action=upload_image", { 148 fetch("index.php?action=upload_image_tinymce", {
149 method: "POST", 149 method: "POST",
150 body: formData 150 body: formData
151 }) 151 })
diff --git a/src/controller/ArticleController.php b/src/controller/ArticleController.php
index a982d8c..71bfdc3 100644
--- a/src/controller/ArticleController.php
+++ b/src/controller/ArticleController.php
@@ -101,7 +101,11 @@ class ArticleController
101 static public function deleteArticle(EntityManager $entityManager, array $json): Response 101 static public function deleteArticle(EntityManager $entityManager, array $json): Response
102 { 102 {
103 $director = new Director($entityManager); 103 $director = new Director($entityManager);
104 $director->makeArticleNode($json['id'], true); 104 if(!$director->makeArticleNode($json['id'], true)){
105 return new Response(
106 '{"success": false, "message": "Erreur: pas d\'article à supprimer"}',
107 Response::HTTP_INTERNAL_SERVER_ERROR); // 500
108 }
105 $article = $director->getArticleNode(); 109 $article = $director->getArticleNode();
106 $section = $director->getNode(); 110 $section = $director->getNode();
107 111
diff --git a/src/controller/CalendarController.php b/src/controller/CalendarController.php
index cc37d0f..b60ff11 100644
--- a/src/controller/CalendarController.php
+++ b/src/controller/CalendarController.php
@@ -52,6 +52,7 @@ class CalendarController
52 $entityManager->flush(); 52 $entityManager->flush();
53 53
54 echo json_encode(['success' => true, 'id' => $event->getId()]); 54 echo json_encode(['success' => true, 'id' => $event->getId()]);
55 die;
55 } 56 }
56 static public function updateEvent(array $json, EntityManager $entityManager):void 57 static public function updateEvent(array $json, EntityManager $entityManager):void
57 { 58 {
@@ -67,6 +68,7 @@ class CalendarController
67 $entityManager->flush(); 68 $entityManager->flush();
68 69
69 echo json_encode(['success' => true]); 70 echo json_encode(['success' => true]);
71 die;
70 } 72 }
71 static public function removeEvent(array $json, EntityManager $entityManager):void 73 static public function removeEvent(array $json, EntityManager $entityManager):void
72 { 74 {
@@ -75,5 +77,6 @@ class CalendarController
75 $entityManager->flush(); 77 $entityManager->flush();
76 78
77 echo json_encode(['success' => true]); 79 echo json_encode(['success' => true]);
80 die;
78 } 81 }
79} \ No newline at end of file 82} \ No newline at end of file
diff --git a/src/controller/UserController.php b/src/controller/UserController.php
index 1acb4d5..a35b09e 100644
--- a/src/controller/UserController.php
+++ b/src/controller/UserController.php
@@ -22,14 +22,14 @@ class UserController
22 // account 22 // account
23 static public function existUsers(EntityManager $entityManager): bool 23 static public function existUsers(EntityManager $entityManager): bool
24 { 24 {
25 // optimiser ça si possible, on veut juste savoir si la table est vide ou non 25 $nb_users = $entityManager
26 $users = $entityManager->getRepository(User::class)->findAll(); 26 ->createQuery('SELECT COUNT(u.id_user) FROM App\Entity\User u')
27 27 ->getSingleScalarResult();
28 if(count($users) === 0) // table vide 28
29 if($nb_users === 0) // table vide
29 { 30 {
30 $_SESSION['user'] = ''; 31 $_SESSION['user'] = '';
31 $_SESSION['admin'] = false; 32 $_SESSION['admin'] = false;
32
33 return false; 33 return false;
34 } 34 }
35 else{ 35 else{
diff --git a/src/router.php b/src/router.php
index 8aa0aa9..92dccb6 100644
--- a/src/router.php
+++ b/src/router.php
@@ -39,7 +39,7 @@ if($_SERVER['REQUEST_METHOD'] === 'GET'){
39 } 39 }
40 40
41 // construction d'une page 41 // construction d'une page
42 $response = (new ViewController)->buildView($entityManager, $request); 42 $response = (new ViewController)->buildView($entityManager, $request); // utilise Director
43} 43}
44 44
45 45
@@ -87,25 +87,19 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
87 $data = file_get_contents('php://input'); 87 $data = file_get_contents('php://input');
88 $json = json_decode($data, true); 88 $json = json_decode($data, true);
89 89
90 if(isset($_GET['action'])) 90 if($request->query->has('action'))
91 { 91 {
92 /* -- manipulation des articles -- */ 92 /* -- manipulation des articles -- */
93 if($_GET['action'] === 'editor_submit' && isset($json['id']) && isset($json['content'])) 93 if($_GET['action'] === 'editor_submit' && isset($json['id']) && isset($json['content'])){
94 {
95 ArticleController::editorSubmit($entityManager, $json); 94 ArticleController::editorSubmit($entityManager, $json);
96 } 95 }
97 elseif($_GET['action'] === 'delete_article' && isset($json['id'])){ 96 elseif($_GET['action'] === 'delete_article' && isset($json['id'])){
98 $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX 97 $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX
99 $response->send();
100 die;
101 } 98 }
102 // inversion de la position de deux noeuds 99 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
103 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2']))
104 {
105 ArticleController::switchPositions($entityManager, $json); 100 ArticleController::switchPositions($entityManager, $json);
106 } 101 }
107 elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])) 102 elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])){
108 {
109 ArticleController::dateSubmit($entityManager, $json); 103 ArticleController::dateSubmit($entityManager, $json);
110 } 104 }
111 105
@@ -116,29 +110,54 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
116 elseif($_GET['action'] === 'test_email'){ 110 elseif($_GET['action'] === 'test_email'){
117 ContactFormController::sendTestEmail($entityManager, $json); 111 ContactFormController::sendTestEmail($entityManager, $json);
118 } 112 }
113
114
115 /* -- upload d'image dans tinymce par copier-coller -- */
116 // collage de HTML contenant une ou plusieurs balises <img>
117 elseif($request->query->get('action') === 'upload_image_url'){
118 ImageUploadController::uploadImageHtml();
119 }
120 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
121 elseif($request->query->get('action') === 'upload_image_base64'){
122 ImageUploadController::uploadImageBase64();
123 }
124
125
126 /* -- requêtes spécifiques au calendrier -- */
127 elseif($request->query->get('action') === 'new_event'){
128 CalendarController::newEvent($json, $entityManager);
129 }
130 elseif($request->query->get('action') === 'update_event'){
131 CalendarController::updateEvent($json, $entityManager);
132 }
133 elseif($request->query->get('action') === 'remove_event'){
134 CalendarController::removeEvent($json, $entityManager);
135 }
136 else{
137 echo json_encode(['success' => false]);
138 die;
139 }
119 } 140 }
120 141
142
121 /* -- page Menu et chemins -- */ 143 /* -- page Menu et chemins -- */
122 elseif(isset($_GET['menu_edit'])) 144 elseif(isset($_GET['menu_edit']))
123 { 145 {
124 // récupération des données (serait peut-être mieux dans la classe) 146 // ne suit pas la règle, faire ça dans un contrôleur
125 Director::$menu_data = new Menu($entityManager); 147 Director::$menu_data = new Menu($entityManager); // récupération des données
126 148
127 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions 149 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions
128 if($_GET['menu_edit'] === 'move_one_level_up' && isset($json['id'])){ 150 if($_GET['menu_edit'] === 'move_one_level_up' && isset($json['id'])){
129 MenuAndPathsController::MoveOneLevelUp($entityManager, $json); 151 MenuAndPathsController::MoveOneLevelUp($entityManager, $json);
130 } 152 }
131
132 // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent 153 // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent
133 if($_GET['menu_edit'] === 'move_one_level_down' && isset($json['id'])){ 154 elseif($_GET['menu_edit'] === 'move_one_level_down' && isset($json['id'])){
134 MenuAndPathsController::MoveOneLevelDown($entityManager, $json); 155 MenuAndPathsController::MoveOneLevelDown($entityManager, $json);
135 } 156 }
136 157 elseif($_GET['menu_edit'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
137 if($_GET['menu_edit'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
138 MenuAndPathsController::switchPositions($entityManager, $json); 158 MenuAndPathsController::switchPositions($entityManager, $json);
139 } 159 }
140 160 elseif($_GET['menu_edit'] === 'displayInMenu' && isset($json['id']) && isset($json['checked'])){
141 if($_GET['menu_edit'] === 'displayInMenu' && isset($json['id']) && isset($json['checked'])){
142 MenuAndPathsController::displayInMenu($entityManager, $json); 161 MenuAndPathsController::displayInMenu($entityManager, $json);
143 } 162 }
144 } 163 }
@@ -161,45 +180,18 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
161 elseif($request->query->has('bloc_edit')) 180 elseif($request->query->has('bloc_edit'))
162 { 181 {
163 // renommage d'un bloc 182 // renommage d'un bloc
164 if($request->query->get('bloc_edit') === 'rename_page_bloc') 183 if($request->query->get('bloc_edit') === 'rename_page_bloc'){
165 {
166 PageManagementController::renameBloc($entityManager, $json); 184 PageManagementController::renameBloc($entityManager, $json);
167 } 185 }
168 // inversion des positions de deux blocs 186 // inversion des positions de deux blocs
169 elseif($request->query->get('bloc_edit') === 'switch_blocs_positions') 187 elseif($request->query->get('bloc_edit') === 'switch_blocs_positions'){
170 {
171 PageManagementController::SwitchBlocsPositions($entityManager, $json); 188 PageManagementController::SwitchBlocsPositions($entityManager, $json);
172 } 189 }
173 } 190 }
174
175 /* -- upload d'image dans tinymce par copier-coller -- */
176 // collage de HTML contenant une ou plusieurs balises <img>
177 if($request->query->has('action') && $request->query->get('action') == 'upload_image_html'){
178 ImageUploadController::uploadImageHtml();
179 }
180 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
181 elseif($request->query->has('action') && $request->query->get('action') == 'upload_image_base64'){
182 ImageUploadController::uploadImageBase64();
183 }
184
185 /* -- requêtes spécifiques au calendrier -- */
186 if($request->query->get('action') === 'new_event'){
187 CalendarController::newEvent($json, $entityManager);
188 }
189 elseif($request->query->get('action') === 'update_event'){
190 CalendarController::updateEvent($json, $entityManager);
191 }
192 elseif($request->query->get('action') === 'remove_event'){
193 CalendarController::removeEvent($json, $entityManager);
194 }
195 else{
196 echo json_encode(['success' => false]);
197 }
198 die;
199 } 191 }
200 192
201 // upload d'image dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur) 193 // upload d'image dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur)
202 elseif(strpos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false && $request->query->has('action') && $request->query->get('action') === 'upload_image') 194 elseif(strpos($_SERVER['CONTENT_TYPE'], 'multipart/form-data') !== false && $request->query->has('action') && $request->query->get('action') === 'upload_image_tinymce')
203 { 195 {
204 ImageUploadController::imageUploadTinyMce(); 196 ImageUploadController::imageUploadTinyMce();
205 } 197 }
@@ -207,7 +199,7 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
207 elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') 199 elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
208 { 200 {
209 //echo "requête XMLHttpRequest reçue par le serveur"; 201 //echo "requête XMLHttpRequest reçue par le serveur";
210 echo json_encode(['success' => false]); // ça marche mais ça marche pas... 202 echo json_encode(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR
211 die; 203 die;
212 } 204 }
213 205
@@ -215,14 +207,7 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
215 elseif($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded') 207 elseif($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded')
216 { 208 {
217 if($_GET['action'] === 'delete_article' && isset($_GET['id'])){ 209 if($_GET['action'] === 'delete_article' && isset($_GET['id'])){
218 $response = json_decode(ArticleController::deleteArticle($entityManager, $_GET)->getContent(), true); // version formulaire 210 $response = ArticleController::deleteArticle($entityManager, $_GET); // version formulaire
219 $url = new URL;
220 if(isset($_GET['from'])){
221 $url->addParams(['page' => $_GET['from']]);
222 }
223 $url->addParams(['success' => $response['success'], 'message' => $response['message']]);
224 header('Location: ' . $url);
225 die;
226 } 211 }
227 212
228 /* -- nouvelle page -- */ 213 /* -- nouvelle page -- */
@@ -242,6 +227,7 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
242 PageManagementController::deletePage($entityManager); 227 PageManagementController::deletePage($entityManager);
243 } 228 }
244 229
230
245 /* -- mode Modification d'une page -- */ 231 /* -- mode Modification d'une page -- */
246 232
247 // modification du chemins en snake_case 233 // modification du chemins en snake_case
@@ -294,20 +280,51 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){
294 die; 280 die;
295 } 281 }
296 } 282 }
283 // POST admin ne matchant pas
284 else{
285 echo json_encode(['success' => false]);
286 die;
287 }
288 }
289 // POST non admin ne matchant pas
290 else{
291 echo json_encode(['success' => false]);
292 die;
297 } 293 }
298
299 // rien ne match
300 header("Location: " . new URL);
301 die;
302} 294}
303 295
304 296// méthode inconnue
305else{ 297else{
306 header("Location: " . new URL(['error' => 'tu fais quoi là mec?'])); 298 header("Location: " . new URL(['error' => 'tu fais quoi là mec?']));
307 die; 299 die;
308} 300}
309 301
310// enlever le test isset à terme 302
303
304/* -- utilisation de la réponse -- */
311if(isset($response)){ 305if(isset($response)){
312 $response->send(); 306 if($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded')
313} \ No newline at end of file 307 {
308 $response_data = json_decode(($response)->getContent(), true);
309 $url = new URL;
310 if(isset($_GET['from'])){
311 $url->addParams(['page' => $_GET['from']]);
312 }
313 $url->addParams(['success' => $response_data['success'], 'message' => $response_data['message']]);
314 header('Location: ' . $url);
315 }
316 else{
317 $response->send();
318 }
319}
320else{
321 if($_SERVER['REQUEST_METHOD'] === 'POST' && $_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded')
322 {
323 header("Location: " . new URL(['error' => 'erreur côté serveur']));
324 }
325 else{
326 http_response_code(500);
327 echo "erreur côté serveur";
328 }
329}
330//die; // inutile normalement \ No newline at end of file
diff --git a/src/view/NewsBlockBuilder.php b/src/view/NewsBlockBuilder.php
index e449c7a..6b54196 100644
--- a/src/view/NewsBlockBuilder.php
+++ b/src/view/NewsBlockBuilder.php
@@ -23,7 +23,7 @@ class NewsBlockBuilder extends AbstractBuilder
23 23
24 $presentation = $node->getNodeData()->getPresentation()->getName(); // affichage list ou grid 24 $presentation = $node->getNodeData()->getPresentation()->getName(); // affichage list ou grid
25 25
26 // exécution de la stratégie (utilisation d'une méthode ou d'une classe) 26 // exécution de la stratégie (utilisation de méthodes ou de classe List, Grid, CarouselPresentation)
27 $section_class = $presentation; 27 $section_class = $presentation;
28 $section_child_class = $presentation === 'grid' ? 'grid_columns' : ''; 28 $section_child_class = $presentation === 'grid' ? 'grid_columns' : '';
29 29
diff --git a/src/view/PostBlockBuilder.php b/src/view/PostBlockBuilder.php
index fadae31..6ec91f7 100644
--- a/src/view/PostBlockBuilder.php
+++ b/src/view/PostBlockBuilder.php
@@ -12,8 +12,7 @@ class PostBlockBuilder extends AbstractBuilder
12 parent::__construct($node); 12 parent::__construct($node);
13 13
14 // à remplacer par list.php/grid.php (une vue par stratégie) le jour ou ou a besoin de les différencier 14 // à remplacer par list.php/grid.php (une vue par stratégie) le jour ou ou a besoin de les différencier
15 //$viewFile = self::VIEWS_PATH . $node->getName() . '.php'; 15 $viewFile = self::VIEWS_PATH . $node->getName() . '.php'; // = post_block.php, actuellement identique à news_block.php
16 $viewFile = self::VIEWS_PATH . 'post_block.php'; // actuellement identique à news_block.php
17 16
18 if(file_exists($viewFile)) 17 if(file_exists($viewFile))
19 { 18 {
@@ -24,7 +23,7 @@ class PostBlockBuilder extends AbstractBuilder
24 23
25 $presentation = $node->getNodeData()->getPresentation()->getName(); // affichage list ou grid 24 $presentation = $node->getNodeData()->getPresentation()->getName(); // affichage list ou grid
26 25
27 // exécution de la stratégie (utilisation d'une méthode ou d'une classe) 26 // exécution de la stratégie (utilisation de méthodes ou de classe List, Grid, CarouselPresentation)
28 $section_class = $presentation; 27 $section_class = $presentation;
29 $section_child_class = $presentation === 'grid' ? 'grid_columns' : ''; 28 $section_child_class = $presentation === 'grid' ? 'grid_columns' : '';
30 29