diff options
| author | polo <ordipolo@gmx.fr> | 2025-04-06 12:18:49 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-04-06 12:18:49 +0200 |
| commit | 68b6058e2a27fc251c117c4efeb141392a0c9736 (patch) | |
| tree | 5c029b2c147bd14f777765d41bc623582c81daa2 /public | |
| parent | e4a325c9d5c07f09bc18b7e366ffb82b82c43502 (diff) | |
| download | cms-68b6058e2a27fc251c117c4efeb141392a0c9736.tar.gz cms-68b6058e2a27fc251c117c4efeb141392a0c9736.tar.bz2 cms-68b6058e2a27fc251c117c4efeb141392a0c9736.zip | |
nouvel article, boutons dans les builders, makeArticleNode, JS MAJ page, tri quand déplacement ou suppression
Diffstat (limited to 'public')
| -rw-r--r-- | public/css/main.css | 14 | ||||
| -rw-r--r-- | public/css/trombinoscope.css | 6 | ||||
| -rw-r--r-- | public/images/SAR_Constructions.jpg | bin | 0 -> 571935 bytes | |||
| -rw-r--r-- | public/images/Ysoline Rabin.jpg | bin | 0 -> 4993 bytes | |||
| -rw-r--r-- | public/images/beatrice_carre.jpg | bin | 0 -> 4475 bytes | |||
| -rw-r--r-- | public/images/eaulibre.jpg | bin | 0 -> 53251 bytes | |||
| -rw-r--r-- | public/images/frank_pouliquen.jpg | bin | 0 -> 27842 bytes | |||
| -rw-r--r-- | public/images/leclerc_bigouden.png | bin | 0 -> 82228 bytes | |||
| -rw-r--r-- | public/images/silhouette nageur.jpg | bin | 0 -> 11805 bytes | |||
| -rw-r--r-- | public/images/silhouette nageuse.jpg | bin | 0 -> 18499 bytes | |||
| -rw-r--r-- | public/images/yves_pouliquen.jpg | bin | 0 -> 37276 bytes | |||
| -rw-r--r-- | public/index.php | 4 | ||||
| -rw-r--r-- | public/js/main.js | 30 | ||||
| -rw-r--r-- | public/js/tinymce.js | 151 |
14 files changed, 173 insertions, 32 deletions
diff --git a/public/css/main.css b/public/css/main.css index 50c2173..cb44e16 100644 --- a/public/css/main.css +++ b/public/css/main.css | |||
| @@ -28,8 +28,8 @@ section > p /* boutons spéciaux mode admin */ | |||
| 28 | } | 28 | } |
| 29 | .galery_photos .html_from_editor img | 29 | .galery_photos .html_from_editor img |
| 30 | { | 30 | { |
| 31 | max-width: 400px; | 31 | max-width: 300px; |
| 32 | max-height: 250px; | 32 | max-height: 200px; |
| 33 | } | 33 | } |
| 34 | article | 34 | article |
| 35 | { | 35 | { |
| @@ -50,6 +50,11 @@ article .logo2 | |||
| 50 | { | 50 | { |
| 51 | width: 100%; | 51 | width: 100%; |
| 52 | } | 52 | } |
| 53 | article img | ||
| 54 | { | ||
| 55 | max-width: 100%; | ||
| 56 | height: auto; | ||
| 57 | } | ||
| 53 | .new_content_text | 58 | .new_content_text |
| 54 | { | 59 | { |
| 55 | max-height: 250px; | 60 | max-height: 250px; |
| @@ -120,4 +125,9 @@ main button:hover | |||
| 120 | cursor: pointer; /* curseur qui pointe du doigt */ | 125 | cursor: pointer; /* curseur qui pointe du doigt */ |
| 121 | background-color: #ffff00; | 126 | background-color: #ffff00; |
| 122 | border-radius: 4px; | 127 | border-radius: 4px; |
| 128 | } | ||
| 129 | |||
| 130 | article a:hover | ||
| 131 | { | ||
| 132 | cursor: pointer; | ||
| 123 | } \ No newline at end of file | 133 | } \ No newline at end of file |
diff --git a/public/css/trombinoscope.css b/public/css/trombinoscope.css index f42dad8..357e6b0 100644 --- a/public/css/trombinoscope.css +++ b/public/css/trombinoscope.css | |||
| @@ -1,4 +1,10 @@ | |||
| 1 | article img | 1 | article img |
| 2 | { | 2 | { |
| 3 | border-radius: 50%; | 3 | border-radius: 50%; |
| 4 | } | ||
| 5 | |||
| 6 | .grid_columns | ||
| 7 | { | ||
| 8 | /* écrase les 3 colonnes par défaut */ | ||
| 9 | grid-template-columns: repeat(4, 1fr); | ||
| 4 | } \ No newline at end of file | 10 | } \ No newline at end of file |
diff --git a/public/images/SAR_Constructions.jpg b/public/images/SAR_Constructions.jpg new file mode 100644 index 0000000..1b9cb81 --- /dev/null +++ b/public/images/SAR_Constructions.jpg | |||
| Binary files differ | |||
diff --git a/public/images/Ysoline Rabin.jpg b/public/images/Ysoline Rabin.jpg new file mode 100644 index 0000000..2ecfcc4 --- /dev/null +++ b/public/images/Ysoline Rabin.jpg | |||
| Binary files differ | |||
diff --git a/public/images/beatrice_carre.jpg b/public/images/beatrice_carre.jpg new file mode 100644 index 0000000..8db4036 --- /dev/null +++ b/public/images/beatrice_carre.jpg | |||
| Binary files differ | |||
diff --git a/public/images/eaulibre.jpg b/public/images/eaulibre.jpg new file mode 100644 index 0000000..02b1917 --- /dev/null +++ b/public/images/eaulibre.jpg | |||
| Binary files differ | |||
diff --git a/public/images/frank_pouliquen.jpg b/public/images/frank_pouliquen.jpg new file mode 100644 index 0000000..7bb3ead --- /dev/null +++ b/public/images/frank_pouliquen.jpg | |||
| Binary files differ | |||
diff --git a/public/images/leclerc_bigouden.png b/public/images/leclerc_bigouden.png new file mode 100644 index 0000000..596ead7 --- /dev/null +++ b/public/images/leclerc_bigouden.png | |||
| Binary files differ | |||
diff --git a/public/images/silhouette nageur.jpg b/public/images/silhouette nageur.jpg new file mode 100644 index 0000000..526cc0f --- /dev/null +++ b/public/images/silhouette nageur.jpg | |||
| Binary files differ | |||
diff --git a/public/images/silhouette nageuse.jpg b/public/images/silhouette nageuse.jpg new file mode 100644 index 0000000..e4f7307 --- /dev/null +++ b/public/images/silhouette nageuse.jpg | |||
| Binary files differ | |||
diff --git a/public/images/yves_pouliquen.jpg b/public/images/yves_pouliquen.jpg new file mode 100644 index 0000000..435c69e --- /dev/null +++ b/public/images/yves_pouliquen.jpg | |||
| Binary files differ | |||
diff --git a/public/index.php b/public/index.php index 3c6f261..2512d6d 100644 --- a/public/index.php +++ b/public/index.php | |||
| @@ -69,9 +69,9 @@ elseif(isset($_GET['action']) && $_GET['action'] === 'modif_mdp') | |||
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | // -- contrôleurs -- | 71 | // -- contrôleurs -- |
| 72 | $director = new Director($entityManager); | 72 | $director = new Director($entityManager, true); |
| 73 | $director->makeRootNode($id); | 73 | $director->makeRootNode($id); |
| 74 | $node = $director->getRootNode(); | 74 | $node = $director->getNode(); |
| 75 | 75 | ||
| 76 | // -- vues -- | 76 | // -- vues -- |
| 77 | $view_builder = new ViewBuilder($node); | 77 | $view_builder = new ViewBuilder($node); |
diff --git a/public/js/main.js b/public/js/main.js index 1351fea..c05eb2f 100644 --- a/public/js/main.js +++ b/public/js/main.js | |||
| @@ -30,10 +30,10 @@ function copyInClipBoard(link){ | |||
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | // complète les fonctions dans tinymce.js | 32 | // complète les fonctions dans tinymce.js |
| 33 | function switchPositions(articleId, direction) | 33 | function switchPositions(article_id, direction) |
| 34 | { | 34 | { |
| 35 | const current_article = document.getElementById(articleId).parentElement.parentElement; | 35 | const current_article = findParent(document.getElementById(article_id), 'article'); |
| 36 | var other_article = current_article; | 36 | var other_article; |
| 37 | 37 | ||
| 38 | if(direction == 'down'){ | 38 | if(direction == 'down'){ |
| 39 | other_article = current_article.nextElementSibling; | 39 | other_article = current_article.nextElementSibling; |
| @@ -41,14 +41,23 @@ function switchPositions(articleId, direction) | |||
| 41 | else if(direction == 'up'){ | 41 | else if(direction == 'up'){ |
| 42 | other_article = current_article.previousElementSibling; | 42 | other_article = current_article.previousElementSibling; |
| 43 | } | 43 | } |
| 44 | const other_article_id = other_article.querySelector('div[id]').id; | 44 | |
| 45 | var other_article_id; | ||
| 46 | try{ | ||
| 47 | other_article_id = other_article.querySelector('div[id]').id; | ||
| 48 | other_article_id = 'i' + other_article_id.slice(1); // peut mieux faire | ||
| 49 | } | ||
| 50 | catch(error){ | ||
| 51 | console.log('Inversion impossible'); | ||
| 52 | return; | ||
| 53 | } | ||
| 45 | 54 | ||
| 46 | fetch('index.php?action=switch_positions', { | 55 | fetch('index.php?action=switch_positions', { |
| 47 | method: 'POST', | 56 | method: 'POST', |
| 48 | headers: { | 57 | headers: { |
| 49 | 'Content-Type': 'application/json' | 58 | 'Content-Type': 'application/json' |
| 50 | }, | 59 | }, |
| 51 | body: JSON.stringify({ id1: articleId, id2: other_article_id }) | 60 | body: JSON.stringify({ id1: article_id, id2: other_article_id }) |
| 52 | }) | 61 | }) |
| 53 | .then(response => response.json()) | 62 | .then(response => response.json()) |
| 54 | .then(data => { | 63 | .then(data => { |
| @@ -155,4 +164,15 @@ function submitDate(id_date) | |||
| 155 | .catch(error => { | 164 | .catch(error => { |
| 156 | console.error('Erreur:', error); | 165 | console.error('Erreur:', error); |
| 157 | }); | 166 | }); |
| 167 | } | ||
| 168 | |||
| 169 | function findParent(element, tag_name) { | ||
| 170 | while (element !== null) { | ||
| 171 | if (element.tagName === tag_name.toUpperCase()) // tagName est en majuscules | ||
| 172 | { | ||
| 173 | return element; | ||
| 174 | } | ||
| 175 | element = element.parentElement; | ||
| 176 | } | ||
| 177 | return null; | ||
| 158 | } \ No newline at end of file | 178 | } \ No newline at end of file |
diff --git a/public/js/tinymce.js b/public/js/tinymce.js index d3c9739..cb1938a 100644 --- a/public/js/tinymce.js +++ b/public/js/tinymce.js | |||
| @@ -1,15 +1,26 @@ | |||
| 1 | let editors = {}; | 1 | let editors = {}; |
| 2 | 2 | ||
| 3 | function openEditor(id, page = '') { | 3 | function openEditor(id, page = '') { |
| 4 | const real_id = 'i' + id.slice(1); | 4 | var creation_mode; |
| 5 | var real_id; | ||
| 6 | var article; | ||
| 5 | 7 | ||
| 6 | // Récupérer et sauvegarder le contenu d'origine de l'article | 8 | // création ou modification d'un article? |
| 7 | const articleContent = document.getElementById(id).innerHTML; | 9 | if(id[0] === 'n'){ |
| 8 | document.getElementById(id).setAttribute('data-original-content', articleContent); | 10 | creation_mode = true; |
| 11 | article = document.getElementById(id); | ||
| 12 | } | ||
| 13 | else{ | ||
| 14 | creation_mode = false; | ||
| 15 | // Récupérer et sauvegarder le contenu d'origine de l'article | ||
| 16 | real_id = 'i' + id.slice(1); | ||
| 17 | article = document.getElementById(id); | ||
| 18 | document.getElementById(id).setAttribute('data-original-content', article.innerHTML); | ||
| 19 | } | ||
| 9 | 20 | ||
| 10 | tinymce.init({ | 21 | tinymce.init({ |
| 11 | selector: `#${id}`, | 22 | selector: `#${id}`, |
| 12 | language: 'fr_FR', // télécharger des paquets de langue ici: https://www.tiny.cloud/get-tiny/language-packages/ | 23 | language: 'fr_FR', // téléchargement ici: https://www.tiny.cloud/get-tiny/language-packages/ |
| 13 | language_url: 'js/tinymce-langs/fr_FR.js', // ou installer tweeb/tinymce-i18n avec composer | 24 | language_url: 'js/tinymce-langs/fr_FR.js', // ou installer tweeb/tinymce-i18n avec composer |
| 14 | license_key: 'gpl', | 25 | license_key: 'gpl', |
| 15 | branding: false, | 26 | branding: false, |
| @@ -23,14 +34,18 @@ function openEditor(id, page = '') { | |||
| 23 | editors[id] = editor; | 34 | editors[id] = editor; |
| 24 | 35 | ||
| 25 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 36 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" |
| 26 | document.querySelector(`#edit-${id}`).classList.add('hidden'); | ||
| 27 | document.querySelector(`#cancel-${id}`).classList.remove('hidden'); | 37 | document.querySelector(`#cancel-${id}`).classList.remove('hidden'); |
| 28 | document.querySelector(`#submit-${id}`).classList.remove('hidden'); | 38 | document.querySelector(`#submit-${id}`).classList.remove('hidden'); |
| 29 | document.querySelector(`#delete-${real_id}`).classList.add('hidden'); | 39 | if(creation_mode === false){ |
| 30 | // boutons absents page article | 40 | document.querySelector(`#edit-${id}`).classList.add('hidden'); |
| 31 | if(page != 'article'){ | 41 | document.querySelector(`#delete-${real_id}`).classList.add('hidden'); |
| 32 | document.querySelector(`#position_up-${id}`).classList.add('hidden'); | 42 | if(page != 'article'){ |
| 33 | document.querySelector(`#position_down-${id}`).classList.add('hidden'); | 43 | document.querySelector(`#position_up-${id}`).classList.add('hidden'); |
| 44 | document.querySelector(`#position_down-${id}`).classList.add('hidden'); | ||
| 45 | } | ||
| 46 | } | ||
| 47 | else{ | ||
| 48 | document.querySelector(`#new-${id}`).classList.add('hidden'); // id = new-new-id_node | ||
| 34 | } | 49 | } |
| 35 | }); | 50 | }); |
| 36 | }, | 51 | }, |
| @@ -60,7 +75,9 @@ function openEditor(id, page = '') { | |||
| 60 | }); | 75 | }); |
| 61 | 76 | ||
| 62 | // Remplacer le contenu de l'article par l'éditeur | 77 | // Remplacer le contenu de l'article par l'éditeur |
| 63 | document.getElementById(id).innerHTML = articleContent; | 78 | if(creation_mode === false){ |
| 79 | document.getElementById(id).innerHTML = article.innerHTML; | ||
| 80 | } | ||
| 64 | } | 81 | } |
| 65 | 82 | ||
| 66 | function deleteArticle(id, page = '') { | 83 | function deleteArticle(id, page = '') { |
| @@ -100,33 +117,78 @@ function deleteArticle(id, page = '') { | |||
| 100 | } | 117 | } |
| 101 | } | 118 | } |
| 102 | 119 | ||
| 103 | function closeEditor(id, page = '', display_old = true) | 120 | function closeEditor(id, page = '', restore_old = true) |
| 104 | { | 121 | { |
| 105 | const real_id = 'i' + id.slice(1); | 122 | var creation_mode; |
| 123 | var real_id; | ||
| 124 | var article; | ||
| 125 | var parent; | ||
| 126 | |||
| 127 | // création ou modification d'un article? | ||
| 128 | if(id[0] === 'n'){ | ||
| 129 | creation_mode = true; | ||
| 130 | } | ||
| 131 | else{ | ||
| 132 | creation_mode = false; | ||
| 133 | } | ||
| 106 | 134 | ||
| 107 | // Fermer l'éditeur | 135 | // Fermer l'éditeur |
| 108 | tinymce.remove(`#${id}`); | 136 | tinymce.remove(`#${id}`); |
| 109 | delete editors[id]; | 137 | delete editors[id]; |
| 110 | 138 | ||
| 139 | if(creation_mode){ | ||
| 140 | article = document.getElementById(id); | ||
| 141 | parent = findParent(article, 'section'); | ||
| 142 | } | ||
| 143 | else{ | ||
| 144 | real_id = 'i' + id.slice(1); | ||
| 145 | } | ||
| 146 | |||
| 111 | // Restaurer le contenu d'origine de l'article | 147 | // Restaurer le contenu d'origine de l'article |
| 112 | if(display_old){ | 148 | if(restore_old){ |
| 113 | const originalContent = document.getElementById(id).getAttribute('data-original-content'); | 149 | const originalContent = document.getElementById(id).getAttribute('data-original-content'); |
| 114 | document.getElementById(id).innerHTML = originalContent; | 150 | document.getElementById(id).innerHTML = originalContent; |
| 115 | } | 151 | } |
| 116 | 152 | ||
| 117 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 153 | // boutons: "Nouvel article", Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Valider" |
| 118 | document.querySelector(`#edit-${id}`).classList.remove('hidden'); | ||
| 119 | document.querySelector(`#cancel-${id}`).classList.add('hidden'); | 154 | document.querySelector(`#cancel-${id}`).classList.add('hidden'); |
| 120 | document.querySelector(`#submit-${id}`).classList.add('hidden'); | 155 | document.querySelector(`#submit-${id}`).classList.add('hidden'); |
| 121 | document.querySelector(`#delete-${real_id}`).classList.remove('hidden'); | 156 | if(creation_mode){ |
| 122 | // boutons absents page article | 157 | document.querySelector(`#new-${id}`).classList.remove('hidden'); // id = new-new-id_node |
| 158 | } | ||
| 159 | else{ | ||
| 160 | document.querySelector(`#edit-${id}`).classList.remove('hidden'); | ||
| 161 | if(page != 'article'){ | ||
| 162 | document.querySelector(`#position_up-${id}`).classList.remove('hidden'); | ||
| 163 | document.querySelector(`#position_down-${id}`).classList.remove('hidden'); | ||
| 164 | document.querySelector(`#delete-${id}`).classList.remove('hidden'); | ||
| 165 | } | ||
| 166 | } | ||
| 123 | if(page != 'article'){ | 167 | if(page != 'article'){ |
| 124 | document.querySelector(`#position_up-${id}`).classList.remove('hidden'); | 168 | /*document.querySelector(`#position_up-${id}`).classList.remove('hidden'); |
| 125 | document.querySelector(`#position_down-${id}`).classList.remove('hidden'); | 169 | document.querySelector(`#position_down-${id}`).classList.remove('hidden'); |
| 126 | } | 170 | document.querySelector(`#delete-${id}`).classList.remove('hidden');*/ |
| 171 | } | ||
| 172 | else{ | ||
| 173 | //document.querySelector(`#delete-${real_id}`).classList.remove('hidden'); | ||
| 174 | } | ||
| 175 | |||
| 127 | } | 176 | } |
| 128 | 177 | ||
| 129 | function submitArticle(id, page = '') { | 178 | function submitArticle(id, page = '', clone = null) { |
| 179 | //var creation_mode; | ||
| 180 | if(id[0] === 'n'){ | ||
| 181 | //creation_mode = true; | ||
| 182 | |||
| 183 | // sécurité | ||
| 184 | if(clone == null){ | ||
| 185 | return; | ||
| 186 | } | ||
| 187 | } | ||
| 188 | else{ | ||
| 189 | //creation_mode = false; | ||
| 190 | } | ||
| 191 | |||
| 130 | // Récupérer l'éditeur correspondant à l'article | 192 | // Récupérer l'éditeur correspondant à l'article |
| 131 | const editor = editors[id]; | 193 | const editor = editors[id]; |
| 132 | if(!editor) { | 194 | if(!editor) { |
| @@ -150,7 +212,50 @@ function submitArticle(id, page = '') { | |||
| 150 | if (data.success) { | 212 | if (data.success) { |
| 151 | // Fermer l'éditeur et mettre à jour le contenu de l'article | 213 | // Fermer l'éditeur et mettre à jour le contenu de l'article |
| 152 | closeEditor(id, page, false); | 214 | closeEditor(id, page, false); |
| 153 | document.getElementById(id).innerHTML = html; | 215 | if(id[0] === 'n'){ |
| 216 | var share_btn = document.querySelector(`.share.hidden`); // combinaison de deux classes | ||
| 217 | var new_btn = document.querySelector(`#new-${id}`); | ||
| 218 | var edit_btn = document.querySelector(`#edit-${id}`); | ||
| 219 | var pos_up_btn = document.querySelector(`#position_up-${id}`); | ||
| 220 | var pos_down_btn = document.querySelector(`#position_down-${id}`); | ||
| 221 | var delete_btn = document.querySelector(`#delete-${id}`); | ||
| 222 | var cancel_btn = document.querySelector(`#cancel-${id}`); | ||
| 223 | var submit_btn = document.querySelector(`#submit-${id}`); | ||
| 224 | |||
| 225 | share_btn.classList.remove('hidden') | ||
| 226 | new_btn.classList.add('hidden'); | ||
| 227 | edit_btn.classList.remove('hidden'); | ||
| 228 | pos_up_btn.classList.remove('hidden'); | ||
| 229 | pos_down_btn.classList.remove('hidden'); | ||
| 230 | delete_btn.classList.remove('hidden'); | ||
| 231 | //cancel_btn.classList.add('hidden'); | ||
| 232 | //submit_btn.classList.add('hidden'); | ||
| 233 | |||
| 234 | var article = document.getElementById(id); | ||
| 235 | var parent = findParent(article, 'article'); | ||
| 236 | //share_btn.setAttribute('href', '#' + data.article_id); | ||
| 237 | share_btn.setAttribute('onclick', "copyInClipBoard('" + window.location.href + data.article_id + "')"); // # de l'ancre ajouté au clic sur le lien ouvrant l'éditeur | ||
| 238 | article.id = data.article_id; | ||
| 239 | edit_btn.id = 'edit-' + data.article_id; | ||
| 240 | edit_btn.querySelector('.action_icon').setAttribute('onclick', "openEditor('" + data.article_id + "')"); | ||
| 241 | pos_up_btn.id = 'position_up-' + data.article_id; | ||
| 242 | pos_up_btn.querySelector('.action_icon').setAttribute('onclick', "switchPositions('" + data.article_id + "', 'up')"); | ||
| 243 | pos_down_btn.id = 'position_down-' + data.article_id; | ||
| 244 | pos_down_btn.querySelector('.action_icon').setAttribute('onclick', "switchPositions('" + data.article_id + "', 'down')"); | ||
| 245 | delete_btn.id = 'delete-' + data.article_id; | ||
| 246 | delete_btn.querySelector('.action_icon').setAttribute('onclick', "deleteArticle('" + data.article_id + "')"); | ||
| 247 | cancel_btn.id = 'cancel-' + data.article_id; | ||
| 248 | cancel_btn.querySelector('button').setAttribute('onclick', "closeEditor('" + data.article_id + "')"); | ||
| 249 | submit_btn.id = 'submit-' + data.article_id; | ||
| 250 | submit_btn.querySelector('button').setAttribute('onclick', "submitArticle('" + data.article_id + "')"); | ||
| 251 | |||
| 252 | var next_div = parent.nextElementSibling.nextElementSibling; | ||
| 253 | parent.parentNode.replaceChild(clone, parent); | ||
| 254 | next_div.appendChild(parent); | ||
| 255 | } | ||
| 256 | else{ | ||
| 257 | //document.getElementById(id).innerHTML = html; | ||
| 258 | } | ||
| 154 | } | 259 | } |
| 155 | else { | 260 | else { |
| 156 | alert('Erreur lors de la sauvegarde de l\'article.'); | 261 | alert('Erreur lors de la sauvegarde de l\'article.'); |
