aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2026-06-10 20:56:25 +0200
committerpolo <ordipolo@gmx.fr>2026-06-10 20:56:25 +0200
commitae217a6e4b0c29346381e2a410fd7810cb33ce3f (patch)
tree206f604c9297deabf78bb33f31a1e6b9303d2258 /src
parent99d2616a08c98e7067cdb12f0bcbd4ac0cffaeb0 (diff)
downloadcms-ae217a6e4b0c29346381e2a410fd7810cb33ce3f.tar.gz
cms-ae217a6e4b0c29346381e2a410fd7810cb33ce3f.tar.bz2
cms-ae217a6e4b0c29346381e2a410fd7810cb33ce3f.zip
Tous les contrôleurs retournent une Response!
Diffstat (limited to 'src')
-rw-r--r--src/controller/ArticleController.php119
-rw-r--r--src/controller/CalendarController.php30
-rw-r--r--src/controller/ContactFormController.php50
-rw-r--r--src/controller/FileUploadController.php18
-rw-r--r--src/controller/HeadFootController.php37
-rw-r--r--src/controller/ImageUploadController.php51
-rw-r--r--src/controller/MaintenanceController.php37
-rw-r--r--src/controller/MenuAndPathsController.php57
-rw-r--r--src/controller/PageManagementController.php126
-rw-r--r--src/controller/UserController.php57
-rw-r--r--src/controller/ViewDirector.php11
-rw-r--r--src/service/Router.php515
-rw-r--r--src/service/User.php23
13 files changed, 508 insertions, 623 deletions
diff --git a/src/controller/ArticleController.php b/src/controller/ArticleController.php
index 2364c50..7019f5c 100644
--- a/src/controller/ArticleController.php
+++ b/src/controller/ArticleController.php
@@ -8,10 +8,12 @@ use App\Entity\Article;
8use Doctrine\ORM\EntityManager; 8use Doctrine\ORM\EntityManager;
9use Symfony\Component\HttpFoundation\Request; 9use Symfony\Component\HttpFoundation\Request;
10use Symfony\Component\HttpFoundation\Response; 10use Symfony\Component\HttpFoundation\Response;
11use Symfony\Component\HttpFoundation\JsonResponse;
12use Symfony\Component\HttpFoundation\RedirectResponse;
11 13
12class ArticleController 14class ArticleController
13{ 15{
14 static public function fetch(EntityManager $entityManager, Request $request): void 16 static public function fetch(EntityManager $entityManager, Request $request): JsonResponse
15 { 17 {
16 if($request->query->has('id') && !empty($request->query->get('id')) && $request->query->has('last_article')){ 18 if($request->query->has('id') && !empty($request->query->get('id')) && $request->query->has('last_article')){
17 $id = (int)$request->get('id'); // type et nettoie 19 $id = (int)$request->get('id'); // type et nettoie
@@ -29,6 +31,9 @@ class ArticleController
29 elseif($parent_block->getName() === 'news_block'){ 31 elseif($parent_block->getName() === 'news_block'){
30 $builder_name = 'NewBuilder'; 32 $builder_name = 'NewBuilder';
31 } 33 }
34 else{
35 return new JsonResponse(['success' => false, 'error' => 'server side error'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
36 }
32 37
33 $html = ''; 38 $html = '';
34 foreach($bulk_data as $article){ 39 foreach($bulk_data as $article){
@@ -36,24 +41,20 @@ class ArticleController
36 $html .= $builder->render(); 41 $html .= $builder->render();
37 } 42 }
38 43
39 echo json_encode(['success' => true, 'html' => $html, 'truncated' => $get_articles_return[1]]); 44 return new JsonResponse(['success' => true, 'html' => $html, 'truncated' => $get_articles_return[1]]);
40 die;
41 } 45 }
42 else{ 46 else{
43 echo json_encode(['success' => false, 'error' => 'mauvais type de bloc']); 47 return new JsonResponse(['success' => false, 'error' => 'server side error']);
44 die;
45 } 48 }
46 } 49 }
47 else{ 50 else{
48 echo json_encode(['success' => false, 'error' => 'la requête ne comporte pas les paramètres attendus']); 51 return new JsonResponse(['success' => false, 'error' => 'bad parameters']);
49 die;
50 } 52 }
51 } 53 }
52 54
53 static public function editorSubmit(EntityManager $entityManager, array $json): void 55 static public function editorSubmit(EntityManager $entityManager, array $json): JsonResponse
54 { 56 {
55 if(json_last_error() === JSON_ERROR_NONE) 57 if(json_last_error() === JSON_ERROR_NONE){
56 {
57 $id = $json['id']; 58 $id = $json['id'];
58 if(in_array($id[0], ['t', 'p', 'i', 'd'])){ 59 if(in_array($id[0], ['t', 'p', 'i', 'd'])){
59 $id = substr($id, 1); 60 $id = substr($id, 1);
@@ -76,8 +77,7 @@ class ArticleController
76 if($json['id'][0] === 'n'){ // ici $id est un bloc 77 if($json['id'][0] === 'n'){ // ici $id est un bloc
77 $section_id = (int)substr($id, 1); // id du bloc <section> 78 $section_id = (int)substr($id, 1); // id du bloc <section>
78 if(!$model->findNodeById($section_id)){ // erreur mauvais id 79 if(!$model->findNodeById($section_id)){ // erreur mauvais id
79 echo json_encode(['success' => false, 'error' => 'article_not_saved, bad id']); 80 return new JsonResponse(['success' => false, 'error' => 'article_not_saved, bad id']);
80 die;
81 } 81 }
82 $model->makeSectionNode(); 82 $model->makeSectionNode();
83 $section = $model->getNode(); 83 $section = $model->getNode();
@@ -85,8 +85,7 @@ class ArticleController
85 // ajout d'une news 85 // ajout d'une news
86 if(is_array($content)){ 86 if(is_array($content)){
87 if($section->getPage()->getEndOfPath() !== $json['from']){ // erreur mauvais from 87 if($section->getPage()->getEndOfPath() !== $json['from']){ // erreur mauvais from
88 echo json_encode(['success' => false, 'error' => 'article_not_saved, bad from']); 88 return new JsonResponse(['success' => false, 'error' => 'article_not_saved, bad from']);
89 die;
90 } 89 }
91 90
92 $date = new \DateTime($content['d'] . ':' . (new \DateTime)->format('s')); // l'input type="datetime-local" ne donne pas les secondes, on les ajoute: 'hh:mm' . ':ss' 91 $date = new \DateTime($content['d'] . ':' . (new \DateTime)->format('s')); // l'input type="datetime-local" ne donne pas les secondes, on les ajoute: 'hh:mm' . ':ss'
@@ -112,14 +111,12 @@ class ArticleController
112 $entityManager->persist($article_node); 111 $entityManager->persist($article_node);
113 $entityManager->flush(); 112 $entityManager->flush();
114 113
115 echo json_encode(['success' => true, 'article_id' => $article_node->getId()]); 114 return new JsonResponse(['success' => true, 'article_id' => $article_node->getId()]);
116 die;
117 } 115 }
118 // modification article 116 // modification article
119 //else{} 117 //else{}
120 118
121 if($model->makeArticleNode($id)) // une entrée est trouvée 119 if($model->makeArticleNode($id)){ // une entrée est trouvée
122 {
123 $node = $model->getArticleNode(); 120 $node = $model->getArticleNode();
124 switch($json['id'][0]){ 121 switch($json['id'][0]){
125 case 'i': 122 case 'i':
@@ -132,54 +129,74 @@ class ArticleController
132 $node->getArticle()->setTitle($content); // html de l'éditeur 129 $node->getArticle()->setTitle($content); // html de l'éditeur
133 break; 130 break;
134 case 'd': 131 case 'd':
135 echo json_encode(['success' => false, 'message' => 'l\'action editor_submit ne supporte pas les dates, utiliser date_submit.']); 132 return new JsonResponse(['success' => false, 'message' => 'l\'action editor_submit ne supporte pas les dates, utiliser date_submit.']);
136 die;
137 default: // modif article simple (id sans lettre devant) 133 default: // modif article simple (id sans lettre devant)
138 $node->getArticle()->setContent($content); 134 $node->getArticle()->setContent($content);
139 } 135 }
140 $entityManager->flush(); 136 $entityManager->flush();
141 echo json_encode(['success' => true]); 137 return new JsonResponse(['success' => true]);
142 } 138 }
143 else 139 else{
144 { 140 return new JsonResponse(['success' => false, 'message' => 'article non identifié']);
145 echo json_encode(['success' => false, 'message' => 'article non identifié']);
146 } 141 }
147 } 142 }
148 else{ 143 else{
149 echo json_encode(['success' => false, 'message' => 'Erreur de décodage JSON']); 144 return new JsonResponse(['success' => false, 'message' => 'Erreur de décodage JSON']);
150 } 145 }
151 die;
152 } 146 }
153 147
154 static public function deleteArticle(EntityManager $entityManager, array $data): Response // $data peut être un $_GET ou du JSON 148 static public function deleteArticle(EntityManager $entityManager, Request $request): Response
155 { 149 {
156 $model = new Model($entityManager); 150 $model = new Model($entityManager);
157 if(!$model->makeArticleNode($data['id'], true)){ 151
158 return new Response( 152 if($request->headers->get('Content-Type') === 'application/json'){
159 '{"success": false, "message": "Erreur: pas d\'article à supprimer"}', 153 $id = json_decode($request->getContent(), true)['id'];
160 Response::HTTP_INTERNAL_SERVER_ERROR); // 500 154 }
155 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
156 $id = $request->query->get('id');
157 }
158 // ni JSON ni form, c'est quoi? un POST vide?
159 else{
160 return new Response('la méthode deleteArticle ne peut être appelée de cette manière');
161 } 161 }
162 $article = $model->getArticleNode();
163 $section = $model->getNode();
164 162
165 $entityManager->remove($article); 163 if(!$model->makeArticleNode($id, true)){
166 $section->removeChild($article); 164 $params = ['false', "Erreur 500 pas d\'article à supprimer"];
167 $section->sortChildren(true); // régénère les positions 165 }
166 else{
167 $article = $model->getArticleNode();
168 $section = $model->getNode();
169
170 $entityManager->remove($article);
171 $section->removeChild($article);
172 $section->sortChildren(true); // régénère les positions
173
174 try{
175 $entityManager->flush();
176 $params = ['true', 'Article supprimé avec succès'];
177 }
178 catch(Exception $e){
179 $params = ['false', 'Erreur 500 ' . $e->getMessage()];
180 }
181 }
168 182
169 try{ 183 if($request->headers->get('Content-Type') === 'application/json'){
170 $entityManager->flush(); 184 return new JsonResponse(
171 return new Response( 185 ['success' => $params[0], 'message' => $params[1]],
172 '{"success": true, "message": "Article supprimé avec succès"}', 186 $params[0] ? JsonResponse::HTTP_OK : JsonResponse::HTTP_INTERNAL_SERVER_ERROR
173 Response::HTTP_OK); // 200 187 );
174 }
175 catch(Exception $e){
176 return new Response(
177 '{"success": false, "message": "Erreur: ' . $e->getMessage() . '"}',
178 Response::HTTP_INTERNAL_SERVER_ERROR); // 500
179 } 188 }
189 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
190 $url = new URL(['page' => $request->query->get('from') ?? '', 'success' => $params[0], 'message' => $params[1]]);
191 return new RedirectResponse((string)$url);
192 }
193 else{
194 // cas inaccesible
195 throw new Exception('la méthode deleteArticle ne peut être appelée de cette manière');
196 }
180 } 197 }
181 198
182 static public function switchPositions(EntityManager $entityManager, array $json): void 199 static public function switchPositions(EntityManager $entityManager, array $json): JsonResponse
183 { 200 {
184 $model = new Model($entityManager); 201 $model = new Model($entityManager);
185 $model->makeArticleNode($json['id1'], true); 202 $model->makeArticleNode($json['id1'], true);
@@ -202,11 +219,10 @@ class ArticleController
202 $article2->setPosition($tmp); 219 $article2->setPosition($tmp);
203 $entityManager->flush(); 220 $entityManager->flush();
204 221
205 echo json_encode(['success' => true]); 222 return new JsonResponse(['success' => true]);
206 die;
207 } 223 }
208 224
209 static public function dateSubmit(EntityManager $entityManager, array $json): void 225 static public function dateSubmit(EntityManager $entityManager, array $json): JsonResponse
210 { 226 {
211 $id = substr($json['id'], 1); 227 $id = substr($json['id'], 1);
212 $date = new DateTime($json['date']); 228 $date = new DateTime($json['date']);
@@ -217,7 +233,6 @@ class ArticleController
217 $node->getArticle()->setDateTime($date); 233 $node->getArticle()->setDateTime($date);
218 $entityManager->flush(); 234 $entityManager->flush();
219 235
220 echo json_encode(['success' => true]); 236 return new JsonResponse(['success' => true]);
221 die;
222 } 237 }
223} \ No newline at end of file 238} \ No newline at end of file
diff --git a/src/controller/CalendarController.php b/src/controller/CalendarController.php
index b60ff11..1a62afa 100644
--- a/src/controller/CalendarController.php
+++ b/src/controller/CalendarController.php
@@ -5,10 +5,11 @@ declare(strict_types=1);
5 5
6use Doctrine\ORM\EntityManager; 6use Doctrine\ORM\EntityManager;
7use App\Entity\Event; 7use App\Entity\Event;
8use Symfony\Component\HttpFoundation\JsonResponse;
8 9
9class CalendarController 10class CalendarController
10{ 11{
11 static public function getData(EntityManager $entityManager): void 12 static public function getData(EntityManager $entityManager): JsonResponse
12 { 13 {
13 // bornes début et fin du calendrier affiché à l'heure locale 14 // bornes début et fin du calendrier affiché à l'heure locale
14 // noter que la vue "planning" est similaire à la vue "semaine" 15 // noter que la vue "planning" est similaire à la vue "semaine"
@@ -33,50 +34,41 @@ class CalendarController
33 $events[] = $event->toArray(); 34 $events[] = $event->toArray();
34 } 35 }
35 36
36 header('Content-Type: application/json'); 37 return new JsonResponse($events);
37 echo json_encode($events);
38 die;
39 } 38 }
40 39
41 static public function newEvent(array $json, EntityManager $entityManager):void 40 static public function newEvent(array $json, EntityManager $entityManager): JsonResponse
42 { 41 {
43 try{ 42 try{
44 $event = new Event($json); 43 $event = new Event($json);
45 } 44 }
46 catch(InvalidArgumentException $e){ 45 catch(InvalidArgumentException $e){
47 echo json_encode(['success' => false, 'error' => $e->getMessage()]); 46 return new JsonResponse(['success' => false, 'error' => $e->getMessage()], JsonResponse::HTTP_BAD_REQUEST); // code 400
48 http_response_code(400);
49 die;
50 } 47 }
51 $entityManager->persist($event); 48 $entityManager->persist($event);
52 $entityManager->flush(); 49 $entityManager->flush();
53 50
54 echo json_encode(['success' => true, 'id' => $event->getId()]); 51 return new JsonResponse(['success' => true, 'id' => $event->getId()]);
55 die;
56 } 52 }
57 static public function updateEvent(array $json, EntityManager $entityManager):void 53 static public function updateEvent(array $json, EntityManager $entityManager): JsonResponse
58 { 54 {
59 $event = $entityManager->find('App\Entity\Event', (int)$json['id']); 55 $event = $entityManager->find('App\Entity\Event', (int)$json['id']);
60 try{ 56 try{
61 $event->securedUpdateFromJSON($json); 57 $event->securedUpdateFromJSON($json);
62 } 58 }
63 catch(InvalidArgumentException $e){ 59 catch(InvalidArgumentException $e){
64 echo json_encode(['success' => false, 'error' => $e->getMessage()]); 60 return new JsonResponse(['success' => false, 'error' => $e->getMessage()], JsonResponse::HTTP_BAD_REQUEST); // code 400
65 http_response_code(400);
66 die;
67 } 61 }
68 $entityManager->flush(); 62 $entityManager->flush();
69 63
70 echo json_encode(['success' => true]); 64 return new JsonResponse(['success' => true]);
71 die;
72 } 65 }
73 static public function removeEvent(array $json, EntityManager $entityManager):void 66 static public function removeEvent(array $json, EntityManager $entityManager): JsonResponse
74 { 67 {
75 $event = $entityManager->find('App\Entity\Event', (int)$json['id']); 68 $event = $entityManager->find('App\Entity\Event', (int)$json['id']);
76 $entityManager->remove($event); 69 $entityManager->remove($event);
77 $entityManager->flush(); 70 $entityManager->flush();
78 71
79 echo json_encode(['success' => true]); 72 return new JsonResponse(['success' => true]);
80 die;
81 } 73 }
82} \ No newline at end of file 74} \ No newline at end of file
diff --git a/src/controller/ContactFormController.php b/src/controller/ContactFormController.php
index 468b732..6b89161 100644
--- a/src/controller/ContactFormController.php
+++ b/src/controller/ContactFormController.php
@@ -4,28 +4,27 @@
4declare(strict_types=1); 4declare(strict_types=1);
5 5
6use Doctrine\ORM\EntityManager; 6use Doctrine\ORM\EntityManager;
7use Symfony\Component\HttpFoundation\JsonResponse;
7 8
8class ContactFormController 9class ContactFormController
9{ 10{
10 static public function keepEmails(EntityManager $entityManager, array $json): void 11 static public function keepEmails(EntityManager $entityManager, array $json): JsonResponse
11 { 12 {
12 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']); 13 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']);
13 $form_data->updateData('keep_emails', $json['checked'] ? true : false); 14 $form_data->updateData('keep_emails', $json['checked'] ? true : false);
14 $entityManager->persist($form_data); 15 $entityManager->persist($form_data);
15 $entityManager->flush(); 16 $entityManager->flush();
16 echo json_encode(['success' => true, 'checked' => $json['checked']]); 17 return new JsonResponse(['success' => true, 'checked' => $json['checked']]);
17 die;
18 } 18 }
19 static public function setEmailsRetentionPeriod(EntityManager $entityManager, array $json): void 19 static public function setEmailsRetentionPeriod(EntityManager $entityManager, array $json): JsonResponse
20 { 20 {
21 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']); 21 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']);
22 $form_data->updateData($json['field'], (int)$json['months']); 22 $form_data->updateData($json['field'], (int)$json['months']);
23 $entityManager->persist($form_data); 23 $entityManager->persist($form_data);
24 $entityManager->flush(); 24 $entityManager->flush();
25 echo json_encode(['success' => true, 'months' => $json['months']]); 25 return new JsonResponse(['success' => true, 'months' => $json['months']]);
26 die;
27 } 26 }
28 static public function setEmailParam(EntityManager $entityManager, array $json): void 27 static public function setEmailParam(EntityManager $entityManager, array $json): JsonResponse
29 { 28 {
30 $form = new FormValidation($json, 'email_params'); 29 $form = new FormValidation($json, 'email_params');
31 30
@@ -41,16 +40,15 @@ class ContactFormController
41 } 40 }
42 41
43 if(empty($error)){ 42 if(empty($error)){
44 echo json_encode(['success' => true]); 43 return new JsonResponse(['success' => true]);
45 } 44 }
46 else{ 45 else{
47 echo json_encode(['success' => false, 'error' => $error]); 46 return new JsonResponse(['success' => false, 'error' => $error]);
48 } 47 }
49 die;
50 } 48 }
51 49
52 // les deux méthodes suivantes sont "factorisables", elles ne se distinguent que par la gestion ou non du formulaire rempli par le visiteur 50 // les deux méthodes suivantes sont "factorisables", elles ne se distinguent que par la gestion ou non du formulaire rempli par le visiteur
53 static public function sendVisitorEmail(EntityManager $entityManager, array $json): void 51 static public function sendVisitorEmail(EntityManager $entityManager, array $json): JsonResponse
54 { 52 {
55 $form = new FormValidation($json, 'email_send'); 53 $form = new FormValidation($json, 'email_send');
56 54
@@ -59,9 +57,7 @@ class ContactFormController
59 // destinataire = e-mail par défaut dans config.ini OU choisi par l'utilisateur 57 // destinataire = e-mail par défaut dans config.ini OU choisi par l'utilisateur
60 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']); 58 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']);
61 if($form_data === null){ 59 if($form_data === null){
62 http_response_code(500); 60 return new JsonResponse(['success' => false, 'error' => 'server_error'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
63 echo json_encode(['success' => false, 'error' => 'server_error']);
64 die;
65 } 61 }
66 62
67 if(!EmailService::send($entityManager, $form_data, false, $form->getField('name'), $form->getField('email'), $form->getField('message'))){ 63 if(!EmailService::send($entityManager, $form_data, false, $form->getField('name'), $form->getField('email'), $form->getField('message'))){
@@ -73,45 +69,39 @@ class ContactFormController
73 } 69 }
74 70
75 if(empty($error)){ 71 if(empty($error)){
76 echo json_encode(['success' => true]); 72 return new JsonResponse(['success' => true]);
77 } 73 }
78 else{ 74 else{
79 echo json_encode(['success' => false, 'error' => $error]); 75 return new JsonResponse(['success' => false, 'error' => $error]);
80 } 76 }
81 die;
82 } 77 }
83 static public function sendTestEmail(EntityManager $entityManager, array $json): void 78 static public function sendTestEmail(EntityManager $entityManager, array $json): JsonResponse
84 { 79 {
85 // destinataire = e-mail par défaut dans config.ini OU choisi par l'utilisateur 80 // destinataire = e-mail par défaut dans config.ini OU choisi par l'utilisateur
86 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']); 81 $form_data = $entityManager->find('App\Entity\NodeData', $json['id']);
87 if($form_data === null){ 82 if($form_data === null){
88 http_response_code(500); 83 return new JsonResponse(['success' => false, 'error' => 'server_error'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
89 echo json_encode(['success' => false, 'error' => 'server_error']);
90 die;
91 } 84 }
92 85
93 if(EmailService::send($entityManager, $form_data, true, 'nom du visiteur', 'adresse@du_visiteur.fr', "TEST d'un envoi d'e-mail depuis le site web")){ 86 if(EmailService::send($entityManager, $form_data, true, 'nom du visiteur', 'adresse@du_visiteur.fr', "TEST d'un envoi d'e-mail depuis le site web")){
94 echo json_encode(['success' => true]); 87 return new JsonResponse(['success' => true]);
95 } 88 }
96 else{ 89 else{
97 echo json_encode(['success' => false, 'error' => 'email_not_sent']); 90 return new JsonResponse(['success' => false, 'error' => 'email_not_sent']);
98 } 91 }
99 die;
100 } 92 }
101 static public function deleteEmail(EntityManager $entityManager, array $json): void 93 static public function deleteEmail(EntityManager $entityManager, array $json): JsonResponse
102 { 94 {
103 $email = $entityManager->find('App\Entity\Email', $json['id']); 95 $email = $entityManager->find('App\Entity\Email', $json['id']);
104 $entityManager->remove($email); 96 $entityManager->remove($email);
105 $entityManager->flush(); 97 $entityManager->flush();
106 echo json_encode(['success' => true]); 98 return new JsonResponse(['success' => true]);
107 die;
108 } 99 }
109 static public function toggleSensitiveEmail(EntityManager $entityManager, array $json): void 100 static public function toggleSensitiveEmail(EntityManager $entityManager, array $json): JsonResponse
110 { 101 {
111 $email = $entityManager->find('App\Entity\Email', $json['id']); 102 $email = $entityManager->find('App\Entity\Email', $json['id']);
112 $email->makeSensitive($json['checked']); 103 $email->makeSensitive($json['checked']);
113 $entityManager->flush(); 104 $entityManager->flush();
114 echo json_encode(['success' => true, 'checked' => $json['checked'], 'deletion_date' => $email->getDeletionDate()->format('d/m/Y')]); 105 return new JsonResponse(['success' => true, 'checked' => $json['checked'], 'deletion_date' => $email->getDeletionDate()->format('d/m/Y')]);
115 die;
116 } 106 }
117} \ No newline at end of file 107} \ No newline at end of file
diff --git a/src/controller/FileUploadController.php b/src/controller/FileUploadController.php
index f53f5c2..3cd5e6b 100644
--- a/src/controller/FileUploadController.php
+++ b/src/controller/FileUploadController.php
@@ -3,9 +3,11 @@
3 3
4declare(strict_types=1); 4declare(strict_types=1);
5 5
6use Symfony\Component\HttpFoundation\JsonResponse;
7
6class FileUploadController 8class FileUploadController
7{ 9{
8 static public function checkFileDownload(array $file): bool 10 static private function checkFileDownload(array $file): bool
9 { 11 {
10 $extensions_white_list = ['pdf', 'rtf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp']; // = extensions_white_list côté javascript 12 $extensions_white_list = ['pdf', 'rtf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp']; // = extensions_white_list côté javascript
11 $mime_type_white_list = ['application/pdf', 'application/rtf', 'text/rtf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation']; 13 $mime_type_white_list = ['application/pdf', 'application/rtf', 'text/rtf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/vnd.oasis.opendocument.text', 'application/vnd.oasis.opendocument.spreadsheet', 'application/vnd.oasis.opendocument.presentation'];
@@ -32,7 +34,7 @@ class FileUploadController
32 return in_array($real_type, $mime_type_white_list, true); 34 return in_array($real_type, $mime_type_white_list, true);
33 } 35 }
34 36
35 static public function fileUploadTinyMce(): void 37 static public function fileUploadTinyMce(): JsonResponse
36 { 38 {
37 if(isset($_FILES['file'])){ 39 if(isset($_FILES['file'])){
38 $dest = 'user_data/media/'; 40 $dest = 'user_data/media/';
@@ -46,22 +48,18 @@ class FileUploadController
46 48
47 if(self::checkFileDownload($_FILES['file'])){ 49 if(self::checkFileDownload($_FILES['file'])){
48 if(move_uploaded_file($_FILES['file']['tmp_name'], $file_path)){ 50 if(move_uploaded_file($_FILES['file']['tmp_name'], $file_path)){
49 echo json_encode(['location' => $file_path]); 51 return new JsonResponse(['location' => $file_path]);
50 } 52 }
51 else{ 53 else{
52 http_response_code(500); 54 return new JsonResponse(['message' => 'Erreur enregistrement du fichier.'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
53 echo json_encode(['message' => 'Erreur enregistrement du fichier.']);
54 } 55 }
55 } 56 }
56 else{ 57 else{
57 http_response_code(400); 58 return new JsonResponse(['message' => 'Erreur 400: fichier non valide.'], JsonResponse::HTTP_BAD_REQUEST); // code 400
58 echo json_encode(['message' => 'Erreur 400: fichier non valide.']);
59 } 59 }
60 } 60 }
61 else{ 61 else{
62 http_response_code(400); 62 return new JsonResponse(['message' => 'Erreur 400: Bad Request'], JsonResponse::HTTP_BAD_REQUEST); // code 400
63 echo json_encode(['message' => 'Erreur 400: Bad Request']);
64 } 63 }
65 die;
66 } 64 }
67} \ No newline at end of file 65} \ No newline at end of file
diff --git a/src/controller/HeadFootController.php b/src/controller/HeadFootController.php
index df6d022..72487d8 100644
--- a/src/controller/HeadFootController.php
+++ b/src/controller/HeadFootController.php
@@ -7,15 +7,15 @@ use App\Entity\NodeData;
7use App\Entity\Asset; 7use App\Entity\Asset;
8use App\Entity\AssetEmployment; 8use App\Entity\AssetEmployment;
9use Doctrine\ORM\EntityManager; 9use Doctrine\ORM\EntityManager;
10use Symfony\Component\HttpFoundation\JsonResponse;
10 11
11class HeadFootController 12class HeadFootController
12{ 13{
13 static public function setTextData(EntityManager $entityManager, string $request_params, array $json): void 14 static public function setTextData(EntityManager $entityManager, string $request_params, array $json): JsonResponse
14 { 15 {
15 $params_array = explode('_', $request_params); // header_title, header_description, footer_name, footer_address, footer_email 16 $params_array = explode('_', $request_params); // header_title, header_description, footer_name, footer_address, footer_email
16 if(count($params_array) !== 2){ 17 if(count($params_array) !== 2){
17 echo json_encode(['success' => false]); 18 return new JsonResponse(['success' => false]);
18 die;
19 } 19 }
20 20
21 $model = new Model($entityManager); 21 $model = new Model($entityManager);
@@ -34,18 +34,16 @@ class HeadFootController
34 } 34 }
35 35
36 $entityManager->flush(); 36 $entityManager->flush();
37 echo json_encode(['success' => true]); 37 return new JsonResponse(['success' => true]);
38 } 38 }
39 else{ 39 else{
40 echo json_encode(['success' => false]); 40 return new JsonResponse(['success' => false]);
41 } 41 }
42 die;
43 } 42 }
44 static public function uploadAsset(EntityManager $entityManager, string $request_params): void 43 static public function uploadAsset(EntityManager $entityManager, string $request_params): JsonResponse
45 { 44 {
46 if(empty($_FILES)){ 45 if(empty($_FILES)){
47 http_response_code(400); 46 return new JsonResponse(['success' => false], JsonResponse::HTTP_BAD_REQUEST); // code 400
48 echo json_encode(['success' => false]);
49 } 47 }
50 else{ 48 else{
51 if(!is_dir(Asset::USER_PATH)){ 49 if(!is_dir(Asset::USER_PATH)){
@@ -81,9 +79,8 @@ class HeadFootController
81 } 79 }
82 80
83 /* -- écriture du fichier sur le disque -- */ 81 /* -- écriture du fichier sur le disque -- */
84 if(!ImageUploadController::imagickCleanAndWriteImage(file_get_contents($file['tmp_name']), Asset::USER_PATH . $name, $extension)){ // recréer l’image pour la nettoyer 82 if(!ImageUploadController::imagickCleanAndWriteImage(file_get_contents($file['tmp_name']), Asset::USER_PATH . $name)){ // recréer l’image pour la nettoyer
85 http_response_code(500); 83 return new JsonResponse(['success' => false, 'message' => "Erreur de l'enregistrement de l'image: problème de permission ou format non valide.", 'format' => $extension], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
86 echo json_encode(['success' => false, 'message' => "Erreur de l'enregistrement de l'image: problème de permission ou format non valide.", 'format' => $extension]);
87 } 84 }
88 else{ 85 else{
89 $params_array = explode('_', $request_params); // head_favicon, header_logo, header_background, footer_logo 86 $params_array = explode('_', $request_params); // head_favicon, header_logo, header_background, footer_logo
@@ -111,23 +108,20 @@ class HeadFootController
111 $entityManager->persist($asset); 108 $entityManager->persist($asset);
112 } 109 }
113 $entityManager->flush(); 110 $entityManager->flush();
114 echo json_encode(['success' => true, 'location' => Asset::USER_PATH . $name, 'mime_type' => $mime_type]); 111 return new JsonResponse(['success' => true, 'location' => Asset::USER_PATH . $name, 'mime_type' => $mime_type]);
115 } 112 }
116 else{ 113 else{
117 http_response_code(500); 114 return new JsonResponse(['success' => false, 'message' => "Erreur noeud non trouvé, c'est pas du tout normal!"], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
118 echo json_encode(['success' => false, 'message' => "Erreur noeud non trouvé, c'est pas du tout normal!"]);
119 } 115 }
120 } 116 }
121 } 117 }
122 die;
123 } 118 }
124 119
125 static public function displaySocialNetwork(EntityManager $entityManager, string $request_params, array $json): void 120 static public function displaySocialNetwork(EntityManager $entityManager, string $request_params, array $json): JsonResponse
126 { 121 {
127 $params_array = explode('_', $request_params); 122 $params_array = explode('_', $request_params);
128 if(count($params_array) !== 2){ 123 if(count($params_array) !== 2){
129 echo json_encode(['success' => false]); 124 return new JsonResponse(['success' => false]);
130 die;
131 } 125 }
132 126
133 $model = new Model($entityManager); 127 $model = new Model($entityManager);
@@ -138,11 +132,10 @@ class HeadFootController
138 $node_data->updateData('social_show', $social_show); 132 $node_data->updateData('social_show', $social_show);
139 133
140 $entityManager->flush(); 134 $entityManager->flush();
141 echo json_encode(['success' => true, 'checked' => $json['checked']]); 135 return new JsonResponse(['success' => true, 'checked' => $json['checked']]);
142 } 136 }
143 else{ 137 else{
144 echo json_encode(['success' => false]); 138 return new JsonResponse(['success' => false]);
145 } 139 }
146 die;
147 } 140 }
148} \ No newline at end of file 141} \ No newline at end of file
diff --git a/src/controller/ImageUploadController.php b/src/controller/ImageUploadController.php
index ddd99ae..af9a553 100644
--- a/src/controller/ImageUploadController.php
+++ b/src/controller/ImageUploadController.php
@@ -3,6 +3,8 @@
3 3
4declare(strict_types=1); 4declare(strict_types=1);
5 5
6use Symfony\Component\HttpFoundation\JsonResponse;
7
6class ImageUploadController 8class ImageUploadController
7{ 9{
8 const ALLOWED_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif']; 10 const ALLOWED_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'tif'];
@@ -78,16 +80,13 @@ class ImageUploadController
78 } 80 }
79 81
80 // téléchargement par le plugin (bouton "insérer une image") 82 // téléchargement par le plugin (bouton "insérer une image")
81 static public function imageUploadTinyMce(): void 83 static public function imageUploadTinyMce(): JsonResponse
82 { 84 {
83 if(!isset($_FILES['file'])){ 85 if(!isset($_FILES['file'])){
84 http_response_code(400); 86 return new JsonResponse(['message' => 'Erreur 400: Bad Request'], JsonResponse::HTTP_BAD_REQUEST); // code 400
85 echo json_encode(['message' => 'Erreur 400: Bad Request']);
86 } 87 }
87 if(!is_uploaded_file($_FILES['file']['tmp_name'])) { 88 if(!is_uploaded_file($_FILES['file']['tmp_name'])) {
88 http_response_code(400); 89 return new JsonResponse(['message' => "Le fichier n'a pas été téléchargé correctement."], JsonResponse::HTTP_BAD_REQUEST); // code 400
89 echo json_encode(['message' => "Le fichier n'a pas été téléchargé correctement."]);
90 die;
91 } 90 }
92 91
93 $dest = 'user_data/images/'; 92 $dest = 'user_data/images/';
@@ -113,35 +112,29 @@ class ImageUploadController
113 // 112 //
114 113
115 if(self::imagickCleanAndWriteImage($image_data, $local_path)){ // recréer l’image pour la nettoyer 114 if(self::imagickCleanAndWriteImage($image_data, $local_path)){ // recréer l’image pour la nettoyer
116 echo json_encode(['location' => $local_path]); // renvoyer l'URL de l'image téléchargée 115 return new JsonResponse(['location' => $local_path]); // renvoyer l'URL de l'image téléchargée
117 } 116 }
118 else{ 117 else{
119 http_response_code(500); 118 return new JsonResponse(['message' => 'Erreur image non valide'], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
120 echo json_encode(['message' => 'Erreur image non valide']);
121 } 119 }
122 die;
123 } 120 }
124 121
125 // collage de HTML => recherche de balises <img>, téléchargement côté serveur et renvoi de l'adresse sur le serveur 122 // collage de HTML => recherche de balises <img>, téléchargement côté serveur et renvoi de l'adresse sur le serveur
126 static public function uploadImageHtml(): void 123 static public function uploadImageHtml(): JsonResponse
127 { 124 {
128 $json = json_decode(file_get_contents('php://input'), true); 125 $json = json_decode(file_get_contents('php://input'), true);
129 126
130 if(!isset($json['image_url'])){ 127 if(!isset($json['image_url'])){
131 http_response_code(400); 128 return new JsonResponse(['message' => "Erreur 400: Bad Request"], JsonResponse::HTTP_BAD_REQUEST); // code 400
132 echo json_encode(['message' => "Erreur 400: Bad Request"]);
133 die;
134 } 129 }
135 130
136 $image_data = self::curlDownloadImage($json['image_url']); // téléchargement de l’image par le serveur avec cURL au lieu de file_get_contents 131 $image_data = self::curlDownloadImage($json['image_url']); // téléchargement de l’image par le serveur avec cURL au lieu de file_get_contents
137 if(!$image_data){ 132 if(!$image_data){
138 http_response_code(400); 133 return new JsonResponse(['message' => "Erreur, le serveur n'a pas réussi à télécharger l'image."], JsonResponse::HTTP_BAD_REQUEST); // code 400
139 echo json_encode(['message' => "Erreur, le serveur n'a pas réussi à télécharger l'image."]);
140 die;
141 } 134 }
142 135
143 $dest = 'user_data/images/'; 136 $dest = 'user_data/images/';
144 if(!is_dir($dest)) { // Vérifier si le répertoire existe, sinon le créer 137 if(!is_dir($dest)){ // Vérifier si le répertoire existe, sinon le créer
145 mkdir($dest, 0755, true); 138 mkdir($dest, 0755, true);
146 } 139 }
147 140
@@ -154,17 +147,15 @@ class ImageUploadController
154 $local_path = uniqid($dest . $name . '_') . '.' . $extension; 147 $local_path = uniqid($dest . $name . '_') . '.' . $extension;
155 148
156 if(self::imagickCleanAndWriteImage($image_data, $local_path)){ // recréer l’image pour la nettoyer 149 if(self::imagickCleanAndWriteImage($image_data, $local_path)){ // recréer l’image pour la nettoyer
157 echo json_encode(['location' => $local_path]); // nouvelle adresse 150 return new JsonResponse(['location' => $local_path]); // nouvelle adresse
158 } 151 }
159 else{ 152 else{
160 http_response_code(500); 153 return new JsonResponse(['message' => 'Erreur image non valide', 'format' => $extension], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
161 echo json_encode(['message' => 'Erreur image non valide', 'format' => $extension]);
162 } 154 }
163 die;
164 } 155 }
165 156
166 // collage simple d'une image (base64 dans le presse-papier) non encapsulée dans du HTML 157 // collage simple d'une image (base64 dans le presse-papier) non encapsulée dans du HTML
167 static public function uploadImageBase64(): void 158 static public function uploadImageBase64(): JsonResponse
168 { 159 {
169 $json = json_decode(file_get_contents('php://input'), true); 160 $json = json_decode(file_get_contents('php://input'), true);
170 $dest = 'user_data/images/'; 161 $dest = 'user_data/images/';
@@ -175,9 +166,7 @@ class ImageUploadController
175 166
176 // détection de data:image/ et de ;base64, et capture du format dans $type 167 // détection de data:image/ et de ;base64, et capture du format dans $type
177 if(!isset($json['image_base64']) || !preg_match('/^data:image\/(\w+);base64,/', $json['image_base64'], $type)){ 168 if(!isset($json['image_base64']) || !preg_match('/^data:image\/(\w+);base64,/', $json['image_base64'], $type)){
178 http_response_code(400); 169 return new JsonResponse(['message' => 'Données image base64 manquantes ou invalides'], JsonResponse::HTTP_BAD_REQUEST); // code 400
179 echo json_encode(['message' => 'Données image base64 manquantes ou invalides']);
180 die;
181 } 170 }
182 171
183 $extension = strtolower($type[1]); // dans (\w+) 172 $extension = strtolower($type[1]); // dans (\w+)
@@ -188,19 +177,15 @@ class ImageUploadController
188 $name = 'pasted_image'; 177 $name = 'pasted_image';
189 $image_data = base64_decode(substr($json['image_base64'], strpos($json['image_base64'], ',') + 1)); // découpe la chaine à la virgule puis convertit en binaire 178 $image_data = base64_decode(substr($json['image_base64'], strpos($json['image_base64'], ',') + 1)); // découpe la chaine à la virgule puis convertit en binaire
190 if($image_data === false){ 179 if($image_data === false){
191 http_response_code(400); 180 return new JsonResponse(['message' => 'Décodage base64 invalide'], JsonResponse::HTTP_BAD_REQUEST); // code 400
192 echo json_encode(['message' => 'Décodage base64 invalide']);
193 die;
194 } 181 }
195 $local_path = uniqid($dest . $name . '_') . '.' . $extension; 182 $local_path = uniqid($dest . $name . '_') . '.' . $extension;
196 183
197 if(self::imagickCleanAndWriteImage($image_data, $local_path)){ 184 if(self::imagickCleanAndWriteImage($image_data, $local_path)){
198 echo json_encode(['location' => $local_path]); 185 return new JsonResponse(['location' => $local_path]);
199 } 186 }
200 else{ 187 else{
201 http_response_code(500); 188 return new JsonResponse(['message' => 'Erreur image non valide', 'format' => $extension], JsonResponse::HTTP_INTERNAL_SERVER_ERROR); // code 500
202 echo json_encode(['message' => 'Erreur image non valide', 'format' => $extension]);
203 } 189 }
204 die;
205 } 190 }
206} \ No newline at end of file 191} \ No newline at end of file
diff --git a/src/controller/MaintenanceController.php b/src/controller/MaintenanceController.php
index 98f2e60..1f8fadd 100644
--- a/src/controller/MaintenanceController.php
+++ b/src/controller/MaintenanceController.php
@@ -6,17 +6,18 @@ declare(strict_types=1);
6use Doctrine\ORM\EntityManager; 6use Doctrine\ORM\EntityManager;
7use App\Entity\log; 7use App\Entity\log;
8use Symfony\Component\HttpFoundation\Request; 8use Symfony\Component\HttpFoundation\Request;
9use Symfony\Component\HttpFoundation\JsonResponse;
9use Symfony\Component\HttpFoundation\BinaryFileResponse; 10use Symfony\Component\HttpFoundation\BinaryFileResponse;
10use Symfony\Component\HttpFoundation\ResponseHeaderBag; 11use Symfony\Component\HttpFoundation\ResponseHeaderBag;
11use Symfony\Component\HttpFoundation\RedirectResponse; 12use Symfony\Component\HttpFoundation\RedirectResponse;
12 13
13class MaintenanceController 14class MaintenanceController
14{ 15{
15 static public function getLogs(EntityManager $entityManager): void 16 static public function getLogs(EntityManager $entityManager): JsonResponse
16 { 17 {
17 $data = $entityManager->getRepository(Log::class)->findAll(); 18 $data = $entityManager->getRepository(Log::class)->findAll();
18 if(empty($data)){ 19 if(empty($data)){
19 echo json_encode(['success' => false]); 20 return new JsonResponse(['success' => false]);
20 } 21 }
21 else{ 22 else{
22 $view = '<h4>Table ' . TABLE_PREFIX . 'log de la base de données</h4> 23 $view = '<h4>Table ' . TABLE_PREFIX . 'log de la base de données</h4>
@@ -35,24 +36,22 @@ class MaintenanceController
35 </tr>'; 36 </tr>';
36 } 37 }
37 $view .= '</tbody></table>'; 38 $view .= '</tbody></table>';
38 echo json_encode(['success' => true, 'view' => $view]); 39 return new JsonResponse(['success' => true, 'view' => $view]);
39 } 40 }
40 die;
41 } 41 }
42 static public function eraseLogs(EntityManager $entityManager): void 42 static public function eraseLogs(EntityManager $entityManager): JsonResponse
43 { 43 {
44 try{ 44 try{
45 $table = $entityManager->getClassMetadata(Log::class)->getTableName(); 45 $table = $entityManager->getClassMetadata(Log::class)->getTableName();
46 $entityManager->getConnection()->executeStatement("TRUNCATE TABLE {$table}"); // SQL donné à DBAL 46 $entityManager->getConnection()->executeStatement("TRUNCATE TABLE {$table}"); // SQL donné à DBAL
47 echo json_encode(['success' => true]); 47 return new JsonResponse(['success' => true]);
48 } 48 }
49 catch(Exception $e){ 49 catch(Exception $e){
50 echo json_encode(['success' => false]); 50 return new JsonResponse(['success' => false, 'error' => $e->getMessage()]);
51 } 51 }
52 die;
53 } 52 }
54 53
55 static public function getLastDump(EntityManager $entityManager): void 54 static public function getLastDump(EntityManager $entityManager): BinaryFileResponse|RedirectResponse
56 { 55 {
57 try{ 56 try{
58 $backup_list = Backup::getBackupList(); 57 $backup_list = Backup::getBackupList();
@@ -75,10 +74,9 @@ class MaintenanceController
75 $_SESSION['flash_message'] = $e->getMessage(); 74 $_SESSION['flash_message'] = $e->getMessage();
76 $response = new RedirectResponse((string) new URL(['page' => 'maintenance'])); 75 $response = new RedirectResponse((string) new URL(['page' => 'maintenance']));
77 } 76 }
78 $response->send(); 77 return $response;
79 die;
80 } 78 }
81 static public function getAllMedia(): void 79 static public function getAllMedia(): BinaryFileResponse|RedirectResponse
82 { 80 {
83 try{ 81 try{
84 $file_path = '../var/' . UserDataService::createZip('all_media.zip', ['user_data/assets', 'user_data/images', 'user_data/media']); 82 $file_path = '../var/' . UserDataService::createZip('all_media.zip', ['user_data/assets', 'user_data/images', 'user_data/media']);
@@ -89,12 +87,11 @@ class MaintenanceController
89 $_SESSION['flash_message'] = $e->getMessage(); 87 $_SESSION['flash_message'] = $e->getMessage();
90 $response = new RedirectResponse((string) new URL(['page' => 'maintenance'])); 88 $response = new RedirectResponse((string) new URL(['page' => 'maintenance']));
91 } 89 }
92 $response->send(); 90 return $response;
93 die;
94 } 91 }
95 92
96 // parce qu'il faut un contrôleur 93 // parce qu'il faut un contrôleur
97 static public function handleBackupSelection(EntityManager $entityManager, Request $request): void 94 static public function handleBackupSelection(EntityManager $entityManager, Request $request): RedirectResponse
98 { 95 {
99 $selected_file = $request->request->get('selected_sql'); 96 $selected_file = $request->request->get('selected_sql');
100 $url = new URL; 97 $url = new URL;
@@ -114,12 +111,10 @@ class MaintenanceController
114 $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage(); 111 $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage();
115 } 112 }
116 113
117 $response = new RedirectResponse((string)$url); 114 return new RedirectResponse((string)$url);
118 $response->send();
119 die;
120 } 115 }
121 116
122 static public function downloadSQL(EntityManager $entityManager, Request $request): void 117 static public function downloadSQL(EntityManager $entityManager, Request $request): RedirectResponse
123 { 118 {
124 $uploaded_file = $request->files->get('uploaded_sql'); 119 $uploaded_file = $request->files->get('uploaded_sql');
125 $date = new DateTime; 120 $date = new DateTime;
@@ -147,8 +142,6 @@ class MaintenanceController
147 $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage(); 142 $_SESSION['flash_message'] = "Une erreur s'est produite: " . $e->getMessage();
148 } 143 }
149 144
150 $response = new RedirectResponse((string)$url); 145 return new RedirectResponse((string)$url);
151 $response->send();
152 die;
153 } 146 }
154} \ No newline at end of file 147} \ No newline at end of file
diff --git a/src/controller/MenuAndPathsController.php b/src/controller/MenuAndPathsController.php
index 799f14b..9bd6ad1 100644
--- a/src/controller/MenuAndPathsController.php
+++ b/src/controller/MenuAndPathsController.php
@@ -5,10 +5,12 @@ declare(strict_types=1);
5 5
6use App\Entity\Page; 6use App\Entity\Page;
7use Doctrine\ORM\EntityManager; 7use Doctrine\ORM\EntityManager;
8use Symfony\Component\HttpFoundation\JsonResponse;
9use Symfony\Component\HttpFoundation\RedirectResponse;
8 10
9class MenuAndPathsController 11class MenuAndPathsController
10{ 12{
11 static public function newUrlMenuEntry(EntityManager $entityManager): void 13 static public function newUrlMenuEntry(EntityManager $entityManager): RedirectResponse
12 { 14 {
13 Model::$menu = new Menu($entityManager); 15 Model::$menu = new Menu($entityManager);
14 $previous_page = Model::$menu->findPageById((int)$_POST["location"]); // (int) à cause de declare(strict_types=1); 16 $previous_page = Model::$menu->findPageById((int)$_POST["location"]); // (int) à cause de declare(strict_types=1);
@@ -16,8 +18,8 @@ class MenuAndPathsController
16 18
17 $url_input = trim($_POST["url_input"]); // faire htmlspecialchars à l'affichage 19 $url_input = trim($_POST["url_input"]); // faire htmlspecialchars à l'affichage
18 if(!filter_var($url_input, FILTER_VALIDATE_URL) || !str_starts_with($url_input, 'http')){ 20 if(!filter_var($url_input, FILTER_VALIDATE_URL) || !str_starts_with($url_input, 'http')){
19 header("Location: " . new URL(['page' => $_GET['from'], 'error' => 'invalide_url'])); 21 // utiliser une flash error
20 die; 22 return new RedirectResponse((string)new URL(['page' => $_GET['from'], 'error' => 'invalide_url']));
21 } 23 }
22 24
23 $page = new Page( 25 $page = new Page(
@@ -38,24 +40,23 @@ class MenuAndPathsController
38 40
39 $entityManager->persist($page); 41 $entityManager->persist($page);
40 $entityManager->flush(); 42 $entityManager->flush();
41 header("Location: " . new URL(['page' => $_GET['from']])); 43 return new RedirectResponse((string)new URL(['page' => $_GET['from']]));
42 die;
43 } 44 }
44 45
45 // on pourrait utiliser FormValidation ici 46 // on pourrait utiliser FormValidation ici
46 static public function editUrl(EntityManager $entityManager, array $json): void 47 static public function editUrl(EntityManager $entityManager, array $json): JsonResponse
47 { 48 {
48 $url_data = trim($json['input_data']); // garder htmlspecialchars pour l'affichage 49 $url_data = trim($json['input_data']); // garder htmlspecialchars pour l'affichage
49 $page = $entityManager->find('App\Entity\Page', $json['id']); 50 $page = $entityManager->find('App\Entity\Page', $json['id']);
50 51
51 if(!$page){ 52 if(!$page){
52 echo json_encode(['success' => false, 'message' => "id invalide"]); 53 return new JsonResponse(['success' => false, 'message' => "id invalide"]);
53 } 54 }
54 elseif(!in_array($json['field'], ['url_name', 'url_content'])){ 55 elseif(!in_array($json['field'], ['url_name', 'url_content'])){
55 echo json_encode(['success' => false, 'message' => "champ invalide"]); 56 return new JsonResponse(['success' => false, 'message' => "champ invalide"]);
56 } 57 }
57 elseif($json['field'] === 'url_content' && (!filter_var($url_data, FILTER_VALIDATE_URL) || !str_starts_with($url_data, 'http'))){ 58 elseif($json['field'] === 'url_content' && (!filter_var($url_data, FILTER_VALIDATE_URL) || !str_starts_with($url_data, 'http'))){
58 echo json_encode(['success' => false, 'message' => "la chaîne envoyée n'est pas une URL valide"]); 59 return new JsonResponse(['success' => false, 'message' => "la chaîne envoyée n'est pas une URL valide"]);
59 } 60 }
60 else{ 61 else{
61 if($json['field'] === 'url_name'){ 62 if($json['field'] === 'url_name'){
@@ -65,12 +66,11 @@ class MenuAndPathsController
65 $page->setEndOfPath($url_data); 66 $page->setEndOfPath($url_data);
66 } 67 }
67 $entityManager->flush(); 68 $entityManager->flush();
68 echo json_encode(['success' => true, 'url_data' => $url_data]); 69 return new JsonResponse(['success' => true, 'url_data' => $url_data]);
69 } 70 }
70 die;
71 } 71 }
72 72
73 static public function deleteUrlMenuEntry(EntityManager $entityManager): void 73 static public function deleteUrlMenuEntry(EntityManager $entityManager): RedirectResponse
74 { 74 {
75 Model::$menu = new Menu($entityManager); 75 Model::$menu = new Menu($entityManager);
76 $page = Model::$menu->findPageById((int)$_POST["delete"]); 76 $page = Model::$menu->findPageById((int)$_POST["delete"]);
@@ -84,11 +84,10 @@ class MenuAndPathsController
84 84
85 $entityManager->remove($page); // suppression en BDD 85 $entityManager->remove($page); // suppression en BDD
86 $entityManager->flush(); 86 $entityManager->flush();
87 header("Location: " . new URL(['page' => $_GET['from']])); 87 return new RedirectResponse((string)new URL(['page' => $_GET['from']]));
88 die;
89 } 88 }
90 89
91 static public function MoveOneLevelUp(EntityManager $entityManager, array $json): void 90 static public function MoveOneLevelUp(EntityManager $entityManager, array $json): JsonResponse
92 { 91 {
93 $id = $json['id']; 92 $id = $json['id'];
94 $page = Model::$menu->findPageById((int)$id); 93 $page = Model::$menu->findPageById((int)$id);
@@ -96,8 +95,7 @@ class MenuAndPathsController
96 $parent = $page->getParent(); // peut être null 95 $parent = $page->getParent(); // peut être null
97 if($parent === null){ 96 if($parent === null){
98 // 1er niveau: ne rien faire 97 // 1er niveau: ne rien faire
99 echo json_encode(['success' => false]); 98 return new JsonResponse(['success' => false, 'message' => 'nothing to do']);
100 die;
101 } 99 }
102 // BDD 100 // BDD
103 else{ 101 else{
@@ -130,12 +128,11 @@ class MenuAndPathsController
130 $parent->removeChild($page); 128 $parent->removeChild($page);
131 $nav_builder = new NavBuilder(); 129 $nav_builder = new NavBuilder();
132 $menu_builder = new MenuBuilder(null, false); 130 $menu_builder = new MenuBuilder(null, false);
133 echo json_encode(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]); 131 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]);
134 die;
135 } 132 }
136 } 133 }
137 134
138 static public function MoveOneLevelDown(EntityManager $entityManager, array $json): void 135 static public function MoveOneLevelDown(EntityManager $entityManager, array $json): JsonResponse
139 { 136 {
140 $id = $json['id']; 137 $id = $json['id'];
141 $page = Model::$menu->findPageById((int)$id); 138 $page = Model::$menu->findPageById((int)$id);
@@ -152,8 +149,7 @@ class MenuAndPathsController
152 if($child->getPosition() === $page->getPosition() - 1){ 149 if($child->getPosition() === $page->getPosition() - 1){
153 // refus si $parent est une adresse, ça va casser le lien, exemple: index.php?page=chemin/http://un_site_web.fr/vers/ici 150 // refus si $parent est une adresse, ça va casser le lien, exemple: index.php?page=chemin/http://un_site_web.fr/vers/ici
154 if(str_starts_with($child->getEndOfPath(), 'http')){ 151 if(str_starts_with($child->getEndOfPath(), 'http')){
155 echo json_encode(['success' => false, 'error' => 'new_parent_is_a_link']); 152 return new JsonResponse(['success' => false, 'error' => 'new_parent_is_a_link']);
156 die;
157 } 153 }
158 154
159 $page->setParent($child); 155 $page->setParent($child);
@@ -171,11 +167,10 @@ class MenuAndPathsController
171 $nav_builder = new NavBuilder(); 167 $nav_builder = new NavBuilder();
172 $menu_builder = new MenuBuilder(null, false); 168 $menu_builder = new MenuBuilder(null, false);
173 169
174 echo json_encode(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]); 170 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render(), 'menu_buttons' => $menu_builder->render()]);
175 die;
176 } 171 }
177 172
178 static public function SwitchPositions(EntityManager $entityManager, array $json): void 173 static public function SwitchPositions(EntityManager $entityManager, array $json): JsonResponse
179 { 174 {
180 $id1 = $json['id1']; 175 $id1 = $json['id1'];
181 $id2 = $json['id2']; 176 $id2 = $json['id2'];
@@ -196,15 +191,14 @@ class MenuAndPathsController
196 191
197 // nouveau menu 192 // nouveau menu
198 $nav_builder = new NavBuilder(); 193 $nav_builder = new NavBuilder();
199 echo json_encode(['success' => true, 'nav' => $nav_builder->render()]); 194 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render()]);
200 } 195 }
201 else{ 196 else{
202 echo json_encode(['success' => false]); 197 return new JsonResponse(['success' => false]);
203 } 198 }
204 die;
205 } 199 }
206 200
207 static public function displayInMenu(EntityManager $entityManager, array $json): void 201 static public function displayInMenu(EntityManager $entityManager, array $json): JsonResponse
208 { 202 {
209 $id = $json['id']; 203 $id = $json['id'];
210 $checked = $json['checked']; 204 $checked = $json['checked'];
@@ -216,11 +210,10 @@ class MenuAndPathsController
216 210
217 // nouveau menu 211 // nouveau menu
218 $nav_builder = new NavBuilder(); 212 $nav_builder = new NavBuilder();
219 echo json_encode(['success' => true, 'nav' => $nav_builder->render()]); 213 return new JsonResponse(['success' => true, 'nav' => $nav_builder->render()]);
220 } 214 }
221 else{ 215 else{
222 echo json_encode(['success' => false]); 216 return new JsonResponse(['success' => false]);
223 } 217 }
224 die;
225 } 218 }
226} \ No newline at end of file 219} \ No newline at end of file
diff --git a/src/controller/PageManagementController.php b/src/controller/PageManagementController.php
index 8c4092f..a43f36c 100644
--- a/src/controller/PageManagementController.php
+++ b/src/controller/PageManagementController.php
@@ -8,25 +8,28 @@ use App\Entity\Node;
8use App\Entity\NodeData; 8use App\Entity\NodeData;
9//use App\Entity\Image; 9//use App\Entity\Image;
10use Doctrine\ORM\EntityManager; 10use Doctrine\ORM\EntityManager;
11use Symfony\Component\HttpFoundation\InputBag;
12use Symfony\Component\HttpFoundation\JsonResponse;
13use Symfony\Component\HttpFoundation\RedirectResponse;
14use Symfony\Component\HttpFoundation\Request;
11 15
12class PageManagementController 16class PageManagementController
13{ 17{
14 /* -- partie page -- */ 18 /* -- partie page -- */
15 static public function setPageTitle(EntityManager $entityManager, array $json): void 19 static public function setPageTitle(EntityManager $entityManager, array $json): JsonResponse
16 { 20 {
17 $page = $entityManager->find('App\Entity\Page', $json['page_id']); 21 $page = $entityManager->find('App\Entity\Page', $json['page_id']);
18 $page->setPageName(htmlspecialchars($json['title'])); 22 $page->setPageName(htmlspecialchars($json['title']));
19 $entityManager->flush(); 23 $entityManager->flush();
20 echo json_encode(['success' => true, 'title' => $page->getPageName()]); 24 return new JsonResponse(['success' => true, 'title' => $page->getPageName()]);
21 die;
22 } 25 }
23 26
24 static public function updatePageMenuPath(EntityManager $entityManager): void 27 static public function updatePageMenuPath(EntityManager $entityManager, string $page_menu_path): RedirectResponse
25 { 28 {
26 Model::$menu = new Menu($entityManager); 29 Model::$menu = new Menu($entityManager);
27 Model::$page_path = new Path(); 30 Model::$page_path = new Path();
28 $page = Model::$page_path->getLast(); 31 $page = Model::$page_path->getLast();
29 $path = htmlspecialchars($_POST['page_menu_path']); 32 $path = htmlspecialchars($page_menu_path);
30 33
31 // mise en snake_case: filtre caractères non-alphanumériques, minuscule, doublons d'underscore, trim des underscores 34 // mise en snake_case: filtre caractères non-alphanumériques, minuscule, doublons d'underscore, trim des underscores
32 $path = trim(preg_replace('/_+/', '_', strtolower(preg_replace('/[^a-zA-Z0-9]/', '_', $path))), '_'); 35 $path = trim(preg_replace('/_+/', '_', strtolower(preg_replace('/[^a-zA-Z0-9]/', '_', $path))), '_');
@@ -37,30 +40,28 @@ class PageManagementController
37 } 40 }
38 } 41 }
39 $entityManager->flush(); 42 $entityManager->flush();
40 header("Location: " . new URL(['page' => $page->getPagePath(), 'mode' => 'page_modif'])); 43 return new RedirectResponse((string)new URL(['page' => $page->getPagePath(), 'mode' => 'page_modif']));
41 die;
42 } 44 }
43 45
44 static public function setPageDescription(EntityManager $entityManager, array $json): void 46 static public function setPageDescription(EntityManager $entityManager, array $json): JsonResponse
45 { 47 {
46 $page = $entityManager->find('App\Entity\Page', $json['page_id']); 48 $page = $entityManager->find('App\Entity\Page', $json['page_id']);
47 $page->setDescription(htmlspecialchars($json['description'])); 49 $page->setDescription(htmlspecialchars($json['description']));
48 $entityManager->flush(); 50 $entityManager->flush();
49 echo json_encode(['success' => true, 'description' => $page->getDescription()]); 51 return new JsonResponse(['success' => true, 'description' => $page->getDescription()]);
50 die;
51 } 52 }
52 53
53 static public function newPage(EntityManager $entityManager, array $post): void 54 static public function newPage(EntityManager $entityManager, InputBag $post): RedirectResponse
54 { 55 {
55 // titre et chemin 56 // titre et chemin
56 Model::$menu = new Menu($entityManager); 57 Model::$menu = new Menu($entityManager);
57 $previous_page = Model::$menu->findPageById((int)$post["page_location"]); // (int) à cause de declare(strict_types=1); 58 $previous_page = Model::$menu->findPageById((int)$post->get("page_location")); // (int) à cause de declare(strict_types=1);
58 $parent = $previous_page->getParent(); 59 $parent = $previous_page->getParent();
59 60
60 $page = new Page( 61 $page = new Page(
61 trim(htmlspecialchars($post["page_name"])), 62 trim(htmlspecialchars($post->get("page_name"))),
62 trim(htmlspecialchars($post["page_name_path"])), 63 trim(htmlspecialchars($post->get("page_name_path"))),
63 trim(htmlspecialchars($post["page_description"])), 64 trim(htmlspecialchars($post->get("page_description"))),
64 true, true, false, 65 true, true, false,
65 $previous_page->getPosition(), 66 $previous_page->getPosition(),
66 $parent); // peut et DOIT être null si on est au 1er niveau 67 $parent); // peut et DOIT être null si on est au 1er niveau
@@ -80,14 +81,13 @@ class PageManagementController
80 $entityManager->flush(); 81 $entityManager->flush();
81 82
82 // page créée, direction la page en mode modification pour ajouter des blocs 83 // page créée, direction la page en mode modification pour ajouter des blocs
83 header("Location: " . new URL(['page' => $page->getPagePath(), 'mode' => 'page_modif'])); 84 return new RedirectResponse((string)new URL(['page' => $page->getPagePath(), 'mode' => 'page_modif']));
84 die;
85 } 85 }
86 86
87 static public function deletePage(EntityManager $entityManager): void 87 static public function deletePage(EntityManager $entityManager, string $page_id): RedirectResponse
88 { 88 {
89 $menu = new Menu($entityManager); 89 $menu = new Menu($entityManager);
90 $page = $menu->findPageById((int)$_POST['page_id']); 90 $page = $menu->findPageById((int)$page_id);
91 $url = new URL; 91 $url = new URL;
92 92
93 // test dernière page 93 // test dernière page
@@ -115,13 +115,12 @@ class PageManagementController
115 $next_page = $menu->getChildren()->isEmpty() ? $next_page = $page->getChildren()[0] : $menu->getChildren()[0]; 115 $next_page = $menu->getChildren()->isEmpty() ? $next_page = $page->getChildren()[0] : $menu->getChildren()[0];
116 $url->addParams(['page' => $next_page->getEndOfPath()]); 116 $url->addParams(['page' => $next_page->getEndOfPath()]);
117 } 117 }
118 118
119 header("Location: " . $url); 119 return new RedirectResponse((string)$url);
120 die;
121 } 120 }
122 121
123 /* partie "blocs" */ 122 /* partie "blocs" */
124 static public function addBloc(EntityManager $entityManager): void 123 static public function addBloc(EntityManager $entityManager, Request $request): RedirectResponse
125 { 124 {
126 $model = new Model($entityManager); 125 $model = new Model($entityManager);
127 $model->makeMenuAndPaths(); // on a besoin de page_path qui dépend de menu 126 $model->makeMenuAndPaths(); // on a besoin de page_path qui dépend de menu
@@ -131,31 +130,30 @@ class PageManagementController
131 $main = $model->getNode(); 130 $main = $model->getNode();
132 $position = count($main->getChildren()) + 1; // position dans la fraterie 131 $position = count($main->getChildren()) + 1; // position dans la fraterie
133 132
134 if(!in_array($_POST["bloc_select"], array_keys(Blocks::$blocks), true)) // 3è param: contrôle du type 133 if(!in_array($request->request->get("bloc_select"), array_keys(Blocks::$blocks), true)){ // 3è param: contrôle du type
135 { 134 // utiliser une flash error
136 header("Location: " . new URL(['page' => $_GET['page'], 'error' => 'bad_bloc_type'])); 135 return new RedirectResponse((string)new URL(['page' => $request->query->get('page'), 'error' => 'bad_bloc_type']));
137 die;
138 } 136 }
139 137
140 if(in_array($_POST["bloc_select"], ['calendar', 'form'])){ 138 if(in_array($request->request->get("bloc_select"), ['calendar', 'form'])){
141 $page->addCSS($_POST["bloc_select"]); 139 $page->addCSS($request->request->get("bloc_select"));
142 if($_POST["bloc_select"] === 'form'){ 140 if($request->request->get("bloc_select") === 'form'){
143 $page->addJS($_POST["bloc_select"]); 141 $page->addJS($request->request->get("bloc_select"));
144 } 142 }
145 $entityManager->persist($page); 143 $entityManager->persist($page);
146 } 144 }
147 145
148 $block = new Node($_POST["bloc_select"], $position, $main, $page); 146 $block = new Node($request->request->get("bloc_select"), $position, $main, $page);
149 $data = new NodeData(['title' => trim(htmlspecialchars($_POST["bloc_title"]))], $block); 147 $data = new NodeData(['title' => trim(htmlspecialchars($request->request->get("bloc_title")))], $block);
150 148
151 // valeurs par défaut 149 // valeurs par défaut
152 if($_POST["bloc_select"] === 'post_block'){ 150 if($request->request->get("bloc_select") === 'post_block'){
153 $data->setPresentation('fullwidth'); 151 $data->setPresentation('fullwidth');
154 } 152 }
155 elseif($_POST["bloc_select"] === 'news_block'){ 153 elseif($request->request->get("bloc_select") === 'news_block'){
156 $data->setPresentation('grid'); 154 $data->setPresentation('grid');
157 } 155 }
158 elseif($_POST["bloc_select"] === 'galery'){ 156 elseif($request->request->get("bloc_select") === 'galery'){
159 $data->setPresentation('mosaic'); // un jour on mettra carousel 157 $data->setPresentation('mosaic'); // un jour on mettra carousel
160 } 158 }
161 // else = null par défaut 159 // else = null par défaut
@@ -163,11 +161,10 @@ class PageManagementController
163 $entityManager->persist($block); 161 $entityManager->persist($block);
164 $entityManager->persist($data); 162 $entityManager->persist($data);
165 $entityManager->flush(); 163 $entityManager->flush();
166 header("Location: " . new URL(['page' => $_GET['page'], 'mode' => 'page_modif'])); 164 return new RedirectResponse((string)new URL(['page' => $request->query->get('page'), 'mode' => 'page_modif']));
167 die;
168 } 165 }
169 166
170 static public function deleteBloc(EntityManager $entityManager): void 167 static public function deleteBloc(EntityManager $entityManager, Request $request): RedirectResponse
171 { 168 {
172 $model = new Model($entityManager); 169 $model = new Model($entityManager);
173 $model->makeMenuAndPaths(); 170 $model->makeMenuAndPaths();
@@ -179,7 +176,7 @@ class PageManagementController
179 $type = ''; 176 $type = '';
180 $nb_same_type = 0; 177 $nb_same_type = 0;
181 foreach($main->getChildren() as $child){ 178 foreach($main->getChildren() as $child){
182 if($child->getId() === (int)$_POST['delete_bloc_id']){ 179 if($child->getId() === (int)$request->request->get('delete_bloc_id')){
183 $block = $child; 180 $block = $child;
184 $type = $block->getName(); 181 $type = $block->getName();
185 } 182 }
@@ -207,11 +204,10 @@ class PageManagementController
207 $entityManager->flush(); 204 $entityManager->flush();
208 } 205 }
209 206
210 header("Location: " . new URL(['page' => $_GET['page'], 'mode' => 'page_modif'])); 207 return new RedirectResponse((string)new URL(['page' => $request->query->get('page'), 'mode' => 'page_modif']));
211 die;
212 } 208 }
213 209
214 static public function renameBloc(EntityManager $entityManager, array $json): void 210 static public function renameBloc(EntityManager $entityManager, array $json): JsonResponse
215 { 211 {
216 if(isset($json['bloc_title']) && $json['bloc_title'] !== null && isset($json['bloc_id']) && is_int($json['bloc_id'])){ 212 if(isset($json['bloc_title']) && $json['bloc_title'] !== null && isset($json['bloc_id']) && is_int($json['bloc_id'])){
217 $model = new Model($entityManager); 213 $model = new Model($entityManager);
@@ -223,17 +219,16 @@ class PageManagementController
223 $model->getNode()->getNodeData()->updateData('title', htmlspecialchars($json['bloc_title'])); 219 $model->getNode()->getNodeData()->updateData('title', htmlspecialchars($json['bloc_title']));
224 220
225 $entityManager->flush(); 221 $entityManager->flush();
226 echo json_encode(['success' => true, 'title' => $data['title']]); 222 return new JsonResponse(['success' => true, 'title' => $data['title']]);
227 } 223 }
228 else{ 224 else{
229 echo json_encode(['success' => false]); 225 return new JsonResponse(['success' => false]);
230 } 226 }
231 die;
232 } 227 }
233 228
234 static public function SwitchBlocsPositions(EntityManager $entityManager, array $json): void 229 static public function SwitchBlocsPositions(EntityManager $entityManager, array $json, string $page): JsonResponse
235 { 230 {
236 if(isset($json['id1']) && is_int($json['id1']) && isset($json['id2']) && is_int($json['id2']) && isset($_GET['page'])){ 231 if(isset($json['id1']) && is_int($json['id1']) && isset($json['id2']) && is_int($json['id2']) && isset($page)){
237 $model = new Model($entityManager); 232 $model = new Model($entityManager);
238 $model->makeMenuAndPaths(); // true pour $model->findItsChildren(); 233 $model->makeMenuAndPaths(); // true pour $model->findItsChildren();
239 $model->findUniqueNodeByName('main'); 234 $model->findUniqueNodeByName('main');
@@ -262,15 +257,14 @@ class PageManagementController
262 $bloc2->setPosition($tmp); 257 $bloc2->setPosition($tmp);
263 258
264 $entityManager->flush(); 259 $entityManager->flush();
265 echo json_encode(['success' => true]); 260 return new JsonResponse(['success' => true]);
266 } 261 }
267 else{ 262 else{
268 echo json_encode(['success' => false]); 263 return new JsonResponse(['success' => false]);
269 } 264 }
270 die;
271 } 265 }
272 266
273 static public function changeArticlesOrder(EntityManager $entityManager, array $json): void 267 static public function changeArticlesOrder(EntityManager $entityManager, array $json): JsonResponse
274 { 268 {
275 if(isset($json['id']) && isset($json['chrono_order'])){ 269 if(isset($json['id']) && isset($json['chrono_order'])){
276 $model = new Model($entityManager); 270 $model = new Model($entityManager);
@@ -289,15 +283,14 @@ class PageManagementController
289 $model->getNode()->getNodeData()->setChronoOrder($chrono_order); 283 $model->getNode()->getNodeData()->setChronoOrder($chrono_order);
290 $entityManager->flush(); 284 $entityManager->flush();
291 285
292 echo json_encode(['success' => true, 'chrono_order' => $json['chrono_order']]); 286 return new JsonResponse(['success' => true, 'chrono_order' => $json['chrono_order']]);
293 } 287 }
294 else{ 288 else{
295 echo json_encode(['success' => false]); 289 return new JsonResponse(['success' => false]);
296 } 290 }
297 die;
298 } 291 }
299 292
300 static public function changePresentation(EntityManager $entityManager, array $json): void 293 static public function changePresentation(EntityManager $entityManager, array $json): JsonResponse
301 { 294 {
302 if(isset($json['id']) && isset($json['presentation'])){ 295 if(isset($json['id']) && isset($json['presentation'])){
303 $model = new Model($entityManager); 296 $model = new Model($entityManager);
@@ -311,18 +304,17 @@ class PageManagementController
311 if($json['presentation'] === 'grid'){ 304 if($json['presentation'] === 'grid'){
312 $response_data['cols_min_width'] = $model->getNode()->getNodeData()->getColsMinWidth(); 305 $response_data['cols_min_width'] = $model->getNode()->getNodeData()->getColsMinWidth();
313 } 306 }
314 echo json_encode($response_data); 307 return new JsonResponse($response_data);
315 } 308 }
316 else{ 309 else{
317 echo json_encode(['success' => false]); 310 return new JsonResponse(['success' => false]);
318 } 311 }
319 } 312 }
320 else{ 313 else{
321 echo json_encode(['success' => false]); 314 return new JsonResponse(['success' => false]);
322 } 315 }
323 die;
324 } 316 }
325 static public function changeColsMinWidth(EntityManager $entityManager, array $json): void 317 static public function changeColsMinWidth(EntityManager $entityManager, array $json): JsonResponse
326 { 318 {
327 if(isset($json['id']) && isset($json['cols_min_width'])){ 319 if(isset($json['id']) && isset($json['cols_min_width'])){
328 $model = new Model($entityManager); 320 $model = new Model($entityManager);
@@ -330,14 +322,13 @@ class PageManagementController
330 $model->getNode()->getNodeData()->setColsMinWidth((int)$json['cols_min_width']); // attention conversion? 322 $model->getNode()->getNodeData()->setColsMinWidth((int)$json['cols_min_width']); // attention conversion?
331 323
332 $entityManager->flush(); 324 $entityManager->flush();
333 echo json_encode(['success' => true, 'cols_min_width' => $json['cols_min_width']]); 325 return new JsonResponse(['success' => true, 'cols_min_width' => $json['cols_min_width']]);
334 } 326 }
335 else{ 327 else{
336 echo json_encode(['success' => false]); 328 return new JsonResponse(['success' => false]);
337 } 329 }
338 die;
339 } 330 }
340 static public function changePaginationLimit(EntityManager $entityManager, array $json): void 331 static public function changePaginationLimit(EntityManager $entityManager, array $json): JsonResponse
341 { 332 {
342 if(isset($json['id']) && isset($json['pagination_limit'])){ 333 if(isset($json['id']) && isset($json['pagination_limit'])){
343 $model = new Model($entityManager); 334 $model = new Model($entityManager);
@@ -347,11 +338,10 @@ class PageManagementController
347 338
348 $entityManager->flush(); 339 $entityManager->flush();
349 340
350 echo json_encode(['success' => true, 'old_limit' => $old_limit, 'new_limit' => $json['pagination_limit']]); 341 return new JsonResponse(['success' => true, 'old_limit' => $old_limit, 'new_limit' => $json['pagination_limit']]);
351 } 342 }
352 else{ 343 else{
353 echo json_encode(['success' => false]); 344 return new JsonResponse(['success' => false]);
354 } 345 }
355 die;
356 } 346 }
357} \ No newline at end of file 347} \ No newline at end of file
diff --git a/src/controller/UserController.php b/src/controller/UserController.php
index 9de2fb8..ddba33a 100644
--- a/src/controller/UserController.php
+++ b/src/controller/UserController.php
@@ -16,27 +16,12 @@ declare(strict_types=1);
16use Doctrine\ORM\EntityManager; 16use Doctrine\ORM\EntityManager;
17use App\Entity\User; 17use App\Entity\User;
18use App\Entity\Log; 18use App\Entity\Log;
19use Symfony\Component\HttpFoundation\RedirectResponse;
19 20
20class UserController 21class UserController
21{ 22{
22 // account 23 // account
23 static public function existUsers(EntityManager $entityManager): bool 24 static public function createAdminUser(EntityManager $entityManager): RedirectResponse
24 {
25 if(!$entityManager // table vide
26 ->createQuery("SELECT u FROM App\Entity\User u")
27 ->setMaxResults(1)
28 ->getOneOrNullResult())
29 {
30 unset($_SESSION['user']);
31 return false;
32 }
33 else{
34 return true;
35 }
36 }
37
38 // account
39 static public function createAdminUser(EntityManager $entityManager)
40 { 25 {
41 unset($_SESSION['user']); 26 unset($_SESSION['user']);
42 27
@@ -58,20 +43,18 @@ class UserController
58 $url->addParams(['error' => $error]); 43 $url->addParams(['error' => $error]);
59 } 44 }
60 45
61 header('Location: ' . $url); 46 return new RedirectResponse((string)$url);
62 die;
63 } 47 }
64 48
65 // account 49 // account
66 //static public function createUser(EntityManager $entityManager){} 50 //static public function createUser(EntityManager $entityManager){}
67 51
68 // auth 52 // auth
69 static public function connect(EntityManager $entityManager): void 53 static public function connect(EntityManager $entityManager): RedirectResponse
70 { 54 {
71 if(IS_ADMIN) // déjà connecté? 55 $url = new URL;
72 { 56 if(IS_ADMIN){ // déjà connecté?
73 header('Location: ' . new URL); 57 return new RedirectResponse((string)$url);
74 die;
75 } 58 }
76 unset($_SESSION['user']); 59 unset($_SESSION['user']);
77 60
@@ -101,7 +84,7 @@ class UserController
101 echo '<script>window.error_message = "' . $e->getMessage() . '";</script>'; 84 echo '<script>window.error_message = "' . $e->getMessage() . '";</script>';
102 } 85 }
103 86
104 $url = new URL(isset($_GET['from']) ? ['page' => $_GET['from']] : []); 87 $url->addParams(isset($_GET['from']) ? ['page' => $_GET['from']] : []);
105 isset($_GET['id']) ? $url->addParams(['id' => $_GET['id']]) : ''; 88 isset($_GET['id']) ? $url->addParams(['id' => $_GET['id']]) : '';
106 } 89 }
107 else 90 else
@@ -118,18 +101,17 @@ class UserController
118 101
119 if(!empty($error)){ 102 if(!empty($error)){
120 sleep(1); // défense basique à la force brute 103 sleep(1); // défense basique à la force brute
121 $url = new URL(['page' => 'connection']); 104 $url->addParams(['page' => 'connection']);
122 isset($_GET['from']) ? $url->addParams(['from' => $_GET['from']]) : null; 105 isset($_GET['from']) ? $url->addParams(['from' => $_GET['from']]) : null;
123 isset($_GET['id']) ? $url->addParams(['id' => $_GET['id']]) : null; 106 isset($_GET['id']) ? $url->addParams(['id' => $_GET['id']]) : null;
124 $url->addParams(['error' => $error]); 107 $url->addParams(['error' => $error]);
125 } 108 }
126 109
127 header('Location: ' . $url); 110 return new RedirectResponse((string)$url);
128 die;
129 } 111 }
130 112
131 // auth 113 // auth
132 static public function disconnect(): void 114 static public function disconnect(): RedirectResponse
133 { 115 {
134 // nettoyage complet 116 // nettoyage complet
135 unset($_SESSION['user']); // mémoire vive 117 unset($_SESSION['user']); // mémoire vive
@@ -140,15 +122,14 @@ class UserController
140 $url = new URL; 122 $url = new URL;
141 isset($_GET['from']) ? $url->addParams(['page' => $_GET['from']]) : ''; 123 isset($_GET['from']) ? $url->addParams(['page' => $_GET['from']]) : '';
142 isset($_GET['id']) ? $url->addParams(['id' => $_GET['id']]) : ''; 124 isset($_GET['id']) ? $url->addParams(['id' => $_GET['id']]) : '';
143 header('Location: ' . $url); 125 return new RedirectResponse('Location: ' . $url);
144 die;
145 } 126 }
146 127
147 // user 128 // user
148 static public function updateUsername(EntityManager $entityManager): void 129 static public function updateUsername(EntityManager $entityManager): RedirectResponse
149 { 130 {
150 if(!IS_ADMIN){ // superflux, fait dans le routeur 131 if(!IS_ADMIN){ // superflux, fait dans le routeur
151 self::disconnect(); 132 return self::disconnect();
152 } 133 }
153 134
154 $url = new URL(['page' => 'user_edit']); 135 $url = new URL(['page' => 'user_edit']);
@@ -180,15 +161,14 @@ class UserController
180 sleep(1); 161 sleep(1);
181 $url->addParams(['error_username' => $error]); 162 $url->addParams(['error_username' => $error]);
182 } 163 }
183 header('Location: ' . $url); 164 return new RedirectResponse('Location: ' . $url);
184 die;
185 } 165 }
186 166
187 // user 167 // user
188 static public function updatePassword(EntityManager $entityManager): void 168 static public function updatePassword(EntityManager $entityManager): RedirectResponse
189 { 169 {
190 if(!IS_ADMIN){ // superflux, fait dans le routeur 170 if(!IS_ADMIN){ // superflux, fait dans le routeur
191 self::disconnect(); 171 return self::disconnect();
192 } 172 }
193 173
194 $url = new URL(['page' => 'user_edit']); 174 $url = new URL(['page' => 'user_edit']);
@@ -220,8 +200,7 @@ class UserController
220 sleep(1); 200 sleep(1);
221 $url->addParams(['error_password' => $error]); 201 $url->addParams(['error_password' => $error]);
222 } 202 }
223 header('Location: ' . $url); 203 return new RedirectResponse('Location: ' . $url);
224 die;
225 } 204 }
226 205
227 // dans une classe mère ou un trait après découpage de UserController? 206 // dans une classe mère ou un trait après découpage de UserController?
diff --git a/src/controller/ViewDirector.php b/src/controller/ViewDirector.php
index 2d37598..eda49e7 100644
--- a/src/controller/ViewDirector.php
+++ b/src/controller/ViewDirector.php
@@ -9,6 +9,7 @@ use App\Entity\Node;
9use Doctrine\ORM\EntityManager; 9use Doctrine\ORM\EntityManager;
10use Symfony\Component\HttpFoundation\Request; 10use Symfony\Component\HttpFoundation\Request;
11use Symfony\Component\HttpFoundation\Response; 11use Symfony\Component\HttpFoundation\Response;
12use Symfony\Component\HttpFoundation\RedirectResponse;
12 13
13class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier Builder 14class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier Builder
14{ 15{
@@ -31,7 +32,7 @@ class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier
31 if(CURRENT_PAGE === 'article'){ 32 if(CURRENT_PAGE === 'article'){
32 if(IS_ADMIN){ 33 if(IS_ADMIN){
33 if(!$request->query->has('id')){ 34 if(!$request->query->has('id')){
34 return new Response($this->html, 302); 35 return new RedirectResponse((string)new URL(['page' => $_GET['from'] ?? '']));
35 } 36 }
36 else{ 37 else{
37 // mode création d'article 38 // mode création d'article
@@ -42,10 +43,10 @@ class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier
42 } 43 }
43 } 44 }
44 elseif($request->query->get('id')[0] === 'n'){ // accès page nouvelle article interdit sans être admin 45 elseif($request->query->get('id')[0] === 'n'){ // accès page nouvelle article interdit sans être admin
45 return new Response($this->html, 302); 46 return new RedirectResponse((string)new URL(['page' => $_GET['from'] ?? '']));
46 } 47 }
47 } 48 }
48 //else // l'id dans l'URL n'a pas d'effet ailleurs 49 // pas de else, l'id dans l'URL n'a pas d'effet ailleurs
49 50
50 51
51 /* 2/ accès au modèle */ 52 /* 2/ accès au modèle */
@@ -59,7 +60,7 @@ class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier
59 60
60 // article non trouvé en BDD 61 // article non trouvé en BDD
61 if(CURRENT_PAGE === 'article' && !IS_ADMIN && self::$root_node->getNodeByName('main')->getAdoptedChild() === null){ 62 if(CURRENT_PAGE === 'article' && !IS_ADMIN && self::$root_node->getNodeByName('main')->getAdoptedChild() === null){
62 return new Response($this->html, 302); 63 return new RedirectResponse((string)new URL(['page' => $_GET['from'] ?? '']));
63 } 64 }
64 65
65 66
@@ -71,6 +72,6 @@ class ViewDirector extends AbstractBuilder // ViewDirector est aussi le premier
71 unset($_SESSION['flash_message']); 72 unset($_SESSION['flash_message']);
72 } 73 }
73 74
74 return new Response($this->html, 200); 75 return new Response($this->html);
75 } 76 }
76} \ No newline at end of file 77} \ No newline at end of file
diff --git a/src/service/Router.php b/src/service/Router.php
index ee6d25d..110512e 100644
--- a/src/service/Router.php
+++ b/src/service/Router.php
@@ -3,442 +3,375 @@
3// 3//
4/* fonctionnement: 4/* fonctionnement:
5=> 1er test, méthode http GET? POST? 5=> 1er test, méthode http GET? POST?
6=> 2ème test, type de contenu (méthode POST uniquement): 6=> 2ème test, type de contenu:
7"application/x-www-form-urlencoded" = formulaire 7"application/x-www-form-urlencoded" = formulaire
8"application/json" = requête AJAX avec fetch() 8"application/json" = requête AJAX avec fetch()
9"multipart/form-data" = upload d'image par tinymce 9"multipart/form-data" = upload d'image par tinymce
10$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' requête AJAX xhs, non utilisée 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 11=> 3ème test, comme le 2ème test mais uniquement si IS_ADMIN est vrai */
12*/ 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
13 22
14declare(strict_types=1); 23declare(strict_types=1);
15 24
16use Symfony\Component\HttpFoundation\Request; 25use Symfony\Component\HttpFoundation\Request;
17use Doctrine\ORM\EntityManager; 26use Doctrine\ORM\EntityManager;
27use Symfony\Component\HttpFoundation\JsonResponse;
28use Symfony\Component\HttpFoundation\RedirectResponse;
29use Symfony\Component\HttpFoundation\Response;
18 30
19class Router{ 31class Router{
20 // boulot = faire que TOUS les contrôleurs retournent une Response (et faire retourner une réponse par dispatch) 32 private Request $request;
33 private EntityManager $entityManager;
34 private string $route = ''; // défaut page d'accueil
21 35
22 // exemple de méthode dispatch 36 public function __construct(Request $request, EntityManager $entityManager){
23 /*public static function dispatch(Request $request): Response 37 $this->request = $request;
24 { 38 $this->entityManager = $entityManager;
25 if ($request->getMethod() === 'GET') {
26 return PageController::home($request);
27 }
28 39
29 if ($request->getMethod() === 'POST') { 40 if(!User::existUsers($entityManager)){ // table "user" vide
30 return UserController::login($request); 41 $this->route = 'no_user';
31 } 42 }
43 }
32 44
33 return new RedirectResponse('/'); 45 public function dispatch(): Response
34 }*/ 46 {
35 47 if($this->request->getMethod() === 'GET'){
36 /* classes de réponses pour les contrôleurs
37 Response($html, Response::HTTP_OK) page html
38 JsonResponse(['success' => true, 'data' => $data]) ajax
39 RedirectResponse('index.php?page=login') redirection
40 BinaryFileResponse($filePath) téléchargement
41 StreamedResponse(function () {echo "ligne 1\n";echo "ligne 2\n";}) gros fichier
42 */
43
44 static public function dispatch(Request $request, EntityManager $entityManager){
45 if($request->getMethod() === 'GET'){
46 // table "user" vide 48 // table "user" vide
47 if(!UserController::existUsers($entityManager)){ 49 if($this->route === 'no_user'){
50 ob_start();
48 require AbstractBuilder::VIEWS_PATH . 'user_create.php'; 51 require AbstractBuilder::VIEWS_PATH . 'user_create.php';
49 die; 52 return new Response(ob_get_clean());
50 } 53 }
51 54
52 // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là) 55 // bouton déconnexion (méthode GET parce que l'utilisateur ne modifie plus de données à partir de là)
53 if($request->query->has('action') && $request->query->get('action') === 'deconnection'){ 56 if($this->request->query->get('action') === 'deconnection'){
54 UserController::disconnect($entityManager); 57 return UserController::disconnect(); // retourne un RedirectResponse
55 } 58 }
56 59
57 // articles suivants 60 // articles suivants
58 if($request->query->has('fetch') && $request->query->get('fetch') === 'next_articles'){ 61 if($this->request->query->get('fetch') === 'next_articles'){
59 ArticleController::fetch($entityManager, $request); 62 return ArticleController::fetch($this->entityManager, $this->request); // retourne un JsonResponse
60 } 63 }
61 64
62 // données du calendrier 65 // données du calendrier
63 // création du calendrier et changement de dates affichées (boutons flèches mais pas changement de vue) 66 // création du calendrier ou changement de dates affichées (boutons flèches mais pas changement de vue)
64 if($request->query->has('action') && $request->query->get('action') === 'get_events' 67 if($this->request->query->get('action') === 'get_events'
65 && $request->query->has('start') && $request->query->has('end') && empty($request->getPayload()->all())) // getPayload ne récupère pas que des POST 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
66 { 69 return CalendarController::getData($this->entityManager);
67 CalendarController::getData($entityManager);
68 } 70 }
69 71
70 // pages interdites 72 // pages interdites
71 if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails', 'maintenance'])){ 73 if(!IS_ADMIN && in_array(CURRENT_PAGE, ['menu_paths', 'new_page', 'user_edit', 'emails', 'maintenance'])){
72 header('Location: ' . new URL); 74 return new RedirectResponse((string)new URL);
73 die;
74 } 75 }
75 76
76 if(IS_ADMIN){ 77 if(IS_ADMIN){
77 if($request->query->has('action') && $request->query->get('action') === 'get_mysqldump'){ 78 if($this->request->query->get('action') === 'get_mysqldump'){
78 MaintenanceController::getLastDump($entityManager); 79 return MaintenanceController::getLastDump($this->entityManager);
79 die;
80 } 80 }
81 if($request->query->has('action') && $request->query->get('action') === 'get_all_media'){ 81 if($this->request->query->get('action') === 'get_all_media'){
82 MaintenanceController::getAllMedia(); 82 return MaintenanceController::getAllMedia();
83 die;
84 } 83 }
85 } 84 }
86 85
87 // construction d'une page 86 // construction d'une page
88 $response = (new ViewDirector)->buildView($entityManager, $request); // utilise Model 87 return (new ViewDirector)->buildView($this->entityManager, $this->request); // utilise Model
89 // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4 88 // parenthèses nécéssaires autour de l'instanciation pour PHP < 8.4
90 } 89 }
91 90
92 91
93 elseif($request->getMethod() === 'POST'){ 92 elseif($this->request->getMethod() === 'POST'){
94 /* -- contrôleurs appellables par tout le monde -- */ 93 /* -- contrôleurs appelables par tout le monde -- */
95 94
96 // table "user" vide 95 // table "user" vide
97 if(!UserController::existUsers($entityManager)){ 96 if($this->route === 'no_user'){
98 UserController::createAdminUser($entityManager); 97 return UserController::createAdminUser($this->entityManager);
99 } 98 }
100 99
101 // requêtes JSON avec fetch() 100 // requête JSON avec fetch()
102 if($request->headers->get('Content-Type') === 'application/json') 101 if($this->request->headers->get('Content-Type') === 'application/json')
103 { 102 {
104 $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true); 103 $json = json_decode($this->request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
105 104
106 if(isset($_GET['action'])) 105 // formulaire de contact
107 { 106 if($this->request->query->get('action') === 'send_email'){
108 // formulaire de contact 107 return ContactFormController::sendVisitorEmail($this->entityManager, $json);
109 if($_GET['action'] === 'send_email'){
110 ContactFormController::sendVisitorEmail($entityManager, $json);
111 }
112 } 108 }
109 /*else{
110 return new JsonResponse(['success' => false, 'error' => 'tu fais quoi là mec?']);
111 }*/
113 } 112 }
114 113
115 // envoi formulaire HTML 114 // envoi formulaire HTML
116 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){ 115 elseif($this->request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
117 // tentative de connexion 116 // tentative de connexion
118 if($request->query->has('action') && $request->query->get('action') === 'connection'){ 117 if($this->request->query->get('action') === 'connection'){
119 //$response = 118 return UserController::connect($this->entityManager);
120 UserController::connect($entityManager);
121 } 119 }
120 /*else{
121 return new RedirectResponse((string)new URL(['error' => 'tu fais quoi là mec?']));
122 }*/
122 } 123 }
123 124
124 if(IS_ADMIN) 125 if(IS_ADMIN){
125 {
126 /* -- requêtes AJAX -- */ 126 /* -- requêtes AJAX -- */
127 127
128 // requêtes JSON avec fetch() 128 // requêtes JSON avec fetch()
129 if($request->headers->get('Content-Type') === 'application/json') 129 if($this->request->headers->get('Content-Type') === 'application/json'){
130 { 130 $json = json_decode($this->request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
131 $json = json_decode($request->getContent(), true); // = json_decode(file_get_contents('php://input'), true);
132 131
133 if($request->query->has('action')) 132 if($this->request->query->has('action')){
134 {
135 /* -- manipulation des articles -- */ 133 /* -- manipulation des articles -- */
136 if($_GET['action'] === 'editor_submit' && isset($json['id']) && isset($json['content'])){ 134 if($this->request->query->get('action') === 'editor_submit' && isset($json['id']) && isset($json['content'])){
137 ArticleController::editorSubmit($entityManager, $json); 135 return ArticleController::editorSubmit($this->entityManager, $json);
138 }
139 elseif($_GET['action'] === 'delete_article' && isset($json['id'])){
140 $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX
141 }
142 elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
143 ArticleController::switchPositions($entityManager, $json);
144 }
145 elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])){
146 ArticleController::dateSubmit($entityManager, $json);
147 }
148
149 /* -- bloc Formulaire -- */
150 elseif($_GET['action'] === 'keep_emails'){
151 ContactFormController::keepEmails($entityManager, $json);
152 }
153 elseif($_GET['action'] === 'set_retention_period'){
154 ContactFormController::setEmailsRetentionPeriod($entityManager, $json);
155 }
156 elseif($_GET['action'] === 'set_email_param'){
157 ContactFormController::setEmailParam($entityManager, $json);
158 }
159 elseif($_GET['action'] === 'test_email'){
160 ContactFormController::sendTestEmail($entityManager, $json);
161 }
162
163 /* -- page emails -- */
164 elseif($_GET['action'] === 'delete_email'){
165 ContactFormController::deleteEmail($entityManager, $json);
166 }
167 elseif($_GET['action'] === 'toggle_sensitive_email'){
168 ContactFormController::toggleSensitiveEmail($entityManager, $json);
169 }
170
171 /* -- upload d'image dans tinymce par copier-coller -- */
172 // collage de HTML contenant une ou plusieurs balises <img>
173 elseif($request->query->get('action') === 'upload_image_url'){
174 ImageUploadController::uploadImageHtml();
175 }
176 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
177 elseif($request->query->get('action') === 'upload_image_base64'){
178 ImageUploadController::uploadImageBase64();
179 } 136 }
180 137 elseif($this->request->query->get('action') === 'delete_article' && isset($json['id'])){
181 138 return ArticleController::deleteArticle($this->entityManager, $this->request); // version AJAX
182 /* -- requêtes spécifiques au calendrier -- */
183 elseif($request->query->get('action') === 'new_event'){
184 CalendarController::newEvent($json, $entityManager);
185 } 139 }
186 elseif($request->query->get('action') === 'update_event'){ 140 elseif($this->request->query->get('action') === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
187 CalendarController::updateEvent($json, $entityManager); 141 return ArticleController::switchPositions($this->entityManager, $json);
188 } 142 }
189 elseif($request->query->get('action') === 'remove_event'){ 143 elseif($this->request->query->get('action') === 'date_submit' && isset($json['id']) && isset($json['date'])){
190 CalendarController::removeEvent($json, $entityManager); 144 return ArticleController::dateSubmit($this->entityManager, $json);
191 } 145 }
192 146
193 /* -- mode maintenance -- */ 147 switch($this->request->query->get('action')){
194 elseif($request->query->get('action') === 'get_logs'){ 148 /* -- bloc Formulaire -- */
195 MaintenanceController::getLogs($entityManager); 149 case 'keep_emails':
196 die; 150 return ContactFormController::keepEmails($this->entityManager, $json);
197 } 151 case 'set_retention_period':
198 elseif($request->query->get('action') === 'erase_logs'){ 152 return ContactFormController::setEmailsRetentionPeriod($this->entityManager, $json);
199 MaintenanceController::eraseLogs($entityManager); 153 case 'set_email_param':
200 die; 154 return ContactFormController::setEmailParam($this->entityManager, $json);
201 } 155 case 'test_email':
202 else{ 156 return ContactFormController::sendTestEmail($this->entityManager, $json);
203 echo json_encode(['success' => false]); 157
204 die; 158 /* -- page emails -- */
159 case 'delete_email':
160 return ContactFormController::deleteEmail($this->entityManager, $json);
161 case 'toggle_sensitive_email':
162 return ContactFormController::toggleSensitiveEmail($this->entityManager, $json);
163
164 /* -- upload d'image dans tinymce par copier-coller -- */
165 // collage de HTML contenant une ou plusieurs balises <img>
166 case 'upload_image_url':
167 return ImageUploadController::uploadImageHtml();
168 // collage d'une image (code base64 dans le presse-papier) non encapsulée dans du HTML
169 case 'upload_image_base64':
170 return ImageUploadController::uploadImageBase64();
171
172 /* -- requêtes spécifiques au calendrier -- */
173 case 'new_event':
174 return CalendarController::newEvent($json, $this->entityManager);
175 case 'update_event':
176 return CalendarController::updateEvent($json, $this->entityManager);
177 case 'remove_event':
178 return CalendarController::removeEvent($json, $this->entityManager);
179
180 /* -- mode maintenance -- */
181 case 'get_logs':
182 return MaintenanceController::getLogs($this->entityManager);
183 case 'erase_logs':
184 return MaintenanceController::eraseLogs($this->entityManager);
185
186 default:
187 return new JsonResponse(['success' => false]);
205 } 188 }
206 } 189 }
207 190
208 /* -- site entier (header, footer, favicon) -- */ 191 /* -- site entier (header, footer, favicon) -- */
209 elseif($request->query->has('head_foot_text')){ 192 elseif($this->request->query->has('head_foot_text')){
210 HeadFootController::setTextData($entityManager, $request->query->get('head_foot_text'), $json); 193 return HeadFootController::setTextData($this->entityManager, $this->request->query->get('head_foot_text'), $json);
211 } 194 }
212 elseif($request->query->has('head_foot_social_check')){ 195 elseif($this->request->query->has('head_foot_social_check')){
213 HeadFootController::displaySocialNetwork($entityManager, $request->query->get('head_foot_social_check'), $json); 196 return HeadFootController::displaySocialNetwork($this->entityManager, $this->request->query->get('head_foot_social_check'), $json);
214 } 197 }
215 198
216 /* -- page Menu et chemins -- */ 199 /* -- page Menu et chemins -- */
217 elseif(isset($_GET['menu_edit'])) 200 elseif($this->request->query->has('menu_edit')){
218 {
219 // ne suit pas la règle, faire ça dans un contrôleur? 201 // ne suit pas la règle, faire ça dans un contrôleur?
220 Model::$menu = new Menu($entityManager); // récupération des données 202 Model::$menu = new Menu($this->entityManager); // récupération des données
221 203
222 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions 204 // flèche gauche <=: position = position du parent + 1, parent = grand-parent, recalculer les positions
223 if($_GET['menu_edit'] === 'move_one_level_up' && isset($json['id'])){ 205 if($this->request->query->get('menu_edit') === 'move_one_level_up' && isset($json['id'])){
224 MenuAndPathsController::MoveOneLevelUp($entityManager, $json); 206 return MenuAndPathsController::MoveOneLevelUp($this->entityManager, $json);
207 }
208 // flèche droite =>: position (léments de a fraterie + 1, l'élément précédent devient le parent
209 elseif($this->request->query->get('menu_edit') === 'move_one_level_down' && isset($json['id'])){
210 return MenuAndPathsController::MoveOneLevelDown($this->entityManager, $json);
225 } 211 }
226 // flèche droite =>: position = nombre d'éléments de la fraterie + 1, l'élément précédent devient le parent 212 elseif($this->request->query->get('menu_edit') === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){
227 elseif($_GET['menu_edit'] === 'move_one_level_down' && isset($json['id'])){ 213 return MenuAndPathsController::switchPositions($this->entityManager, $json);
228 MenuAndPathsController::MoveOneLevelDown($entityManager, $json);
229 } 214 }
230 elseif($_GET['menu_edit'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])){ 215 elseif($this->request->query->get('menu_edit') === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){
231 MenuAndPathsController::switchPositions($entityManager, $json); 216 return MenuAndPathsController::displayInMenu($this->entityManager, $json);
232 } 217 }
233 elseif($_GET['menu_edit'] === 'display_in_menu' && isset($json['id']) && isset($json['checked'])){ 218 elseif($this->request->query->get('menu_edit') === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){
234 MenuAndPathsController::displayInMenu($entityManager, $json); 219 return MenuAndPathsController::editUrl($this->entityManager, $json);
235 } 220 }
236 elseif($_GET['menu_edit'] === 'url_edit' && isset($json['id']) && isset($json['field']) && isset($json['input_data'])){ 221 else{
237 MenuAndPathsController::editUrl($entityManager, $json); 222 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
238 } 223 }
239 } 224 }
240 225
241 /* -- mode Modification d'une page -- */ 226 /* -- mode Modification d'une page -- */
242 // partie "page" 227 // partie "page"
243 elseif(isset($_GET['page_edit'])) 228 elseif($this->request->query->has('page_edit')){
244 { 229 switch($this->request->query->get('page_edit')){
245 // titre de la page 230 case 'page_title':
246 if($_GET['page_edit'] === 'page_title'){ 231 return PageManagementController::setPageTitle($this->entityManager, $json);
247 PageManagementController::setPageTitle($entityManager, $json); 232 case 'page_description':
248 } 233 return PageManagementController::setPageDescription($this->entityManager, $json);
249 // description dans les métadonnées 234 default:
250 elseif($_GET['page_edit'] === 'page_description'){ 235 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
251 PageManagementController::setPageDescription($entityManager, $json);
252 } 236 }
253 } 237 }
254 238
255 // partie "blocs" 239 // partie "blocs"
256 elseif($request->query->has('bloc_edit')) 240 elseif($this->request->query->has('bloc_edit')){
257 { 241 switch($this->request->query->get('bloc_edit')){
258 if($request->query->get('bloc_edit') === 'rename_page_bloc'){ 242 case 'rename_page_bloc':
259 PageManagementController::renameBloc($entityManager, $json); 243 return PageManagementController::renameBloc($this->entityManager, $json);
260 } 244 case 'switch_blocs_positions':
261 elseif($request->query->get('bloc_edit') === 'switch_blocs_positions'){ 245 return PageManagementController::SwitchBlocsPositions($this->entityManager, $json, $this->request->query->get('page'));
262 PageManagementController::SwitchBlocsPositions($entityManager, $json); 246 case 'change_articles_order':
263 } 247 return PageManagementController::changeArticlesOrder($this->entityManager, $json);
264 elseif($request->query->get('bloc_edit') === 'change_articles_order'){ 248 case 'change_presentation':
265 PageManagementController::changeArticlesOrder($entityManager, $json); 249 return PageManagementController::changePresentation($this->entityManager, $json);
266 } 250 case 'change_cols_min_width':
267 elseif($request->query->get('bloc_edit') === 'change_presentation'){ 251 return PageManagementController::changeColsMinWidth($this->entityManager, $json);
268 PageManagementController::changePresentation($entityManager, $json); 252 case 'change_pagination_limit':
269 } 253 return PageManagementController::changePaginationLimit($this->entityManager, $json);
270 elseif($request->query->get('bloc_edit') === 'change_cols_min_width'){ 254 default:
271 PageManagementController::changeColsMinWidth($entityManager, $json); 255 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
272 }
273 elseif($request->query->get('bloc_edit') === 'change_pagination_limit'){
274 PageManagementController::changePaginationLimit($entityManager, $json);
275 } 256 }
276 } 257 }
258
259 else{
260 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
261 }
277 } 262 }
278 263
279 /* -- upload avec FormData OU formulaire HTML AVEC fichier -- */ 264 /* -- upload avec FormData OU formulaire HTML avec fichier -- */
280 elseif(str_starts_with($request->headers->get('Content-Type'), 'multipart/form-data')) // = $_SERVER['CONTENT_TYPE'] 265 elseif(str_starts_with($this->request->headers->get('Content-Type'), 'multipart/form-data')){ // = $_SERVER['CONTENT_TYPE']
281 {
282 // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer) 266 // dans tinymce avec le plugin (bouton "insérer une image" de l'éditeur ou glisser-déposer)
283 if($request->query->has('action') && $request->query->get('action') === 'upload_image_tinymce'){ 267 if($this->request->query->get('action') === 'upload_image_tinymce'){
284 ImageUploadController::imageUploadTinyMce(); 268 return ImageUploadController::imageUploadTinyMce();
285 } 269 }
286 // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64 270 // dans tinymce, des quatre méthodes: bouton "link", drag & drop, html, base64
287 elseif($request->query->has('action') && $request->query->get('action') === 'upload_file_tinymce'){ 271 elseif($this->request->query->get('action') === 'upload_file_tinymce'){
288 FileUploadController::fileUploadTinyMce(); 272 return FileUploadController::fileUploadTinyMce();
289 } 273 }
290 elseif($request->query->has('head_foot_image')){ 274 elseif($this->request->query->has('head_foot_image')){
291 HeadFootController::uploadAsset($entityManager, $request->query->get('head_foot_image')); 275 return HeadFootController::uploadAsset($this->entityManager, $this->request->query->get('head_foot_image'));
292 } 276 }
293 277
294 /* -- page Maintenance -- */ 278 /* -- page Maintenance -- */
295 elseif($request->query->has('action') && $request->query->get('action') === 'restore_database' 279 elseif($this->request->query->get('action') === 'restore_database' && $this->request->request->get('hidden') === ''
296 && $request->request->has('hidden') && $request->get('hidden') === '' 280 && $this->request->files->has('uploaded_sql')){
297 && $request->files->has('uploaded_sql')) 281 return MaintenanceController::downloadSQL($entityManager, $request);
298 { 282 }
299 MaintenanceController::downloadSQL($entityManager, $request); 283 else{
284 // choix ici entre répondre en JSON ou par une redirection, choix du JSON pour pouvoir passer un message
285 return new JsonResponse(['success' => false, 'error' => 'bad parameters'], JsonResponse::HTTP_BAD_REQUEST); // code 400
300 } 286 }
301 } 287 }
302 288
303 // requêtes XMLHttpRequest 289 /* -- formulaire HTML sans fichier -- */
304 elseif(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') 290 elseif($this->request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
305 { 291 if($this->request->query->get('action') === 'delete_article' && $this->request->query->has('id')){
306 echo json_encode(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR 292 return ArticleController::deleteArticle($this->entityManager, $this->request); // version formulaire
307 die;
308 }
309
310 /* -- formulaire HTML SANS fichier -- */
311 elseif($request->headers->get('Content-Type') === 'application/x-www-form-urlencoded')
312 {
313 if($request->query->has('action') && $request->query->get('action') === 'delete_article' && isset($_GET['id'])){
314 $response = ArticleController::deleteArticle($entityManager, $_GET); // version formulaire
315 } 293 }
316 294
317 /* -- nouvelle page -- */ 295 /* -- nouvelle page -- */
318 elseif(isset($_POST['page_name']) && $_POST['page_name'] !== null 296 elseif($this->request->request->get('page_name') !== null
319 && isset($_POST['page_name_path']) && $_POST['page_name_path'] !== null 297 && $this->request->request->get('page_name_path') !== null
320 && isset($_POST['page_location']) && $_POST['page_location'] !== null 298 && $this->request->request->get('page_location') !== null
321 && isset($_POST['page_description']) && $_POST['page_description'] !== null 299 && $this->request->request->get('page_description') !== null
322 && isset($_POST['new_page_hidden']) && $_POST['new_page_hidden'] === '') 300 && $this->request->request->get('new_page_hidden') === ''){
323 { 301 return PageManagementController::newPage($this->entityManager, $this->request->request);
324 PageManagementController::newPage($entityManager, $_POST);
325 } 302 }
326 303
327 /* -- suppression d'une page -- */ 304 /* -- suppression d'une page -- */
328 elseif(isset($_POST['page_id']) && $_POST['page_id'] !== null 305 elseif($this->request->request->get('page_id') !== null
329 && isset($_POST['submit_hidden']) && $_POST['submit_hidden'] === '') 306 && $this->request->request->get('submit_hidden') === ''){
330 { 307 return PageManagementController::deletePage($this->entityManager, $this->request->request->get('page_id'));
331 PageManagementController::deletePage($entityManager);
332 } 308 }
333 309
334 310
335 /* -- mode Modification d'une page -- */ 311 /* -- mode Modification d'une page -- */
336 // modification du chemins en snake_case 312 // modification du chemins en snake_case
337 elseif(isset($_POST['page_menu_path']) && $_POST['page_menu_path'] !== null 313 elseif($this->request->request->get('page_menu_path') !== null
338 && isset($_POST['page_id']) && $_POST['page_id'] !== null 314 && $this->request->request->get('page_id') !== null
339 && isset($_POST['page_name_path_hidden']) && $_POST['page_name_path_hidden'] === '') 315 && $this->request->request->get('page_name_path_hidden') === ''){
340 { 316 return PageManagementController::updatePageMenuPath($this->entityManager, $this->request->request->get('page_menu_path'));
341 PageManagementController::updatePageMenuPath($entityManager);
342 } 317 }
343 // ajout d'un bloc dans une page 318 // ajout d'un bloc dans une page
344 elseif(isset($_POST['bloc_title']) && $_POST['bloc_title'] !== null 319 elseif($this->request->request->get('bloc_title') !== null
345 && isset($_POST['bloc_select']) && $_POST['bloc_select'] !== null 320 && $this->request->request->get('bloc_select') !== null
346 && isset($_POST['bloc_title_hidden']) && $_POST['bloc_title_hidden'] === '') // contrôle anti-robot avec input hidden 321 && $this->request->request->get('bloc_title_hidden') === ''){ // contrôle anti-robot avec input hidden
347 { 322 return PageManagementController::addBloc($this->entityManager, $this->request);
348 PageManagementController::addBloc($entityManager);
349 } 323 }
350 // suppression d'un bloc de page 324 // suppression d'un bloc de page
351 elseif(isset($_POST['delete_bloc_id']) && $_POST['delete_bloc_id'] !== null 325 elseif($this->request->request->get('delete_bloc_id') !== null
352 && isset($_POST['delete_bloc_hidden']) && $_POST['delete_bloc_hidden'] === '') // contrôle anti-robot avec input hidden 326 && $this->request->request->get('delete_bloc_hidden') === ''){ // contrôle anti-robot avec input hidden
353 { 327 return PageManagementController::deleteBloc($this->entityManager, $this->request);
354 PageManagementController::deleteBloc($entityManager);
355 } 328 }
356 329
357 330
358 /* -- page Menu et chemins -- */ 331 /* -- page Menu et chemins -- */
359 // création d'une entrée de menu avec une URL 332 // création d'une entrée de menu avec une URL
360 elseif(isset($_POST["label_input"]) && isset($_POST["url_input"]) && isset($_POST["location"])){ 333 elseif($this->request->request->has("label_input") && $this->request->request->has("url_input") && $this->request->request->has("location")){
361 MenuAndPathsController::newUrlMenuEntry($entityManager); 334 return MenuAndPathsController::newUrlMenuEntry($this->entityManager);
362 } 335 }
363 // suppression d'une entrée de menu avec une URL 336 // suppression d'une entrée de menu avec une URL
364 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 337 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
365 MenuAndPathsController::deleteUrlMenuEntry($entityManager); 338 return MenuAndPathsController::deleteUrlMenuEntry($this->entityManager);
366 } 339 }
367 340
368 341
369 /* -- page Mon compte -- */ 342 /* -- page Mon compte -- */
370 elseif($request->query->has('action') && $request->query->get('action') === 'update_username') 343 elseif($this->request->query->get('action') === 'update_username'){
371 { 344 return UserController::updateUsername($this->entityManager);
372 UserController::updateUsername($entityManager);
373 } 345 }
374 elseif($request->query->has('action') && $request->query->get('action') === 'update_password') 346 elseif($this->request->query->get('action') === 'update_password'){
375 { 347 return UserController::updatePassword($this->entityManager);
376 UserController::updatePassword($entityManager);
377 } 348 }
378 349
379 /* -- page Maintenance -- */ 350 /* -- page Maintenance -- */
380 elseif($request->query->has('action') && $request->query->get('action') === 'restore_database' 351 elseif($this->request->query->get('action') === 'restore_database' && $this->request->get('hidden') === '' && $this->request->request->has('selected_sql')){
381 && $request->request->has('hidden') && $request->get('hidden') === '' 352 return MaintenanceController::handleBackupSelection($this->entityManager, $this->request);
382 && $request->request->has('selected_sql'))
383 {
384 MaintenanceController::handleBackupSelection($entityManager, $request);
385 } 353 }
386 354
387 // redirection page d'accueil 355 // redirection page d'accueil
388 else{ 356 return new RedirectResponse((string)new URL(['error' => 'paramètres inconnus']));
389 header("Location: " . new URL(['error' => 'paramètres inconnus']));
390 die;
391 }
392 } 357 }
393 358
394 // POST admin ne matchant pas 359 // requêtes XMLHttpRequest
395 else{ 360 elseif($this->request->isXmlHttpRequest()){
396 echo json_encode(['success' => false]); 361 return new JsonResponse(['success' => false]); // noyer le poisson en laissant penser que le site gère les requêtes XHR
397 die;
398 } 362 }
363
364 // POST admin ne matchant pas
365 return new Response('bad parameters', Response::HTTP_BAD_REQUEST); // code 400
399 } 366 }
400 // POST non admin ne matchant pas
401 else{
402 echo json_encode(['success' => false]);
403 die;
404 }
405 }
406 367
407 // méthode inconnue 368 // POST non-admin ne matchant pas
408 else{ 369 return new Response('bad parameters', Response::HTTP_BAD_REQUEST); // code 400
409 header("Location: " . new URL(['error' => 'tu fais quoi là mec?']));
410 die;
411 } 370 }
412 371
413 372 // méthode HTTP inconnue
414
415 /* -- utilisation de la réponse -- */
416 if(isset($response)){
417 // 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
418 if($request->isMethod('GET') && $response->getStatusCode() == 302){ // 302 redirection temporaire
419 header('Location: ' . new URL(['page' => $_GET['from'] ?? '']));
420 }
421 // redirection après traitement de formulaires HTTP
422 elseif($request->getMethod() === 'POST' && $request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){
423 $response_data = json_decode(($response)->getContent(), true);
424 $url = new URL(['page' => $_GET['from'] ?? '']);
425 $url->addParams(['success' => $response_data['success'], 'message' => $response_data['message']]);
426 header('Location: ' . $url);
427 }
428 // affichage d'une page OU requête AJAX
429 else{
430 $response->send();
431 }
432 }
433 // pas utilisation de RESPONSE (cas destiné à disparaître)
434 else{ 373 else{
435 if($request->getMethod() === 'POST' && $request->headers->get('Content-Type') === 'application/x-www-form-urlencoded'){ 374 return new RedirectResponse((string)new URL(['error' => 'tu fais quoi là mec?']));
436 header("Location: " . new URL(['error' => 'erreur côté serveur']));
437 }
438 else{
439 http_response_code(500);
440 echo "erreur côté serveur";
441 }
442 } 375 }
443 } 376 }
444} \ No newline at end of file 377} \ No newline at end of file
diff --git a/src/service/User.php b/src/service/User.php
new file mode 100644
index 0000000..bd17dce
--- /dev/null
+++ b/src/service/User.php
@@ -0,0 +1,23 @@
1<?php
2// src/service/User.php
3
4declare(strict_types=1);
5
6use Doctrine\ORM\EntityManager;
7
8class User{
9 static public function existUsers(EntityManager $entityManager): bool
10 {
11 if(!$entityManager // table vide
12 ->createQuery("SELECT u FROM App\Entity\User u")
13 ->setMaxResults(1)
14 ->getOneOrNullResult())
15 {
16 unset($_SESSION['user']);
17 return false;
18 }
19 else{
20 return true;
21 }
22 }
23} \ No newline at end of file