aboutsummaryrefslogtreecommitdiff
path: root/src/service/Router.php
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/service/Router.php
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/service/Router.php')
-rw-r--r--src/service/Router.php376
1 files changed, 0 insertions, 376 deletions
diff --git a/src/service/Router.php b/src/service/Router.php
deleted file mode 100644
index 28a6c39..0000000
--- a/src/service/Router.php
+++ /dev/null
@@ -1,376 +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:
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/* classes de réponses pour les contrôleurs
14Response($html, Response::HTTP_OK) page html
15JsonResponse(['success' => true, 'data' => $data]) ajax
16RedirectResponse('index.php?page=login') redirection
17BinaryFileResponse($filePath) téléchargement
18StreamedResponse(function () {echo "ligne 1\n";echo "ligne 2\n";}) gros fichier */
19
20// relire ça à l'occaz:
21// https://symfony.com/doc/current/introduction/from_flat_php_to_symfony.html
22
23declare(strict_types=1);
24
25use Symfony\Component\HttpFoundation\Request;
26use Doctrine\ORM\EntityManager;
27use Symfony\Component\HttpFoundation\JsonResponse;
28use Symfony\Component\HttpFoundation\RedirectResponse;
29use Symfony\Component\HttpFoundation\Response;
30
31class Router{
32 private Request $request;
33 private EntityManager $entityManager;
34 private string $route = ''; // défaut page d'accueil
35
36 public function __construct(Request $request, EntityManager $entityManager){
37 $this->request = $request;
38 $this->entityManager = $entityManager;
39
40 if(!User::existUsers($entityManager)){ // table "user" vide
41 $this->route = 'no_user';
42 }
43 }
44
45 public function dispatch(): Response
46 {
47 if($this->request->getMethod() === 'GET'){
48 // table "user" vide
49 if($this->route === 'no_user'){
50 ob_start();
51 require AbstractBuilder::VIEWS_PATH . 'user_create.php';
52 return new Response(ob_get_clean());
53 }
54
55 // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là)
56 if($this->request->query->get('action') === 'deconnection'){
57 return UserController::disconnect(); // retourne un RedirectResponse
58 }
59
60 // articles suivants
61 if($this->request->query->get('fetch') === 'next_articles'){
62 return ArticleController::fetch($this->entityManager, $this->request); // retourne un JsonResponse
63 }
64
65 // données du calendrier
66 // création du calendrier ou changement de dates affichées (boutons flèches mais pas changement de vue)
67 if($this->request->query->get('action') === 'get_events'
68 && $this->request->query->has('start') && $this->request->query->has('end') && empty($this->request->getPayload()->all())){ // getPayload ne récupère pas que des POST
69 return CalendarController::getData($this->entityManager);
70 }
71
72 // pages interdites
73 if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails', 'maintenance'])){
74 return new RedirectResponse((string)new URL);
75 }
76
77 if(IS_ADMIN){
78 if($this->request->query->get('action') === 'get_mysqldump'){
79 return MaintenanceController::getLastDump($this->entityManager);
80 }
81 if($this->request->query->get('action') === 'get_all_media'){
82 return MaintenanceController::getAllMedia();
83 }
84 }
85
86 // affichage d'une page
87 return ViewController::getWebPage($this->entityManager, $this->request);
88 }
89
90
91 elseif($this->request->getMethod() === 'POST'){
92 /* -- contrôleurs appelables par tout le monde -- */
93
94 // table "user" vide
95 if($this->route === 'no_user'){
96 return UserController::createAdminUser($this->entityManager);
97 }
98
99 // requête JSON avec fetch()
100 if($this->request->headers->get('Content-Type') === 'application/json')
101 {
102 $json = json_decode($this->request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
103
104 // formulaire de contact
105 if($this->request->query->get('action') === 'send_email'){
106 return ContactFormController::sendVisitorEmail($this->entityManager, $json);
107 }
108 /*else{
109 return new JsonResponse(['success' => false, 'error' => 'tu fais quoi là mec?'], JsonResponse::HTTP_BAD_REQUEST);
110 }*/
111 }
112
113 // envoi formulaire HTML
114 elseif($this->request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
115 // tentative de connexion
116 if($this->request->query->get('action') === 'connection'){
117 return UserController::connect($this->entityManager);
118 }
119 /*else{
120 return new RedirectResponse((string)new URL(['error' => 'tu fais quoi là mec?']));
121 }*/
122 }
123
124 if(IS_ADMIN){
125 /* -- requêtes AJAX -- */
126
127 // requêtes JSON avec fetch()
128 if($this->request->headers->get('Content-Type') === 'application/json'){
129 $json = json_decode($this->request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
130
131 if($this->request->query->has('action')){
132 /* -- manipulation des articles -- */
133 if($this->request->query->get('action') === 'editor_submit' && isset($json['id']) && isset($json['content'])){
134 return ArticleController::editorSubmit($this->entityManager, $json);
135 }
136 elseif($this->request->query->get('action') === 'delete_article' && isset($json['id'])){
137 return ArticleController::deleteArticle($this->entityManager, $this->request); // version AJAX
138 }
139 elseif($this->request->query->get('action') === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
140 return ArticleController::switchPositions($this->entityManager, $json);
141 }
142 elseif($this->request->query->get('action') === 'date_submit' && isset($json['id']) && isset($json['date'])){
143 return ArticleController::dateSubmit($this->entityManager, $json);
144 }
145
146 switch($this->request->query->get('action')){
147 /* -- bloc Formulaire -- */
148 case 'keep_emails':
149 return ContactFormController::keepEmails($this->entityManager, $json);
150 case 'set_retention_period':
151 return ContactFormController::setEmailsRetentionPeriod($this->entityManager, $json);
152 case 'set_email_param':
153 return ContactFormController::setEmailParam($this->entityManager, $json);
154 case 'test_email':
155 return ContactFormController::sendTestEmail($this->entityManager, $json);
156
157 /* -- page emails -- */
158 case 'delete_email':
159 return ContactFormController::deleteEmail($this->entityManager, $json);
160 case 'toggle_sensitive_email':
161 return ContactFormController::toggleSensitiveEmail($this->entityManager, $json);
162
163 /* -- upload d'image dans tinymce par copier-coller -- */
164 // collage de HTML contenant une ou plusieurs balises <img>
165 case 'upload_image_url':
166 return ImageUploadController::uploadImageHtml();
167 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
168 case 'upload_image_base64':
169 return ImageUploadController::uploadImageBase64();
170
171 /* -- requêtes spécifiques au calendrier -- */
172 case 'new_event':
173 return CalendarController::newEvent($json, $this->entityManager);
174 case 'update_event':
175 return CalendarController::updateEvent($json, $this->entityManager);
176 case 'remove_event':
177 return CalendarController::removeEvent($json, $this->entityManager);
178
179 /* -- mode maintenance -- */
180 case 'get_logs':
181 return MaintenanceController::getLogs($this->entityManager);
182 case 'erase_logs':
183 return MaintenanceController::eraseLogs($this->entityManager);
184
185 default:
186 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST);
187 }
188 }
189
190 /* -- site entier (header, footer, favicon) -- */
191 elseif($this->request->query->has('head_foot_text')){
192 return HeadFootController::setTextData($this->entityManager, $this->request->query->get('head_foot_text'), $json);
193 }
194 elseif($this->request->query->has('head_foot_social_check')){
195 return HeadFootController::displaySocialNetwork($this->entityManager, $this->request->query->get('head_foot_social_check'), $json);
196 }
197
198 /* -- page Menu et chemins -- */
199 elseif($this->request->query->has('menu_edit')){
200 // ne suit pas la règle, faire ça dans un contrôleur?
201 Model::$menu = new Menu($this->entityManager); // récupération des données
202
203 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions
204 if($this->request->query->get('menu_edit') === 'move_one_level_up' && isset($json['id'])){
205 return MenuAndPathsController::MoveOneLevelUp($this->entityManager, $json);
206 }
207 // flèche droite =>: position (léments de a fraterie + 1, l'élément précédent devient le parent
208 elseif($this->request->query->get('menu_edit') === 'move_one_level_down' && isset($json['id'])){
209 return MenuAndPathsController::MoveOneLevelDown($this->entityManager, $json);
210 }
211 elseif($this->request->query->get('menu_edit') === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
212 return MenuAndPathsController::switchPositions($this->entityManager, $json);
213 }
214 elseif($this->request->query->get('menu_edit') === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){
215 return MenuAndPathsController::displayInMenu($this->entityManager, $json);
216 }
217 elseif($this->request->query->get('menu_edit') === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){
218 return MenuAndPathsController::editUrl($this->entityManager, $json);
219 }
220 else{
221 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
222 }
223 }
224
225 /* -- mode Modification d'une page -- */
226 // partie "page"
227 elseif($this->request->query->has('page_edit')){
228 switch($this->request->query->get('page_edit')){
229 case 'page_title':
230 return PageManagementController::setPageTitle($this->entityManager, $json);
231 case 'page_description':
232 return PageManagementController::setPageDescription($this->entityManager, $json);
233 default:
234 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
235 }
236 }
237
238 // partie "blocs"
239 elseif($this->request->query->has('bloc_edit')){
240 switch($this->request->query->get('bloc_edit')){
241 case 'rename_page_bloc':
242 return PageManagementController::renameBloc($this->entityManager, $json);
243 case 'switch_blocs_positions':
244 return PageManagementController::SwitchBlocsPositions($this->entityManager, $json, $this->request->query->get('page'));
245 case 'change_articles_order':
246 return PageManagementController::changeArticlesOrder($this->entityManager, $json);
247 case 'change_presentation':
248 return PageManagementController::changePresentation($this->entityManager, $json);
249 case 'change_cols_min_width':
250 return PageManagementController::changeColsMinWidth($this->entityManager, $json);
251 case 'change_pagination_limit':
252 return PageManagementController::changePaginationLimit($this->entityManager, $json);
253 default:
254 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
255 }
256 }
257
258 else{
259 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
260 }
261 }
262
263 /* -- upload avec FormData OU formulaire HTML avec fichier -- */
264 elseif(str_starts_with($this->request->headers->get('Content-Type'), 'multipart/form-data')){ // = $_SERVER['CONTENT_TYPE']
265 // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer)
266 if($this->request->query->get('action') === 'upload_image_tinymce'){
267 return ImageUploadController::imageUploadTinyMce();
268 }
269 // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64
270 elseif($this->request->query->get('action') === 'upload_file_tinymce'){
271 return FileUploadController::fileUploadTinyMce();
272 }
273 elseif($this->request->query->has('head_foot_image')){
274 return HeadFootController::uploadAsset($this->entityManager, $this->request->query->get('head_foot_image'));
275 }
276
277 /* -- page Maintenance -- */
278 elseif($this->request->query->get('action') === 'restore_database' && $this->request->request->get('hidden') === ''
279 && $this->request->files->has('uploaded_sql')){
280 return MaintenanceController::downloadSQL($entityManager, $request);
281 }
282 else{
283 // choix ici entre répondre en JSON ou par une redirection, choix du JSON pour pouvoir passer un message
284 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
285 }
286 }
287
288 /* -- formulaire HTML sans fichier -- */
289 elseif($this->request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
290 if($this->request->query->get('action') === 'delete_article' && $this->request->query->has('id')){
291 return ArticleController::deleteArticle($this->entityManager, $this->request); // version formulaire
292 }
293
294 /* -- nouvelle page -- */
295 elseif($this->request->request->get('page_name') !== null
296 && $this->request->request->get('page_name_path') !== null
297 && $this->request->request->get('page_location') !== null
298 && $this->request->request->get('page_description') !== null
299 && $this->request->request->get('new_page_hidden') === ''){
300 return PageManagementController::newPage($this->entityManager, $this->request->request);
301 }
302
303 /* -- suppression d'une page -- */
304 elseif($this->request->request->get('page_id') !== null
305 && $this->request->request->get('submit_hidden') === ''){
306 return PageManagementController::deletePage($this->entityManager, $this->request->request->get('page_id'));
307 }
308
309
310 /* -- mode Modification d'une page -- */
311 // modification du chemins en snake_case
312 elseif($this->request->request->get('page_menu_path') !== null
313 && $this->request->request->get('page_id') !== null
314 && $this->request->request->get('page_name_path_hidden') === ''){
315 return PageManagementController::updatePageMenuPath($this->entityManager, $this->request->request->get('page_menu_path'));
316 }
317 // ajout d'un bloc dans une page
318 elseif($this->request->request->get('bloc_title') !== null
319 && $this->request->request->get('bloc_select') !== null
320 && $this->request->request->get('bloc_title_hidden') === ''){ // contrôle anti-robot avec input hidden
321 return PageManagementController::addBloc($this->entityManager, $this->request);
322 }
323 // suppression d'un bloc de page
324 elseif($this->request->request->get('delete_bloc_id') !== null
325 && $this->request->request->get('delete_bloc_hidden') === ''){ // contrôle anti-robot avec input hidden
326 return PageManagementController::deleteBloc($this->entityManager, $this->request);
327 }
328
329
330 /* -- page Menu et chemins -- */
331 // création d'une entrée de menu avec une URL
332 elseif($this->request->request->has("label_input") && $this->request->request->has("url_input") && $this->request->request->has("location")){
333 return MenuAndPathsController::newUrlMenuEntry($this->entityManager);
334 }
335 // suppression d'une entrée de menu avec une URL
336 elseif($this->request->request->has('delete') && $this->request->request->has('x') && $this->request->request->has('y')){ // 2 params x et y sont là parce qu'on a cliqué sur une image
337 return MenuAndPathsController::deleteUrlMenuEntry($this->entityManager);
338 }
339
340
341 /* -- page Mon compte -- */
342 elseif($this->request->query->get('action') === 'update_username'){
343 return UserController::updateUsername($this->entityManager);
344 }
345 elseif($this->request->query->get('action') === 'update_password'){
346 return UserController::updatePassword($this->entityManager);
347 }
348
349 /* -- page Maintenance -- */
350 elseif($this->request->query->get('action') === 'restore_database' && $this->request->get('hidden') === '' && $this->request->request->has('selected_sql')){
351 return MaintenanceController::handleBackupSelection($this->entityManager, $this->request);
352 }
353
354 // redirection page d'accueil
355 return new RedirectResponse((string)new URL(['error' => 'paramètres inconnus']));
356 }
357
358 // requêtes XMLHttpRequest
359 elseif($this->request->isXmlHttpRequest()){
360 return new JsonResponse(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR
361 }
362
363 // POST admin ne matchant pas
364 return new Response('bad parameters', Response::HTTP_BAD_REQUEST); // code 400
365 }
366
367 // POST non-admin ne matchant pas
368 return new Response('bad parameters', Response::HTTP_BAD_REQUEST); // code 400
369 }
370
371 // méthode HTTP inconnue
372 else{
373 return new RedirectResponse((string)new URL(['error' => 'tu fais quoi là mec?']));
374 }
375 }
376} \ No newline at end of file