diff options
author | polo <ordipolo@gmx.fr> | 2025-08-26 20:34:38 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2025-08-26 20:34:38 +0200 |
commit | 6c28cf85e1b5921e4fb77be230651bc22e83b801 (patch) | |
tree | f42e38a5a389a0b3960ed9d085998aee668be3aa | |
parent | fdbc0d2c6366019249d19ed387df877eda90b320 (diff) | |
download | cms-6c28cf85e1b5921e4fb77be230651bc22e83b801.zip |
redirections correctes et bouton supprimer page article, ArticleController::deleteArticle renvoie une Response
-rw-r--r-- | public/css/body.css | 5 | ||||
-rw-r--r-- | public/js/tinymce.js | 27 | ||||
-rw-r--r-- | src/controller/ArticleController.php | 23 | ||||
-rw-r--r-- | src/router.php | 21 | ||||
-rw-r--r-- | src/view/NewBuilder.php | 26 | ||||
-rw-r--r-- | src/view/templates/new.php | 1 |
6 files changed, 62 insertions, 41 deletions
diff --git a/public/css/body.css b/public/css/body.css index 274627c..17bdad5 100644 --- a/public/css/body.css +++ b/public/css/body.css | |||
@@ -188,6 +188,11 @@ button .action_icon:hover | |||
188 | display: flex; | 188 | display: flex; |
189 | justify-content: end; | 189 | justify-content: end; |
190 | } | 190 | } |
191 | .delete_button | ||
192 | { | ||
193 | float: right; | ||
194 | margin-left: 2px; | ||
195 | } | ||
191 | section button, section input[type=submit] | 196 | section button, section input[type=submit] |
192 | { | 197 | { |
193 | color: #ff1d04; | 198 | color: #ff1d04; |
diff --git a/public/js/tinymce.js b/public/js/tinymce.js index 18974af..29b82bf 100644 --- a/public/js/tinymce.js +++ b/public/js/tinymce.js | |||
@@ -184,20 +184,13 @@ function deleteArticle(id, page = '') { | |||
184 | .then(data => { | 184 | .then(data => { |
185 | if(data.success) | 185 | if(data.success) |
186 | { | 186 | { |
187 | if(page === 'article'){ | 187 | // Supprimer l'article du DOM |
188 | // redirection vers la page d'accueil | 188 | const articleElement = document.getElementById(id); |
189 | window.setTimeout(function(){ | 189 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus |
190 | location.href = "index.php?page=accueil"; | 190 | toastNotify("L'article a été supprimé."); |
191 | }, 0); | ||
192 | } | ||
193 | else{ | ||
194 | // Supprimer l'article du DOM | ||
195 | const articleElement = document.getElementById(id); | ||
196 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus | ||
197 | } | ||
198 | } | 191 | } |
199 | else { | 192 | else { |
200 | alert('Erreur lors de la suppression de l\'article.'); | 193 | toastNotify('Erreur lors de la suppression de l\'article.'); |
201 | } | 194 | } |
202 | }) | 195 | }) |
203 | .catch(error => { | 196 | .catch(error => { |
@@ -261,7 +254,7 @@ function submitArticle(id, page = '', clone = null) | |||
261 | var content; | 254 | var content; |
262 | const params = new URL(document.location).searchParams; // "search" = ? et paramètres, searchParams = objet avec des getters | 255 | const params = new URL(document.location).searchParams; // "search" = ? et paramètres, searchParams = objet avec des getters |
263 | 256 | ||
264 | // clic sur "tout enregistrer" | 257 | // clic sur "Tout enregistrer" |
265 | if(id[0] === 'n' && page === 'article'){ | 258 | if(id[0] === 'n' && page === 'article'){ |
266 | const prefixes = ['t', 'p', 'i', 'd']; | 259 | const prefixes = ['t', 'p', 'i', 'd']; |
267 | const allElemsWithId = document.querySelectorAll('.data'); | 260 | const allElemsWithId = document.querySelectorAll('.data'); |
@@ -306,16 +299,16 @@ function submitArticle(id, page = '', clone = null) | |||
306 | }) | 299 | }) |
307 | .then(response => response.json()) | 300 | .then(response => response.json()) |
308 | .then(data => { | 301 | .then(data => { |
309 | if (data.success) { | 302 | if(data.success) { |
310 | //console.log(data.article_id); | 303 | //console.log(data.article_id); |
311 | if(id[0] === 'n' && page === 'article'){ | 304 | if(id[0] === 'n' && page === 'article'){ |
312 | console.log('données envoyées au serveur avec succès.'); | 305 | console.log('données envoyées au serveur avec succès.'); |
313 | 306 | ||
314 | // redirection page de l'article | 307 | // redirection page de l'article |
315 | window.setTimeout(function(){ | 308 | window.setTimeout(function(){ |
316 | location.href = "index.php?page=article&id=" + data.article_id; | 309 | const url_params = new URLSearchParams(window.location.search); // le "$_GET" de javascript |
310 | location.href = "index.php?page=article&id=" + data.article_id + "&from=" + url_params.get('from'); | ||
317 | }, 0); | 311 | }, 0); |
318 | |||
319 | } | 312 | } |
320 | else{ | 313 | else{ |
321 | // Fermer l'éditeur et mettre à jour le contenu de l'article | 314 | // Fermer l'éditeur et mettre à jour le contenu de l'article |
@@ -325,7 +318,7 @@ function submitArticle(id, page = '', clone = null) | |||
325 | } | 318 | } |
326 | } | 319 | } |
327 | } | 320 | } |
328 | else { | 321 | else{ |
329 | alert('Erreur lors de la sauvegarde de l\'article.'); | 322 | alert('Erreur lors de la sauvegarde de l\'article.'); |
330 | } | 323 | } |
331 | }) | 324 | }) |
diff --git a/src/controller/ArticleController.php b/src/controller/ArticleController.php index 078754a..a982d8c 100644 --- a/src/controller/ArticleController.php +++ b/src/controller/ArticleController.php | |||
@@ -6,6 +6,7 @@ declare(strict_types=1); | |||
6 | use App\Entity\Node; | 6 | use App\Entity\Node; |
7 | use App\Entity\Article; | 7 | use App\Entity\Article; |
8 | use Doctrine\ORM\EntityManager; | 8 | use Doctrine\ORM\EntityManager; |
9 | use Symfony\Component\HttpFoundation\Response; | ||
9 | 10 | ||
10 | class ArticleController | 11 | class ArticleController |
11 | { | 12 | { |
@@ -97,7 +98,7 @@ class ArticleController | |||
97 | die; | 98 | die; |
98 | } | 99 | } |
99 | 100 | ||
100 | static public function deleteArticle(EntityManager $entityManager, array $json): void | 101 | static public function deleteArticle(EntityManager $entityManager, array $json): Response |
101 | { | 102 | { |
102 | $director = new Director($entityManager); | 103 | $director = new Director($entityManager); |
103 | $director->makeArticleNode($json['id'], true); | 104 | $director->makeArticleNode($json['id'], true); |
@@ -107,20 +108,18 @@ class ArticleController | |||
107 | $entityManager->remove($article); | 108 | $entityManager->remove($article); |
108 | $section->removeChild($article); | 109 | $section->removeChild($article); |
109 | $section->sortChildren(true); // régénère les positions | 110 | $section->sortChildren(true); // régénère les positions |
110 | $entityManager->flush(); | ||
111 | |||
112 | // test avec une nouvelle requête qui ne devrait rien trouver | ||
113 | if(!$director->makeArticleNode($json['id'])) | ||
114 | { | ||
115 | echo json_encode(['success' => true]); | ||
116 | 111 | ||
117 | // on pourrait afficher une notification "toast" | 112 | try{ |
113 | $entityManager->flush(); | ||
114 | return new Response( | ||
115 | '{"success": true, "message": "Article supprimé avec succès"}', | ||
116 | Response::HTTP_OK); // 200 | ||
118 | } | 117 | } |
119 | else{ | 118 | catch(Exception $e){ |
120 | http_response_code(500); | 119 | return new Response( |
121 | echo json_encode(['success' => false, 'message' => 'Erreur lors de la suppression de l\'article.']); | 120 | '{"success": false, "message": "Erreur: ' . $e->getMessage() . '"}', |
121 | Response::HTTP_INTERNAL_SERVER_ERROR); // 500 | ||
122 | } | 122 | } |
123 | die; | ||
124 | } | 123 | } |
125 | 124 | ||
126 | static public function switchPositions(EntityManager $entityManager, array $json): void | 125 | static public function switchPositions(EntityManager $entityManager, array $json): void |
diff --git a/src/router.php b/src/router.php index eddd199..8aa0aa9 100644 --- a/src/router.php +++ b/src/router.php | |||
@@ -13,7 +13,6 @@ $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' requête AJAX xhs, non uti | |||
13 | 13 | ||
14 | declare(strict_types=1); | 14 | declare(strict_types=1); |
15 | 15 | ||
16 | |||
17 | if($_SERVER['REQUEST_METHOD'] === 'GET'){ | 16 | if($_SERVER['REQUEST_METHOD'] === 'GET'){ |
18 | // table "user" vide | 17 | // table "user" vide |
19 | if(!UserController::existUsers($entityManager)){ | 18 | if(!UserController::existUsers($entityManager)){ |
@@ -95,9 +94,10 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){ | |||
95 | { | 94 | { |
96 | ArticleController::editorSubmit($entityManager, $json); | 95 | ArticleController::editorSubmit($entityManager, $json); |
97 | } | 96 | } |
98 | elseif($_GET['action'] === 'delete_article' && isset($json['id'])) | 97 | elseif($_GET['action'] === 'delete_article' && isset($json['id'])){ |
99 | { | 98 | $response = ArticleController::deleteArticle($entityManager, $json); // version AJAX |
100 | ArticleController::deleteArticle($entityManager, $json); | 99 | $response->send(); |
100 | die; | ||
101 | } | 101 | } |
102 | // inversion de la position de deux noeuds | 102 | // inversion de la position de deux noeuds |
103 | elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])) | 103 | elseif($_GET['action'] === 'switch_positions' && isset($json['id1']) && isset($json['id2'])) |
@@ -214,8 +214,19 @@ elseif($_SERVER['REQUEST_METHOD'] === 'POST'){ | |||
214 | /* -- envoi formulaire HTML -- */ | 214 | /* -- envoi formulaire HTML -- */ |
215 | elseif($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded') | 215 | elseif($_SERVER['CONTENT_TYPE'] === 'application/x-www-form-urlencoded') |
216 | { | 216 | { |
217 | if($_GET['action'] === 'delete_article' && isset($_GET['id'])){ | ||
218 | $response = json_decode(ArticleController::deleteArticle($entityManager, $_GET)->getContent(), true); // version formulaire | ||
219 | $url = new URL; | ||
220 | if(isset($_GET['from'])){ | ||
221 | $url->addParams(['page' => $_GET['from']]); | ||
222 | } | ||
223 | $url->addParams(['success' => $response['success'], 'message' => $response['message']]); | ||
224 | header('Location: ' . $url); | ||
225 | die; | ||
226 | } | ||
227 | |||
217 | /* -- nouvelle page -- */ | 228 | /* -- nouvelle page -- */ |
218 | if(isset($_POST['page_name']) && $_POST['page_name'] !== null | 229 | elseif(isset($_POST['page_name']) && $_POST['page_name'] !== null |
219 | && isset($_POST['page_name_path']) && $_POST['page_name_path'] !== null | 230 | && isset($_POST['page_name_path']) && $_POST['page_name_path'] !== null |
220 | && isset($_POST['page_location']) && $_POST['page_location'] !== null | 231 | && isset($_POST['page_location']) && $_POST['page_location'] !== null |
221 | && isset($_POST['page_description']) && $_POST['page_description'] !== null | 232 | && isset($_POST['page_description']) && $_POST['page_description'] !== null |
diff --git a/src/view/NewBuilder.php b/src/view/NewBuilder.php index fc6ade6..2d30d32 100644 --- a/src/view/NewBuilder.php +++ b/src/view/NewBuilder.php | |||
@@ -99,14 +99,28 @@ class NewBuilder extends AbstractBuilder | |||
99 | $submit_js_date = 'onclick="submitDate(\'' . $id_date . '\')"'; | 99 | $submit_js_date = 'onclick="submitDate(\'' . $id_date . '\')"'; |
100 | $submit_date = '<p id="submit-' . $id_date . '" class="hidden"><button ' . $submit_js_date . '>Valider</button></p>'; | 100 | $submit_date = '<p id="submit-' . $id_date . '" class="hidden"><button ' . $submit_js_date . '>Valider</button></p>'; |
101 | $date_buttons = '<div class="button_zone">' . $modify_date . $close_editor_date . $submit_date . '</div>'; | 101 | $date_buttons = '<div class="button_zone">' . $modify_date . $close_editor_date . $submit_date . '</div>'; |
102 | 102 | ||
103 | $submit_article = ''; | 103 | // mode nouvel article |
104 | // nouvel article: bouton pour valider la création d'un nouvel article | ||
105 | if($_GET['id'][0] != 'i'){ | 104 | if($_GET['id'][0] != 'i'){ |
105 | $delete_article = ''; | ||
106 | // valider la création d'un nouvel article | ||
106 | $submit_js = 'onclick="submitArticle(\'' . $_GET['id'] . '\', \'' . Director::$page_path->getLast()->getEndOfPath() . '\')"'; | 107 | $submit_js = 'onclick="submitArticle(\'' . $_GET['id'] . '\', \'' . Director::$page_path->getLast()->getEndOfPath() . '\')"'; |
107 | $submit_article = '<p id="save-' . $id . '"><button ' . $submit_js . '><img class="action_icon" src="assets/edit.svg">Tout<br>enregistrer</button></p>' . "\n"; | 108 | $submit_article = '<p id="save-' . $id . '"><button ' . $submit_js . '><img class="action_icon" src="assets/edit.svg"><span class="delete_button">Tout<br>enregistrer</span></button></p>' . "\n"; |
108 | } | 109 | } |
109 | $admin_buttons = $submit_article; | 110 | // mode article existant |
111 | else{ | ||
112 | // supprimer article existant | ||
113 | $url = new URL(['action' => 'delete_article', 'id' => $_GET['id'], 'from' => $_GET['from']]); | ||
114 | $delete_article = '<form id="delete-' . $id . '" method="post" onsubmit="return confirm(\'Voulez-vous vraiment supprimer cet article ?\');" action="' . $url . '"> | ||
115 | <p><button type="submit"> | ||
116 | <img class="action_icon" src="assets/delete-bin.svg"> | ||
117 | <span class="delete_button">Supprimer<br>cet article</span> | ||
118 | </button></p> | ||
119 | </form>' . "\n"; | ||
120 | $submit_article = ''; | ||
121 | } | ||
122 | |||
123 | $admin_buttons = $delete_article . $from_to_button . $submit_article; | ||
110 | } | 124 | } |
111 | // page d'accueil | 125 | // page d'accueil |
112 | else{ | 126 | else{ |
@@ -126,7 +140,7 @@ class NewBuilder extends AbstractBuilder | |||
126 | 140 | ||
127 | $submit_article = '<p id="submit-' . $id . '" class="hidden"></p>'; | 141 | $submit_article = '<p id="submit-' . $id . '" class="hidden"></p>'; |
128 | 142 | ||
129 | $admin_buttons = $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; | 143 | $admin_buttons = $from_to_button . $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; |
130 | } | 144 | } |
131 | } | 145 | } |
132 | 146 | ||
diff --git a/src/view/templates/new.php b/src/view/templates/new.php index 6533913..1b25eba 100644 --- a/src/view/templates/new.php +++ b/src/view/templates/new.php | |||
@@ -24,7 +24,6 @@ | |||
24 | </div> | 24 | </div> |
25 | <?= $date_buttons ?> | 25 | <?= $date_buttons ?> |
26 | <div class="article_admin_zone"> | 26 | <div class="article_admin_zone"> |
27 | <?= $from_to_button ?> | ||
28 | <?= $admin_buttons ?> | 27 | <?= $admin_buttons ?> |
29 | </div> | 28 | </div> |
30 | </div> | 29 | </div> |