diff options
-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> |