aboutsummaryrefslogtreecommitdiff
path: root/src/service/router.php
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-06-06 00:32:43 +0200
committerpolo <ordipolo@gmx.fr>2026-06-06 00:32:43 +0200
commit3988f3eb48bafb36b370eecc75a87e804f57c09d (patch)
tree8c0afd691eaa3f6985681f0793d898e56a7a57c8 /src/service/router.php
parent2c6070444b6cf79908653e776d6e4464cd6a5ac9 (diff)
downloadcms-3988f3eb48bafb36b370eecc75a87e804f57c09d.tar.gz
cms-3988f3eb48bafb36b370eecc75a87e804f57c09d.tar.bz2
cms-3988f3eb48bafb36b370eecc75a87e804f57c09d.zip
classe Router, flash errors récupérées dans ViewDirector, exceptions buggées, utilisation de Response à certains endroits
Diffstat (limited to 'src/service/router.php')
-rw-r--r--src/service/router.php441
1 files changed, 0 insertions, 441 deletions
diff --git a/src/service/router.php b/src/service/router.php
deleted file mode 100644
index b3ce16e..0000000
--- a/src/service/router.php
+++ /dev/null
@@ -1,441 +0,0 @@
1<?php
2// src/service/router.php
3//
4/* fonctionnement:
5=> 1er test, méthode http GET? POST?
6=> 2ème test, type de contenu (méthode POST uniquement):
7"application/x-www-form-urlencoded" = formulaire
8"application/json" = requête AJAX avec fetch()
9"multipart/form-data" = upload d'image par tinymce
10$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' requête AJAX xhs, non utilisée
11=> 3ème test, comme le 2ème test mais uniquement si IS_ADMIN est vrai
12*/
13
14declare(strict_types=1);
15
16if($request->getMethod() === 'GET'){
17 // table "user" vide
18 if(!UserController::existUsers($entityManager)){
19 require AbstractBuilder::VIEWS_PATH . 'user_create.php';
20 die;
21 }
22
23 // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là)
24 if($request->query->has('action') && $request->query->get('action') === 'deconnection'){
25 UserController::disconnect($entityManager);
26 }
27
28 // articles suivants
29 if($request->query->has('fetch') && $request->query->get('fetch') === 'next_articles'){
30 ArticleController::fetch($entityManager, $request);
31 }
32
33 // données du calendrier
34 // création du calendrier et changement de dates affichées (boutons flèches mais pas changement de vue)
35 if($request->query->has('action') && $request->query->get('action') === 'get_events'
36 && $request->query->has('start') && $request->query->has('end') && empty($request->getPayload()->all())) // getPayload ne récupère pas que des POST
37 {
38 CalendarController::getData($entityManager);
39 }
40
41 // pages interdites
42 if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails', 'maintenance'])){
43 header('Location: ' . new URL);
44 die;
45 }
46
47 if(IS_ADMIN){
48 if($request->query->has('action') && $request->query->get('action') === 'get_mysqldump'){
49 MaintenanceController::getLastDump($entityManager);
50 die;
51 }
52 if($request->query->has('action') && $request->query->get('action') === 'get_all_media'){
53 MaintenanceController::getAllMedia();
54 die;
55 }
56 }
57
58 // construction d'une page
59 $response = (new ViewDirector)->buildView($entityManager, $request); // utilise Model
60 // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4
61}
62
63
64elseif($request->getMethod() === 'POST'){
65 /* -- contrôleurs appellables par tout le monde -- */
66
67 // table "user" vide
68 if(!UserController::existUsers($entityManager)){
69 UserController::createAdminUser($entityManager);
70 }
71
72 // requêtes JSON avec fetch()
73 if($request->headers->get('Content-Type') === 'application/json')
74 {
75 $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
76
77 if(isset($_GET['action']))
78 {
79 // formulaire de contact
80 if($_GET['action'] === 'send_email'){
81 ContactFormController::sendVisitorEmail($entityManager, $json);
82 }
83 }
84 }
85
86 // envoi formulaire HTML
87 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
88 // tentative de connexion
89 if($request->query->has('action') && $request->query->get('action') === 'connection'){
90 //$response =
91 UserController::connect($entityManager);
92 }
93 }
94
95 if(IS_ADMIN)
96 {
97 /* -- requêtes AJAX -- */
98
99 // requêtes JSON avec fetch()
100 if($request->headers->get('Content-Type') === 'application/json')
101 {
102 $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
103
104 if($request->query->has('action'))
105 {
106 /* -- manipulation des articles -- */
107 if($_GET['action'] === 'editor_submit' && isset($json['id']) && isset($json['content'])){
108 ArticleController::editorSubmit($entityManager, $json);
109 }
110 elseif($_GET['action'] === 'delete_article' && isset($json['id'])){
111 $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX
112 }
113 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
114 ArticleController::switchPositions($entityManager, $json);
115 }
116 elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])){
117 ArticleController::dateSubmit($entityManager, $json);
118 }
119
120 /* -- bloc Formulaire -- */
121 elseif($_GET['action'] === 'keep_emails'){
122 ContactFormController::keepEmails($entityManager, $json);
123 }
124 elseif($_GET['action'] === 'set_retention_period'){
125 ContactFormController::setEmailsRetentionPeriod($entityManager, $json);
126 }
127 elseif($_GET['action'] === 'set_email_param'){
128 ContactFormController::setEmailParam($entityManager, $json);
129 }
130 elseif($_GET['action'] === 'test_email'){
131 ContactFormController::sendTestEmail($entityManager, $json);
132 }
133
134 /* -- page emails -- */
135 elseif($_GET['action'] === 'delete_email'){
136 ContactFormController::deleteEmail($entityManager, $json);
137 }
138 elseif($_GET['action'] === 'toggle_sensitive_email'){
139 ContactFormController::toggleSensitiveEmail($entityManager, $json);
140 }
141
142 /* -- upload d'image dans tinymce par copier-coller -- */
143 // collage de HTML contenant une ou plusieurs balises <img>
144 elseif($request->query->get('action') === 'upload_image_url'){
145 ImageUploadController::uploadImageHtml();
146 }
147 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
148 elseif($request->query->get('action') === 'upload_image_base64'){
149 ImageUploadController::uploadImageBase64();
150 }
151
152
153 /* -- requêtes spécifiques au calendrier -- */
154 elseif($request->query->get('action') === 'new_event'){
155 CalendarController::newEvent($json, $entityManager);
156 }
157 elseif($request->query->get('action') === 'update_event'){
158 CalendarController::updateEvent($json, $entityManager);
159 }
160 elseif($request->query->get('action') === 'remove_event'){
161 CalendarController::removeEvent($json, $entityManager);
162 }
163
164 /* -- mode maintenance -- */
165 elseif($request->query->get('action') === 'get_logs'){
166 MaintenanceController::getLogs($entityManager);
167 die;
168 }
169 elseif($request->query->get('action') === 'erase_logs'){
170 MaintenanceController::eraseLogs($entityManager);
171 die;
172 }
173 else{
174 echo json_encode(['success' => false]);
175 die;
176 }
177 }
178
179 /* -- site entier (header, footer, favicon) -- */
180 elseif($request->query->has('head_foot_text')){
181 HeadFootController::setTextData($entityManager, $request->query->get('head_foot_text'), $json);
182 }
183 elseif($request->query->has('head_foot_social_check')){
184 HeadFootController::displaySocialNetwork($entityManager, $request->query->get('head_foot_social_check'), $json);
185 }
186
187 /* -- page Menu et chemins -- */
188 elseif(isset($_GET['menu_edit']))
189 {
190 // ne suit pas la règle, faire ça dans un contrôleur?
191 Model::$menu = new Menu($entityManager); // récupération des données
192
193 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions
194 if($_GET['menu_edit'] === 'move_one_level_up' && isset($json['id'])){
195 MenuAndPathsController::MoveOneLevelUp($entityManager, $json);
196 }
197 // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent
198 elseif($_GET['menu_edit'] === 'move_one_level_down' && isset($json['id'])){
199 MenuAndPathsController::MoveOneLevelDown($entityManager, $json);
200 }
201 elseif($_GET['menu_edit'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
202 MenuAndPathsController::switchPositions($entityManager, $json);
203 }
204 elseif($_GET['menu_edit'] === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){
205 MenuAndPathsController::displayInMenu($entityManager, $json);
206 }
207 elseif($_GET['menu_edit'] === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){
208 MenuAndPathsController::editUrl($entityManager, $json);
209 }
210 }
211
212 /* -- mode Modification d'une page -- */
213 // partie "page"
214 elseif(isset($_GET['page_edit']))
215 {
216 // titre de la page
217 if($_GET['page_edit'] === 'page_title'){
218 PageManagementController::setPageTitle($entityManager, $json);
219 }
220 // description dans les métadonnées
221 elseif($_GET['page_edit'] === 'page_description'){
222 PageManagementController::setPageDescription($entityManager, $json);
223 }
224 }
225
226 // partie "blocs"
227 elseif($request->query->has('bloc_edit'))
228 {
229 if($request->query->get('bloc_edit') === 'rename_page_bloc'){
230 PageManagementController::renameBloc($entityManager, $json);
231 }
232 elseif($request->query->get('bloc_edit') === 'switch_blocs_positions'){
233 PageManagementController::SwitchBlocsPositions($entityManager, $json);
234 }
235 elseif($request->query->get('bloc_edit') === 'change_articles_order'){
236 PageManagementController::changeArticlesOrder($entityManager, $json);
237 }
238 elseif($request->query->get('bloc_edit') === 'change_presentation'){
239 PageManagementController::changePresentation($entityManager, $json);
240 }
241 elseif($request->query->get('bloc_edit') === 'change_cols_min_width'){
242 PageManagementController::changeColsMinWidth($entityManager, $json);
243 }
244 elseif($request->query->get('bloc_edit') === 'change_pagination_limit'){
245 PageManagementController::changePaginationLimit($entityManager, $json);
246 }
247 }
248 }
249
250 /* -- upload avec FormData OU formulaire HTML AVEC fichier -- */
251 elseif(str_starts_with($request->headers->get('Content-Type'), 'multipart/form-data')) // = $_SERVER['CONTENT_TYPE']
252 {
253 // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer)
254 if($request->query->has('action') && $request->query->get('action') === 'upload_image_tinymce'){
255 ImageUploadController::imageUploadTinyMce();
256 }
257 // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64
258 elseif($request->query->has('action') && $request->query->get('action') === 'upload_file_tinymce'){
259 FileUploadController::fileUploadTinyMce();
260 }
261 elseif($request->query->has('head_foot_image')){
262 HeadFootController::uploadAsset($entityManager, $request->query->get('head_foot_image'));
263 }
264
265 /* -- page Maintenance -- */
266 elseif($request->query->has('action') && $request->query->get('action') === 'restore_database'
267 && $request->request->has('hidden') && $request->get('hidden') === ''
268 && $request->files->has('uploaded_sql'))
269 {
270 $url = new URL;
271 if($request->query->has('from')){
272 $url->addParams(['page' => $request->query->get('from')]);
273 }
274
275 try{
276 MaintenanceController::downloadSQL($entityManager, $request->files->get('uploaded_sql'));
277 $url->addParams(['database_restauration' => 'successful']);
278 }
279 catch(Exception $e){
280 $url->addParams(['database_restauration' => $e->getMessage()]);
281 }
282
283 header('Location: ' . $url);
284 die;
285 }
286 }
287
288 // requêtes XMLHttpRequest
289 elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
290 {
291 echo json_encode(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR
292 die;
293 }
294
295 /* -- formulaire HTML SANS fichier -- */
296 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded')
297 {
298 if($request->query->has('action') && $request->query->get('action') === 'delete_article' && isset($_GET['id'])){
299 $response = ArticleController::deleteArticle($entityManager, $_GET); // version formulaire
300 }
301
302 /* -- nouvelle page -- */
303 elseif(isset($_POST['page_name']) && $_POST['page_name'] !== null
304 && isset($_POST['page_name_path']) && $_POST['page_name_path'] !== null
305 && isset($_POST['page_location']) && $_POST['page_location'] !== null
306 && isset($_POST['page_description']) && $_POST['page_description'] !== null
307 && isset($_POST['new_page_hidden']) && $_POST['new_page_hidden'] === '')
308 {
309 PageManagementController::newPage($entityManager, $_POST);
310 }
311
312 /* -- suppression d'une page -- */
313 elseif(isset($_POST['page_id']) && $_POST['page_id'] !== null
314 && isset($_POST['submit_hidden']) && $_POST['submit_hidden'] === '')
315 {
316 PageManagementController::deletePage($entityManager);
317 }
318
319
320 /* -- mode Modification d'une page -- */
321 // modification du chemins en snake_case
322 elseif(isset($_POST['page_menu_path']) && $_POST['page_menu_path'] !== null
323 && isset($_POST['page_id']) && $_POST['page_id'] !== null
324 && isset($_POST['page_name_path_hidden']) && $_POST['page_name_path_hidden'] === '')
325 {
326 PageManagementController::updatePageMenuPath($entityManager);
327 }
328 // ajout d'un bloc dans une page
329 elseif(isset($_POST['bloc_title']) && $_POST['bloc_title'] !== null
330 && isset($_POST['bloc_select']) && $_POST['bloc_select'] !== null
331 && isset($_POST['bloc_title_hidden']) && $_POST['bloc_title_hidden'] === '') // contrôle anti-robot avec input hidden
332 {
333 PageManagementController::addBloc($entityManager);
334 }
335 // suppression d'un bloc de page
336 elseif(isset($_POST['delete_bloc_id']) && $_POST['delete_bloc_id'] !== null
337 && isset($_POST['delete_bloc_hidden']) && $_POST['delete_bloc_hidden'] === '') // contrôle anti-robot avec input hidden
338 {
339 PageManagementController::deleteBloc($entityManager);
340 }
341
342
343 /* -- page Menu et chemins -- */
344 // création d'une entrée de menu avec une URL
345 elseif(isset($_POST["label_input"]) && isset($_POST["url_input"]) && isset($_POST["location"])){
346 MenuAndPathsController::newUrlMenuEntry($entityManager);
347 }
348 // suppression d'une entrée de menu avec une URL
349 elseif(isset($_POST['delete']) && isset($_POST['x']) && isset($_POST['y'])){ // 2 params x et y sont là parce qu'on a cliqué sur une image
350 MenuAndPathsController::deleteUrlMenuEntry($entityManager);
351 }
352
353
354 /* -- page Mon compte -- */
355 elseif($request->query->has('action') && $request->query->get('action') === 'update_username')
356 {
357 UserController::updateUsername($entityManager);
358 }
359 elseif($request->query->has('action') && $request->query->get('action') === 'update_password')
360 {
361 UserController::updatePassword($entityManager);
362 }
363
364 /* -- page Maintenance -- */
365 elseif($request->query->has('action') && $request->query->get('action') === 'restore_database'
366 && $request->request->has('hidden') && $request->get('hidden') === ''
367 && $request->request->has('selected_sql'))
368 {
369 $url = new URL;
370 if($request->query->has('from')){
371 $url->addParams(['page' => $request->query->get('from')]);
372 }
373
374 try{
375 MaintenanceController::handleBackupSelection($entityManager, $request->request->get('selected_sql'));
376 $url->addParams(['database_restauration' => 'successful']);
377 }
378 catch(Exception $e){
379 $url->addParams(['database_restauration' => $e->getMessage()]);
380 }
381
382 header('Location: ' . $url);
383 die;
384 }
385
386 // redirection page d'accueil
387 else{
388 header("Location: " . new URL(['error' => 'paramètres inconnus']));
389 die;
390 }
391 }
392
393 // POST admin ne matchant pas
394 else{
395 echo json_encode(['success' => false]);
396 die;
397 }
398 }
399 // POST non admin ne matchant pas
400 else{
401 echo json_encode(['success' => false]);
402 die;
403 }
404}
405
406// méthode inconnue
407else{
408 header("Location: " . new URL(['error' => 'tu fais quoi là mec?']));
409 die;
410}
411
412
413
414/* -- utilisation de la réponse -- */
415if(isset($response)){
416 // cas gérés (d'autres sont à prévoir): mauvais id de la page article, accès page création d'article sans être admin
417 if($request->isMethod('GET') && $response->getStatusCode() == 302){ // 302 redirection temporaire
418 header('Location: ' . new URL(['page' => $_GET['from'] ?? '']));
419 }
420 // redirection après traitement de formulaires HTTP
421 elseif($request->getMethod() === 'POST' && $request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
422 $response_data = json_decode(($response)->getContent(), true);
423 $url = new URL(['page' => $_GET['from'] ?? '']);
424 $url->addParams(['success' => $response_data['success'], 'message' => $response_data['message']]);
425 header('Location: ' . $url);
426 }
427 // affichage d'une page OU requête AJAX
428 else{
429 $response->send();
430 }
431}
432// pas utilisation de RESPONSE (cas destiné à disparaître)
433else{
434 if($request->getMethod() === 'POST' && $request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
435 header("Location: " . new URL(['error' => 'erreur côté serveur']));
436 }
437 else{
438 http_response_code(500);
439 echo "erreur côté serveur";
440 }
441} \ No newline at end of file