diff options
| author | polo <ordipolo@gmx.fr> | 2025-04-02 00:00:35 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2025-04-02 00:00:35 +0200 |
| commit | e4a325c9d5c07f09bc18b7e366ffb82b82c43502 (patch) | |
| tree | b30c9c91106ebdbeef988c2c1ebd955b62051be2 | |
| parent | e91841c4e678f955e1a44bf0fa0839e84f0aacd0 (diff) | |
| download | cms-e4a325c9d5c07f09bc18b7e366ffb82b82c43502.tar.gz cms-e4a325c9d5c07f09bc18b7e366ffb82b82c43502.tar.bz2 cms-e4a325c9d5c07f09bc18b7e366ffb82b82c43502.zip | |
modification des titres, aperçus et dates des news
| -rw-r--r-- | public/css/main.css | 29 | ||||
| -rw-r--r-- | public/js/main.js | 85 | ||||
| -rw-r--r-- | public/js/tinymce.js | 75 | ||||
| -rw-r--r-- | src/controller/ajax.php | 45 | ||||
| -rw-r--r-- | src/model/entities/Article.php | 12 | ||||
| -rw-r--r-- | src/view/ArticleBuilder.php | 2 | ||||
| -rw-r--r-- | src/view/NewBuilder.php | 68 | ||||
| -rw-r--r-- | src/view/templates/article.php | 1 | ||||
| -rw-r--r-- | src/view/templates/new.php | 17 |
9 files changed, 262 insertions, 72 deletions
diff --git a/public/css/main.css b/public/css/main.css index a75b8cd..50c2173 100644 --- a/public/css/main.css +++ b/public/css/main.css | |||
| @@ -56,22 +56,39 @@ article .logo2 | |||
| 56 | overflow: hidden; | 56 | overflow: hidden; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | article .action_icon | 59 | .action_icon |
| 60 | { | 60 | { |
| 61 | width: 24px; | 61 | width: 24px; |
| 62 | vertical-align: middle; | 62 | vertical-align: bottom; |
| 63 | border: white 2px solid; /* invisible */ | 63 | border: white 2px solid; /* invisible */ |
| 64 | } | 64 | } |
| 65 | article .action_icon:hover | 65 | button .action_icon |
| 66 | { | ||
| 67 | border: none; | ||
| 68 | } | ||
| 69 | .action_icon:hover | ||
| 66 | { | 70 | { |
| 67 | background-color: #ffff00; | 71 | background-color: #ffff00; |
| 68 | border-radius: 4px; | 72 | border-radius: 4px; |
| 69 | border: lightgrey 2px outset; | 73 | border: lightgrey 2px outset; |
| 70 | } | 74 | } |
| 71 | .article_title_zone | 75 | button .action_icon:hover |
| 76 | { | ||
| 77 | border: none; | ||
| 78 | } | ||
| 79 | |||
| 80 | .button_zone | ||
| 72 | { | 81 | { |
| 73 | display: flex; | 82 | display: flex; |
| 74 | justify-content: space-between; | 83 | } |
| 84 | |||
| 85 | .share | ||
| 86 | { | ||
| 87 | float: right; | ||
| 88 | } | ||
| 89 | .article_title_zone | ||
| 90 | { | ||
| 91 | padding: 10px; | ||
| 75 | } | 92 | } |
| 76 | .under_an_article | 93 | .under_an_article |
| 77 | { | 94 | { |
| @@ -82,8 +99,8 @@ article .action_icon:hover | |||
| 82 | .under_an_article img | 99 | .under_an_article img |
| 83 | { | 100 | { |
| 84 | width: 24px; | 101 | width: 24px; |
| 85 | vertical-align: middle; | ||
| 86 | margin-right: 5px; | 102 | margin-right: 5px; |
| 103 | vertical-align: middle; | ||
| 87 | } | 104 | } |
| 88 | .article_admin_zone | 105 | .article_admin_zone |
| 89 | { | 106 | { |
diff --git a/public/js/main.js b/public/js/main.js index d985b71..1351fea 100644 --- a/public/js/main.js +++ b/public/js/main.js | |||
| @@ -63,12 +63,93 @@ function switchPositions(articleId, direction) | |||
| 63 | console.log('Inversion réussie'); | 63 | console.log('Inversion réussie'); |
| 64 | } | 64 | } |
| 65 | else{ | 65 | else{ |
| 66 | console.log('Échec de l\'inversion'); | 66 | console.error('Échec de l\'inversion'); |
| 67 | } | 67 | } |
| 68 | } | 68 | } |
| 69 | else { | 69 | else { |
| 70 | 70 | ||
| 71 | console.log('Échec de l\'inversion'); | 71 | console.error('Échec de l\'inversion'); |
| 72 | } | ||
| 73 | }) | ||
| 74 | .catch(error => { | ||
| 75 | console.error('Erreur:', error); | ||
| 76 | }); | ||
| 77 | } | ||
| 78 | |||
| 79 | function changeDate(id_date) | ||
| 80 | { | ||
| 81 | const real_id = 'i' + id_date.slice(1); | ||
| 82 | const date_span = document.getElementById(id_date); // = <span> | ||
| 83 | var old_date = date_span.innerHTML; | ||
| 84 | |||
| 85 | // changer "le 28-12-2024 à 23h14" en "2024-12-28T23:14" | ||
| 86 | let values = old_date.split(" à "); // 2 parties: date et heure | ||
| 87 | values[1] = values[1].replace('h', ':'); | ||
| 88 | values[0] = values[0].replace("le ", ""); | ||
| 89 | let date = values[0].split("-"); // tableau jj-mm-aaaa | ||
| 90 | old_date = date[2] + '-' + date[1] + "-" + date[0] + "T" + values[1]; | ||
| 91 | |||
| 92 | var label = document.createElement('label'); | ||
| 93 | label.textContent = 'Choisir une date: '; | ||
| 94 | label.id = 'label-' + id_date; | ||
| 95 | |||
| 96 | var input = document.createElement('input'); | ||
| 97 | input.type = 'datetime-local'; | ||
| 98 | input.value = old_date; | ||
| 99 | input.id = 'input-' + id_date; | ||
| 100 | |||
| 101 | var parent = date_span.parentElement; | ||
| 102 | parent.appendChild(label) | ||
| 103 | parent.appendChild(input); | ||
| 104 | |||
| 105 | date_span.classList.add('hidden'); | ||
| 106 | document.querySelector(`#edit-${id_date}`).classList.add('hidden'); | ||
| 107 | document.querySelector(`#cancel-${id_date}`).classList.remove('hidden'); | ||
| 108 | document.querySelector(`#submit-${id_date}`).classList.remove('hidden'); | ||
| 109 | } | ||
| 110 | |||
| 111 | function closeInput(id) | ||
| 112 | { | ||
| 113 | const date_span = document.getElementById(id); | ||
| 114 | const date_input = document.getElementById('input-' + id); | ||
| 115 | const date_label = document.getElementById('label-' + id); | ||
| 116 | |||
| 117 | date_span.classList.remove('hidden'); | ||
| 118 | date_input.remove(); | ||
| 119 | date_label.remove(); | ||
| 120 | document.querySelector(`#edit-${id}`).classList.remove('hidden'); | ||
| 121 | document.querySelector(`#cancel-${id}`).classList.add('hidden'); | ||
| 122 | document.querySelector(`#submit-${id}`).classList.add('hidden'); | ||
| 123 | } | ||
| 124 | |||
| 125 | function submitDate(id_date) | ||
| 126 | { | ||
| 127 | const date_input = document.getElementById('input-' + id_date); | ||
| 128 | |||
| 129 | fetch('index.php?action=date_submit', { | ||
| 130 | method: 'POST', | ||
| 131 | headers: { | ||
| 132 | 'Content-Type': 'application/json' | ||
| 133 | }, | ||
| 134 | body: JSON.stringify({id: id_date, date: date_input.value}) | ||
| 135 | }) | ||
| 136 | .then(response => response.json()) | ||
| 137 | .then(data => { | ||
| 138 | if (data.success) { | ||
| 139 | // modifier la date dans le <span> caché | ||
| 140 | const date_span = document.getElementById(id_date); | ||
| 141 | let date = new Date(date_input.value); | ||
| 142 | date_span.innerHTML = | ||
| 143 | 'le ' + String(date.getDate()).padStart(2, '0') + '-' + | ||
| 144 | String(date.getMonth() + 1).padStart(2, '0') + '-' + | ||
| 145 | String(date.getFullYear()).padStart(4, '0') + ' à ' + | ||
| 146 | String(date.getHours()).padStart(2, '0') + 'h' + | ||
| 147 | String(date.getMinutes()).padStart(2, '0'); | ||
| 148 | |||
| 149 | closeInput(id_date); | ||
| 150 | } | ||
| 151 | else { | ||
| 152 | console.error('Erreur lors de la sauvegarde de la date.'); | ||
| 72 | } | 153 | } |
| 73 | }) | 154 | }) |
| 74 | .catch(error => { | 155 | .catch(error => { |
diff --git a/public/js/tinymce.js b/public/js/tinymce.js index 8aeaac8..d3c9739 100644 --- a/public/js/tinymce.js +++ b/public/js/tinymce.js | |||
| @@ -1,12 +1,14 @@ | |||
| 1 | let editors = {}; | 1 | let editors = {}; |
| 2 | 2 | ||
| 3 | function openEditor(articleId, page = '') { | 3 | function openEditor(id, page = '') { |
| 4 | const real_id = 'i' + id.slice(1); | ||
| 5 | |||
| 4 | // Récupérer et sauvegarder le contenu d'origine de l'article | 6 | // Récupérer et sauvegarder le contenu d'origine de l'article |
| 5 | const articleContent = document.getElementById(articleId).innerHTML; | 7 | const articleContent = document.getElementById(id).innerHTML; |
| 6 | document.getElementById(articleId).setAttribute('data-original-content', articleContent); | 8 | document.getElementById(id).setAttribute('data-original-content', articleContent); |
| 7 | 9 | ||
| 8 | tinymce.init({ | 10 | tinymce.init({ |
| 9 | selector: `#${articleId}`, | 11 | selector: `#${id}`, |
| 10 | language: 'fr_FR', // télécharger des paquets de langue ici: https://www.tiny.cloud/get-tiny/language-packages/ | 12 | language: 'fr_FR', // télécharger des paquets de langue ici: https://www.tiny.cloud/get-tiny/language-packages/ |
| 11 | language_url: 'js/tinymce-langs/fr_FR.js', // ou installer tweeb/tinymce-i18n avec composer | 13 | language_url: 'js/tinymce-langs/fr_FR.js', // ou installer tweeb/tinymce-i18n avec composer |
| 12 | license_key: 'gpl', | 14 | license_key: 'gpl', |
| @@ -18,19 +20,18 @@ function openEditor(articleId, page = '') { | |||
| 18 | statusbar: false, | 20 | statusbar: false, |
| 19 | setup: function (editor) { | 21 | setup: function (editor) { |
| 20 | editor.on('init', function () { | 22 | editor.on('init', function () { |
| 21 | editors[articleId] = editor; | 23 | editors[id] = editor; |
| 22 | 24 | ||
| 23 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 25 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" |
| 24 | document.querySelector(`#edit-${articleId}`).classList.add('hidden'); | 26 | document.querySelector(`#edit-${id}`).classList.add('hidden'); |
| 25 | document.querySelector(`#delete-${articleId}`).classList.add('hidden'); | 27 | document.querySelector(`#cancel-${id}`).classList.remove('hidden'); |
| 28 | document.querySelector(`#submit-${id}`).classList.remove('hidden'); | ||
| 29 | document.querySelector(`#delete-${real_id}`).classList.add('hidden'); | ||
| 26 | // boutons absents page article | 30 | // boutons absents page article |
| 27 | if(page != 'article'){ | 31 | if(page != 'article'){ |
| 28 | document.querySelector(`#position_up-${articleId}`).classList.add('hidden'); | 32 | document.querySelector(`#position_up-${id}`).classList.add('hidden'); |
| 29 | document.querySelector(`#position_down-${articleId}`).classList.add('hidden'); | 33 | document.querySelector(`#position_down-${id}`).classList.add('hidden'); |
| 30 | } | 34 | } |
| 31 | document.querySelector(`#cancel-${articleId}`).classList.remove('hidden'); | ||
| 32 | document.querySelector(`#submit-${articleId}`).classList.remove('hidden'); | ||
| 33 | |||
| 34 | }); | 35 | }); |
| 35 | }, | 36 | }, |
| 36 | // upload d'image | 37 | // upload d'image |
| @@ -59,10 +60,10 @@ function openEditor(articleId, page = '') { | |||
| 59 | }); | 60 | }); |
| 60 | 61 | ||
| 61 | // Remplacer le contenu de l'article par l'éditeur | 62 | // Remplacer le contenu de l'article par l'éditeur |
| 62 | document.getElementById(articleId).innerHTML = articleContent; | 63 | document.getElementById(id).innerHTML = articleContent; |
| 63 | } | 64 | } |
| 64 | 65 | ||
| 65 | function deleteArticle(articleId, page = '') { | 66 | function deleteArticle(id, page = '') { |
| 66 | if (confirm('Voulez-vous vraiment supprimer cet article ?')) | 67 | if (confirm('Voulez-vous vraiment supprimer cet article ?')) |
| 67 | { | 68 | { |
| 68 | // Envoyer une requête au serveur pour supprimer l'article | 69 | // Envoyer une requête au serveur pour supprimer l'article |
| @@ -71,7 +72,7 @@ function deleteArticle(articleId, page = '') { | |||
| 71 | headers: { | 72 | headers: { |
| 72 | 'Content-Type': 'application/json' | 73 | 'Content-Type': 'application/json' |
| 73 | }, | 74 | }, |
| 74 | body: JSON.stringify({ id: articleId }) | 75 | body: JSON.stringify({ id: id }) |
| 75 | }) | 76 | }) |
| 76 | .then(response => response.json()) | 77 | .then(response => response.json()) |
| 77 | .then(data => { | 78 | .then(data => { |
| @@ -85,7 +86,7 @@ function deleteArticle(articleId, page = '') { | |||
| 85 | } | 86 | } |
| 86 | else{ | 87 | else{ |
| 87 | // Supprimer l'article du DOM | 88 | // Supprimer l'article du DOM |
| 88 | const articleElement = document.getElementById(articleId); | 89 | const articleElement = document.getElementById(id); |
| 89 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus | 90 | articleElement.parentElement.parentElement.remove(); // <article> est deux niveau au dessus |
| 90 | } | 91 | } |
| 91 | } | 92 | } |
| @@ -99,40 +100,42 @@ function deleteArticle(articleId, page = '') { | |||
| 99 | } | 100 | } |
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | function closeEditor(articleId, page = '', display_old = true) | 103 | function closeEditor(id, page = '', display_old = true) |
| 103 | { | 104 | { |
| 105 | const real_id = 'i' + id.slice(1); | ||
| 106 | |||
| 104 | // Fermer l'éditeur | 107 | // Fermer l'éditeur |
| 105 | tinymce.remove(`#${articleId}`); | 108 | tinymce.remove(`#${id}`); |
| 106 | delete editors[articleId]; | 109 | delete editors[id]; |
| 107 | 110 | ||
| 108 | // Restaurer le contenu d'origine de l'article | 111 | // Restaurer le contenu d'origine de l'article |
| 109 | if(display_old){ | 112 | if(display_old){ |
| 110 | const originalContent = document.getElementById(articleId).getAttribute('data-original-content'); | 113 | const originalContent = document.getElementById(id).getAttribute('data-original-content'); |
| 111 | document.getElementById(articleId).innerHTML = originalContent; | 114 | document.getElementById(id).innerHTML = originalContent; |
| 112 | } | 115 | } |
| 113 | 116 | ||
| 114 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" | 117 | // boutons "Modifier", "Supprimer", "déplacer vers le haut", "déplacer vers le bas", "Annuler" et "Soumettre" |
| 115 | document.querySelector(`#edit-${articleId}`).classList.remove('hidden'); | 118 | document.querySelector(`#edit-${id}`).classList.remove('hidden'); |
| 116 | document.querySelector(`#delete-${articleId}`).classList.remove('hidden'); | 119 | document.querySelector(`#cancel-${id}`).classList.add('hidden'); |
| 120 | document.querySelector(`#submit-${id}`).classList.add('hidden'); | ||
| 121 | document.querySelector(`#delete-${real_id}`).classList.remove('hidden'); | ||
| 117 | // boutons absents page article | 122 | // boutons absents page article |
| 118 | if(page != 'article'){ | 123 | if(page != 'article'){ |
| 119 | document.querySelector(`#position_up-${articleId}`).classList.remove('hidden'); | 124 | document.querySelector(`#position_up-${id}`).classList.remove('hidden'); |
| 120 | document.querySelector(`#position_down-${articleId}`).classList.remove('hidden'); | 125 | document.querySelector(`#position_down-${id}`).classList.remove('hidden'); |
| 121 | } | 126 | } |
| 122 | document.querySelector(`#cancel-${articleId}`).classList.add('hidden'); | ||
| 123 | document.querySelector(`#submit-${articleId}`).classList.add('hidden'); | ||
| 124 | } | 127 | } |
| 125 | 128 | ||
| 126 | function submitArticle(articleId, page = '') { | 129 | function submitArticle(id, page = '') { |
| 127 | // Récupérer l'éditeur correspondant à l'article | 130 | // Récupérer l'éditeur correspondant à l'article |
| 128 | const editor = editors[articleId]; | 131 | const editor = editors[id]; |
| 129 | if (!editor) { | 132 | if(!editor) { |
| 130 | console.error('Éditeur non trouvé pour l\'article:', articleId); | 133 | console.error('Éditeur non trouvé pour l\'article:', id); |
| 131 | return; | 134 | return; |
| 132 | } | 135 | } |
| 133 | 136 | ||
| 134 | // Récupérer le contenu de l'éditeur | 137 | // Récupérer le contenu de l'éditeur |
| 135 | const newContent = editor.getContent(); | 138 | const html = editor.getContent(); |
| 136 | 139 | ||
| 137 | // Envoi AJAX au serveur | 140 | // Envoi AJAX au serveur |
| 138 | fetch('index.php?action=editor_submit', { | 141 | fetch('index.php?action=editor_submit', { |
| @@ -140,14 +143,14 @@ function submitArticle(articleId, page = '') { | |||
| 140 | headers: { | 143 | headers: { |
| 141 | 'Content-Type': 'application/json' | 144 | 'Content-Type': 'application/json' |
| 142 | }, | 145 | }, |
| 143 | body: JSON.stringify({id: articleId, content: newContent}) | 146 | body: JSON.stringify({id: id, content: html}) |
| 144 | }) | 147 | }) |
| 145 | .then(response => response.json()) | 148 | .then(response => response.json()) |
| 146 | .then(data => { | 149 | .then(data => { |
| 147 | if (data.success) { | 150 | if (data.success) { |
| 148 | // Fermer l'éditeur et mettre à jour le contenu de l'article | 151 | // Fermer l'éditeur et mettre à jour le contenu de l'article |
| 149 | closeEditor(articleId, page, false); | 152 | closeEditor(id, page, false); |
| 150 | document.getElementById(articleId).innerHTML = newContent; | 153 | document.getElementById(id).innerHTML = html; |
| 151 | } | 154 | } |
| 152 | else { | 155 | else { |
| 153 | alert('Erreur lors de la sauvegarde de l\'article.'); | 156 | alert('Erreur lors de la sauvegarde de l\'article.'); |
diff --git a/src/controller/ajax.php b/src/controller/ajax.php index bcba3f2..86acd39 100644 --- a/src/controller/ajax.php +++ b/src/controller/ajax.php | |||
| @@ -14,16 +14,32 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action'])) | |||
| 14 | { | 14 | { |
| 15 | if(json_last_error() === JSON_ERROR_NONE) | 15 | if(json_last_error() === JSON_ERROR_NONE) |
| 16 | { | 16 | { |
| 17 | $articleId = $json['id']; | 17 | $id = $json['id']; |
| 18 | $id[0] = 'i'; | ||
| 18 | $content = Security::secureString($json['content']); | 19 | $content = Security::secureString($json['content']); |
| 19 | 20 | ||
| 20 | $director = new Director($entityManager); | 21 | $director = new Director($entityManager); |
| 21 | if($director->makeArticleNode($articleId)) // une entrée est trouvée | 22 | if($director->makeArticleNode($id)) // une entrée est trouvée |
| 22 | { | 23 | { |
| 23 | $node = $director->getRootNode(); | 24 | $node = $director->getRootNode(); |
| 24 | $node->getArticle()->setContent($content); | 25 | switch($json['id'][0]){ |
| 26 | case 'i': | ||
| 27 | $node->getArticle()->setContent($content); | ||
| 28 | break; | ||
| 29 | case 'p': | ||
| 30 | $node->getArticle()->setPreview($content); // html de l'éditeur | ||
| 31 | break; | ||
| 32 | case 't': | ||
| 33 | $node->getArticle()->setTitle($content); // html de l'éditeur | ||
| 34 | break; | ||
| 35 | case 'd': | ||
| 36 | echo json_encode(['success' => false, 'message' => 'l\'action editor_submit ne supporte pas les dates, utiliser date_submit.']); | ||
| 37 | die; | ||
| 38 | default: | ||
| 39 | echo json_encode(['success' => false, 'message' => 'identifiant non utilisable']); | ||
| 40 | die; | ||
| 41 | } | ||
| 25 | $entityManager->flush(); | 42 | $entityManager->flush(); |
| 26 | |||
| 27 | echo json_encode(['success' => true]); | 43 | echo json_encode(['success' => true]); |
| 28 | } | 44 | } |
| 29 | else{ | 45 | else{ |
| @@ -37,16 +53,16 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action'])) | |||
| 37 | } | 53 | } |
| 38 | elseif($_GET['action'] === 'delete_article' && isset($json['id'])) | 54 | elseif($_GET['action'] === 'delete_article' && isset($json['id'])) |
| 39 | { | 55 | { |
| 40 | $articleId = $json['id']; | 56 | $id = $json['id']; |
| 41 | 57 | ||
| 42 | $director = new Director($entityManager); | 58 | $director = new Director($entityManager); |
| 43 | $director->makeArticleNode($articleId); | 59 | $director->makeArticleNode($id); |
| 44 | $node = $director->getRootNode(); | 60 | $node = $director->getRootNode(); |
| 45 | $entityManager->remove($node); | 61 | $entityManager->remove($node); |
| 46 | $entityManager->flush(); | 62 | $entityManager->flush(); |
| 47 | 63 | ||
| 48 | // test avec une nouvelle requête qui ne devrait rien trouver | 64 | // test avec une nouvelle requête qui ne devrait rien trouver |
| 49 | if(!$director->makeArticleNode($articleId)) | 65 | if(!$director->makeArticleNode($id)) |
| 50 | { | 66 | { |
| 51 | echo json_encode(['success' => true]); | 67 | echo json_encode(['success' => true]); |
| 52 | 68 | ||
| @@ -75,6 +91,21 @@ if($_SERVER['CONTENT_TYPE'] === 'application/json' && isset($_GET['action'])) | |||
| 75 | echo json_encode(['success' => true]); | 91 | echo json_encode(['success' => true]); |
| 76 | die; | 92 | die; |
| 77 | } | 93 | } |
| 94 | elseif($_GET['action'] === 'date_submit' && isset($json['id']) && isset($json['date'])) | ||
| 95 | { | ||
| 96 | $id = $json['id']; | ||
| 97 | $id[0] = 'i'; | ||
| 98 | $date = new DateTime($json['date']); | ||
| 99 | |||
| 100 | $director = new Director($entityManager); | ||
| 101 | $director->makeArticleNode($id); | ||
| 102 | $node = $director->getRootNode(); | ||
| 103 | $node->getArticle()->setDateTime($date); | ||
| 104 | $entityManager->flush(); | ||
| 105 | |||
| 106 | echo json_encode(['success' => true]); | ||
| 107 | die; | ||
| 108 | } | ||
| 78 | } | 109 | } |
| 79 | 110 | ||
| 80 | // détection des requêtes d'upload d'image de tinymce | 111 | // détection des requêtes d'upload d'image de tinymce |
diff --git a/src/model/entities/Article.php b/src/model/entities/Article.php index 3b846da..601e573 100644 --- a/src/model/entities/Article.php +++ b/src/model/entities/Article.php | |||
| @@ -49,6 +49,10 @@ class Article | |||
| 49 | { | 49 | { |
| 50 | return $this->date_time; | 50 | return $this->date_time; |
| 51 | } | 51 | } |
| 52 | public function setDateTime(\DateTime $date_time): void | ||
| 53 | { | ||
| 54 | $this->date_time = $date_time; | ||
| 55 | } | ||
| 52 | public function getTimestamp(): int | 56 | public function getTimestamp(): int |
| 53 | { | 57 | { |
| 54 | return $this->date_time->getTimestamp(); | 58 | return $this->date_time->getTimestamp(); |
| @@ -57,10 +61,18 @@ class Article | |||
| 57 | { | 61 | { |
| 58 | return $this->title; | 62 | return $this->title; |
| 59 | } | 63 | } |
| 64 | public function setTitle(string $title): void | ||
| 65 | { | ||
| 66 | $this->title = $title; | ||
| 67 | } | ||
| 60 | public function getPreview(): string | 68 | public function getPreview(): string |
| 61 | { | 69 | { |
| 62 | return $this->preview; | 70 | return $this->preview; |
| 63 | } | 71 | } |
| 72 | public function setPreview(string $preview): void | ||
| 73 | { | ||
| 74 | $this->preview = $preview; | ||
| 75 | } | ||
| 64 | public function getContent(): string | 76 | public function getContent(): string |
| 65 | { | 77 | { |
| 66 | return $this->content; | 78 | return $this->content; |
diff --git a/src/view/ArticleBuilder.php b/src/view/ArticleBuilder.php index 6c2f63c..f86f9bd 100644 --- a/src/view/ArticleBuilder.php +++ b/src/view/ArticleBuilder.php | |||
| @@ -25,7 +25,7 @@ class ArticleBuilder extends AbstractBuilder | |||
| 25 | // partage | 25 | // partage |
| 26 | $share_link = new URL(['page' => CURRENT_PAGE], $id); | 26 | $share_link = new URL(['page' => CURRENT_PAGE], $id); |
| 27 | $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; | 27 | $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; |
| 28 | $share_button = '<p><a href="' . $share_link . '" ' . $share_js . '><img class="action_icon" src="assets/share.svg"></a></p>' . "\n"; | 28 | $share_button = '<a class="share" href="' . $share_link . '" ' . $share_js . '><img class="action_icon" src="assets/share.svg"></a>' . "\n"; |
| 29 | 29 | ||
| 30 | // modifier un article | 30 | // modifier un article |
| 31 | $admin_buttons = ''; | 31 | $admin_buttons = ''; |
diff --git a/src/view/NewBuilder.php b/src/view/NewBuilder.php index 94823bd..acde8b4 100644 --- a/src/view/NewBuilder.php +++ b/src/view/NewBuilder.php | |||
| @@ -20,14 +20,23 @@ class NewBuilder extends AbstractBuilder | |||
| 20 | // html, date | 20 | // html, date |
| 21 | $title = $node->getArticle()->getTitle(); | 21 | $title = $node->getArticle()->getTitle(); |
| 22 | $preview = $node->getArticle()->getPreview(); | 22 | $preview = $node->getArticle()->getPreview(); |
| 23 | |||
| 24 | // lettre au début de l'id: i = article, p = preview, t = title, d = date | ||
| 23 | $id = $node->getArticleTimestamp(); | 25 | $id = $node->getArticleTimestamp(); |
| 26 | $id_title = $id; | ||
| 27 | $id_title[0] = 't'; | ||
| 28 | $id_preview = $id; | ||
| 29 | $id_preview[0] = 'p'; | ||
| 30 | $id_date = $id; | ||
| 31 | $id_date[0] = 'd'; | ||
| 32 | |||
| 24 | $content = ''; | 33 | $content = ''; |
| 25 | 34 | ||
| 26 | // page article unique | 35 | // page article unique |
| 27 | if(Director::$page_path->getLast()->getEndOfPath() === 'article') | 36 | if(Director::$page_path->getLast()->getEndOfPath() === 'article') |
| 28 | { | 37 | { |
| 29 | $content = $node->getArticle()->getContent(); | 38 | $content = $node->getArticle()->getContent(); |
| 30 | $from_to_button = '<p><a class="link_to_article" href="' . new URL(['page' => 'accueil']) . '"><button>Retour page d\'accueil</button></a></p>'; | 39 | $from_to_button = '<p><a class="link_to_article" href="' . new URL(['page' => 'accueil']) . '"><button>Page<br>d\'accueil</button></a></p>'; |
| 31 | } | 40 | } |
| 32 | // page d'accueil (avec des news) | 41 | // page d'accueil (avec des news) |
| 33 | else | 42 | else |
| @@ -38,32 +47,59 @@ class NewBuilder extends AbstractBuilder | |||
| 38 | 47 | ||
| 39 | $date_object = $node->getArticle()->getDateTime(); // class DateTime | 48 | $date_object = $node->getArticle()->getDateTime(); // class DateTime |
| 40 | $date = 'le ' . str_replace(':', 'h', $date_object->format('d-m-Y à H:i')); | 49 | $date = 'le ' . str_replace(':', 'h', $date_object->format('d-m-Y à H:i')); |
| 50 | //$date = str_replace(':', 'h', $date_object->format('d-m-Y à H:i')); | ||
| 41 | 51 | ||
| 42 | // partage | 52 | // partage |
| 43 | $share_link = new URL(['page' => CURRENT_PAGE], $id); | 53 | $share_link = new URL(['page' => CURRENT_PAGE], $id); |
| 44 | isset($_GET['id']) ? $share_link->addParams(['id' => $_GET['id']]) : ''; | 54 | isset($_GET['id']) ? $share_link->addParams(['id' => $_GET['id']]) : ''; |
| 45 | $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; | 55 | $share_js = 'onclick="copyInClipBoard(\'' . $share_link . '\')"'; |
| 46 | $share_button = '<p><a href="' . $share_link . '" ' . $share_js . '><img class="action_icon" src="assets/share.svg"></a></p>' . "\n"; | 56 | $share_button = '<a class="share" href="' . $share_link . '" ' . $share_js . '><img class="action_icon" src="assets/share.svg"></a>' . "\n"; |
| 47 | 57 | ||
| 48 | // modifier un article | 58 | // modifier un article |
| 59 | $title_buttons = ''; | ||
| 60 | $preview_buttons = ''; | ||
| 61 | $article_buttons = ''; | ||
| 62 | $date_buttons = ''; | ||
| 49 | $admin_buttons = ''; | 63 | $admin_buttons = ''; |
| 50 | if($_SESSION['admin']) | 64 | if($_SESSION['admin']) |
| 51 | { | 65 | { |
| 52 | if(Director::$page_path->getLast()->getEndOfPath() === 'article'){ | 66 | if(Director::$page_path->getLast()->getEndOfPath() === 'article'){ |
| 53 | $modify_js = 'onclick="openEditor(\'' . $id . '\', \'article\')"'; | 67 | $title_js = 'onclick="openEditor(\'' . $id_title . '\', \'article\')"'; |
| 54 | $modify_article = '<p id="edit-' . $id . '"><a href="#"><img class="action_icon" src="assets/edit.svg" ' . $modify_js . '></a></p>' . "\n"; | 68 | $modify_title = '<p id="edit-' . $id_title . '"><a href="#"><button ' . $title_js . '><img class="action_icon" src="assets/edit.svg">Titre</button></a></p>' . "\n"; |
| 69 | $close_js_title = 'onclick="closeEditor(\'' . $id_title . '\', \'article\', \'preview\')"'; | ||
| 70 | $close_editor_title = '<p id="cancel-' . $id_title . '" class="hidden"><a href="#"><button ' . $close_js_title . '>Annuler</button></a></p>'; | ||
| 71 | $submit_js_title = 'onclick="submitArticle(\'' . $id_title . '\', \'article\')"'; | ||
| 72 | $submit_title = '<p id="submit-' . $id_title . '" class="hidden"><a href="#"><button ' . $submit_js_title . '>Valider</button></a></p>'; | ||
| 73 | $title_buttons = '<div class="button_zone">' . $modify_title . $close_editor_title . $submit_title . '</div>'; | ||
| 74 | |||
| 75 | $preview_js = 'onclick="openEditor(\'' . $id_preview . '\', \'article\')"'; | ||
| 76 | $modify_preview = '<p id="edit-' . $id_preview . '"><a href="#"><button ' . $preview_js . '><img class="action_icon" src="assets/edit.svg">Aperçu</button></a></p>' . "\n"; | ||
| 77 | $close_js_preview = 'onclick="closeEditor(\'' . $id_preview . '\', \'article\', \'preview\')"'; | ||
| 78 | $close_editor_preview = '<p id="cancel-' . $id_preview . '" class="hidden"><a href="#"><button ' . $close_js_preview . '>Annuler</button></a></p>'; | ||
| 79 | $submit_js_preview = 'onclick="submitArticle(\'' . $id_preview . '\', \'article\')"'; | ||
| 80 | $submit_preview = '<p id="submit-' . $id_preview . '" class="hidden"><a href="#"><button ' . $submit_js_preview . '>Valider</button></a></p>'; | ||
| 81 | $preview_buttons = '<div class="button_zone">' . $modify_preview . $close_editor_preview . $submit_preview . '</div>'; | ||
| 82 | |||
| 83 | $article_js = 'onclick="openEditor(\'' . $id . '\', \'article\')"'; | ||
| 84 | $modify_article = '<p id="edit-' . $id . '"><a href="#"><button ' . $article_js . '><img class="action_icon" src="assets/edit.svg">Article</button></a></p>' . "\n"; | ||
| 85 | $close_js_article = 'onclick="closeEditor(\'' . $id . '\', \'article\')"'; | ||
| 86 | $close_editor_article = '<p id="cancel-' . $id . '" class="hidden"><a href="#"><button ' . $close_js_article . '>Annuler</button></a></p>'; | ||
| 87 | $submit_js_article = 'onclick="submitArticle(\'' . $id . '\', \'article\')"'; | ||
| 88 | $submit_article = '<p id="submit-' . $id . '" class="hidden"><a href="#"><button ' . $submit_js_article . '>Valider</button></a></p>'; | ||
| 89 | $article_buttons = '<div class="button_zone">' . $modify_article . $close_editor_article . $submit_article . '</div>'; | ||
| 90 | |||
| 91 | $date_js = 'onclick="changeDate(\'' . $id_date . '\', \'article\');'; | ||
| 92 | $modify_date = '<p id="edit-' . $id_date . '"><a href="#"><button ' . $date_js . '"><img class="action_icon" src="assets/edit.svg">Date</button></a></p>' . "\n"; | ||
| 93 | $close_js_date = 'onclick="closeInput(\'' . $id_date . '\')"'; | ||
| 94 | $close_editor_date = '<p id="cancel-' . $id_date . '" class="hidden"><a href="#"><button ' . $close_js_date . '>Annuler</button></a></p>'; | ||
| 95 | $submit_js_date = 'onclick="submitDate(\'' . $id_date . '\')"'; | ||
| 96 | $submit_date = '<p id="submit-' . $id_date . '" class="hidden"><a href="#"><button ' . $submit_js_date . '>Valider</button></a></p>'; | ||
| 97 | $date_buttons = '<div class="button_zone">' . $modify_date . $close_editor_date . $submit_date . '</div>'; | ||
| 55 | 98 | ||
| 56 | $up_button = ''; | ||
| 57 | $down_button = ''; | ||
| 58 | |||
| 59 | $delete_js = 'onclick="deleteArticle(\'' . $id . '\', \'' . CURRENT_PAGE . '\')"'; | 99 | $delete_js = 'onclick="deleteArticle(\'' . $id . '\', \'' . CURRENT_PAGE . '\')"'; |
| 60 | $delete_article = '<p id="delete-' . $id . '"><a href="#"><img class="action_icon" src="assets/delete-bin.svg" ' . $delete_js . '></a></p>' . "\n"; | 100 | $delete_article = '<p id="delete-' . $id . '"><a href="#"><button ' . $delete_js . '"><img class="action_icon" src="assets/delete-bin.svg" ' . $delete_js . '>Retirer<br>la publication</button></a></p>' . "\n"; |
| 61 | 101 | ||
| 62 | $close_js = 'onclick="closeEditor(\'' . $id . '\', \'article\')"'; | 102 | $admin_buttons = $delete_article; |
| 63 | $close_editor = '<p id="cancel-' . $id . '" class="hidden"><a href="#"><button ' . $close_js . '>Annuler</button></a></p>'; | ||
| 64 | |||
| 65 | $submit_js = 'onclick="submitArticle(\'' . $id . '\', \'article\')"'; | ||
| 66 | $submit_article = '<p id="submit-' . $id . '" class="hidden"><a href="#"><button ' . $submit_js . '>Valider</button></a></p>'; | ||
| 67 | } | 103 | } |
| 68 | else{ | 104 | else{ |
| 69 | $modify_article = '<p id="edit-' . $id . '"></p>' . "\n"; | 105 | $modify_article = '<p id="edit-' . $id . '"></p>' . "\n"; |
| @@ -81,8 +117,10 @@ class NewBuilder extends AbstractBuilder | |||
| 81 | $submit_article = '<p id="submit-' . $id . '" class="hidden"></p>'; | 117 | $submit_article = '<p id="submit-' . $id . '" class="hidden"></p>'; |
| 82 | 118 | ||
| 83 | $submit_article = '<p id="submit-' . $id . '" class="hidden"></p>'; | 119 | $submit_article = '<p id="submit-' . $id . '" class="hidden"></p>'; |
| 120 | |||
| 121 | $admin_buttons = $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; | ||
| 84 | } | 122 | } |
| 85 | $admin_buttons = $modify_article . $up_button . $down_button . $delete_article . $close_editor . $submit_article; | 123 | |
| 86 | } | 124 | } |
| 87 | 125 | ||
| 88 | ob_start(); | 126 | ob_start(); |
diff --git a/src/view/templates/article.php b/src/view/templates/article.php index d34697e..f3ab32f 100644 --- a/src/view/templates/article.php +++ b/src/view/templates/article.php | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | <article> | 1 | <article> |
| 2 | <div class="article_content"> | 2 | <div class="article_content"> |
| 3 | <div class="article_title_zone"> | 3 | <div class="article_title_zone"> |
| 4 | <h4><?= $title ?></h4> | ||
| 5 | <?= $share_button ?> | 4 | <?= $share_button ?> |
| 6 | </div> | 5 | </div> |
| 7 | <div id="<?= $id ?>" class="html_from_editor"> | 6 | <div id="<?= $id ?>" class="html_from_editor"> |
diff --git a/src/view/templates/new.php b/src/view/templates/new.php index 9dd8969..9515c70 100644 --- a/src/view/templates/new.php +++ b/src/view/templates/new.php | |||
| @@ -1,20 +1,29 @@ | |||
| 1 | <article> | 1 | <article> |
| 2 | <div class="new_content"> | 2 | <div class="new_content"> |
| 3 | <div class="article_title_zone"> | 3 | <div class="article_title_zone"> |
| 4 | <h4><?= $title ?></h4> | ||
| 5 | <?= $share_button ?> | 4 | <?= $share_button ?> |
| 5 | <div id="<?= $id_title ?>"> | ||
| 6 | <?= $title ?> | ||
| 7 | </div> | ||
| 8 | <?= $title_buttons ?> | ||
| 6 | </div> | 9 | </div> |
| 7 | <div class="new_content_text"> | 10 | <div id="<?= $id_preview ?>" class="new_content_text"> |
| 8 | <?= $preview ?> | 11 | <?= $preview ?> |
| 9 | </div> | 12 | </div> |
| 13 | <?= $preview_buttons ?> | ||
| 10 | <div id="<?= $id ?>" class="article_content_text"> | 14 | <div id="<?= $id ?>" class="article_content_text"> |
| 11 | <?= $content ?> | 15 | <?= $content ?> |
| 12 | </div> | 16 | </div> |
| 17 | <?= $article_buttons ?> | ||
| 13 | <div class="under_an_article"> | 18 | <div class="under_an_article"> |
| 14 | <p><img src="assets/calendar.svg"><?= $date ?></p> | 19 | <p> |
| 15 | <?= $from_to_button ?> | 20 | <img src="assets/calendar.svg"> |
| 21 | <span id="<?= $id_date ?>"><?= $date ?></span> | ||
| 22 | </p> | ||
| 16 | </div> | 23 | </div> |
| 24 | <?= $date_buttons ?> | ||
| 17 | <div class="article_admin_zone"> | 25 | <div class="article_admin_zone"> |
| 26 | <?= $from_to_button ?> | ||
| 18 | <?= $admin_buttons ?> | 27 | <?= $admin_buttons ?> |
| 19 | </div> | 28 | </div> |
| 20 | </div> | 29 | </div> |
