summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller/admin.php60
-rw-r--r--controller/ajax.php10
-rw-r--r--controller/ckeditor.php80
-rw-r--r--controller/visitor.php19
-rw-r--r--index.php72
-rw-r--r--model/Album.php22
-rw-r--r--model/Article.php40
-rw-r--r--model/Image.php22
-rw-r--r--view/album.php48
-rw-r--r--view/discographie.php8
-rw-r--r--view/template-formulaires.php6
-rw-r--r--à faire après livraison.txt13
12 files changed, 278 insertions, 122 deletions
diff --git a/controller/admin.php b/controller/admin.php
index 845fab1..f3eeeca 100644
--- a/controller/admin.php
+++ b/controller/admin.php
@@ -19,7 +19,7 @@ function pageArticlesSimplesAdmin(string $page, string $title, string $headerPai
19 } 19 }
20 20
21 // infos sur les fichiers 21 // infos sur les fichiers
22 $Articles = new Article($page); 22 $Articles = new Article($page, $page);
23 23
24 // nouvel article 24 // nouvel article
25 if($fileCode == '') 25 if($fileCode == '')
@@ -47,6 +47,7 @@ function pageArticlesSimplesAdmin(string $page, string $title, string $headerPai
47 $texte = $Articles->readOne(); // entrée de l'éditeur 47 $texte = $Articles->readOne(); // entrée de l'éditeur
48 } 48 }
49 } 49 }
50 $lienBoutonAnnuler = $page;
50 51
51 // ajout des données dans $Articles->fileList['content'] 52 // ajout des données dans $Articles->fileList['content']
52 if(!empty($Articles->fileList)) 53 if(!empty($Articles->fileList))
@@ -58,7 +59,7 @@ function pageArticlesSimplesAdmin(string $page, string $title, string $headerPai
58 // sécurisation du contenu pré-existant inséré dans l'éditeur 59 // sécurisation du contenu pré-existant inséré dans l'éditeur
59 if(!empty($fileCode) && !$suppression) 60 if(!empty($fileCode) && !$suppression)
60 { 61 {
61 $fileCodeArgument = '&article=' . $fileCode; 62 $fileCodeArgument = '&file_code=' . $fileCode;
62 require('controller/ckeditor.php'); 63 require('controller/ckeditor.php');
63 $texte = preparationCKeditor($texte); 64 $texte = preparationCKeditor($texte);
64 } 65 }
@@ -156,15 +157,23 @@ function legalEdit($fileCode, int $suppression)
156} 157}
157 158
158 159
159// page plus complexe que les autres 160// l'éditeur est ouvert dans la page album
160function discoEdit($fileCode, int $suppression) 161// ne servirait que pour les positions
162/*function discoEdit()
161{ 163{
162 $page = "discographie"; 164 inversionPositions();
165}*/
166
167// page complexe avec albums et articles
168// cas où on fait quelque chose: ouvrir l'éditeur, monter, descendre, supprimer
169function albumEdit($fileCode, int $suppression)
170{
171 $page = $_GET['page'];
163 $title = "Discographie"; 172 $title = "Discographie";
164 173
165 // modèle 174 // modèle
166 $Albums = new Album($page); 175 $Albums = new Album($page, 'discographie');
167 $Albums->makeFileList(); 176 //$Albums->makeFileList();
168 177
169 // contenu: JSON, HTML, noms et chemins des fichiers 178 // contenu: JSON, HTML, noms et chemins des fichiers
170 $Albums->readAll(); 179 $Albums->readAll();
@@ -177,6 +186,8 @@ function discoEdit($fileCode, int $suppression)
177 // nouvel album 186 // nouvel album
178 if($fileCode == '') 187 if($fileCode == '')
179 { 188 {
189 $page = 'discographie';
190 $lienBoutonAnnuler = $page;
180 $title = "Ajouter un album"; 191 $title = "Ajouter un album";
181 $imageFormulaire = ''; 192 $imageFormulaire = '';
182 193
@@ -189,9 +200,9 @@ function discoEdit($fileCode, int $suppression)
189 // album ciblé 200 // album ciblé
190 $Albums->fileCode = $fileCode; 201 $Albums->fileCode = $fileCode;
191 202
192 // suppression
193 if($suppression) 203 if($suppression)
194 { 204 {
205 $page = 'discographie';
195 $Albums->delete(); 206 $Albums->delete();
196 header('Location: index.php?page=' . $page); 207 header('Location: index.php?page=' . $page);
197 exit(); 208 exit();
@@ -199,6 +210,8 @@ function discoEdit($fileCode, int $suppression)
199 // modification 210 // modification
200 else 211 else
201 { 212 {
213 $page = 'album';
214 $Albums->readOne();
202 $_SESSION['target'] = $fileCode; 215 $_SESSION['target'] = $fileCode;
203 $title = "Modifier un album"; 216 $title = "Modifier un album";
204 217
@@ -216,7 +229,11 @@ function discoEdit($fileCode, int $suppression)
216 // image affichée à côté des formulaires 229 // image affichée à côté des formulaires
217 if(!empty($vignette[2])) 230 if(!empty($vignette[2]))
218 { 231 {
219 $imageFormulaire = '<img class="imageFormulaire" src="data/' . $page . '/images/' . $vignette[2] . '" ><br/>'; 232 if($page == 'album')
233 {
234 $dossier = 'discographie';
235 }
236 $imageFormulaire = '<img class="imageFormulaire" src="data/' . $dossier . '/images/' . $vignette[2] . '" ><br/>';
220 } 237 }
221 else 238 else
222 { 239 {
@@ -232,7 +249,7 @@ function discoEdit($fileCode, int $suppression)
232 if(!empty($fileCode) && !$suppression && !empty($texte)) 249 if(!empty($fileCode) && !$suppression && !empty($texte))
233 { 250 {
234 // dans l'adresse dans la balise <form> 251 // dans l'adresse dans la balise <form>
235 $fileCodeArgument = '&article=' . $fileCode; 252 $fileCodeArgument = '&file_code=' . $fileCode;
236 253
237 require('controller/ckeditor.php'); 254 require('controller/ckeditor.php');
238 $texte = preparationCKeditor($texte); 255 $texte = preparationCKeditor($texte);
@@ -242,10 +259,16 @@ function discoEdit($fileCode, int $suppression)
242 $fileCodeArgument = ''; 259 $fileCodeArgument = '';
243 } 260 }
244 261
262 // création des liens: menu disco
263 $lienBoutonAnnuler = 'discographie';
245 for($i = 0; $i < $Albums->fileListCount; $i++) 264 for($i = 0; $i < $Albums->fileListCount; $i++)
246 { 265 {
247 if(file_exists('data/discographie/html/' . $Albums->fileList[$i]['fileCode'] . '.html')) 266 if(file_exists('data/discographie/html/' . $Albums->fileList[$i]['fileCode'] . '.html'))
248 { 267 {
268 if($Albums->fileList[$i]['fileCode'] === $fileCode)
269 {
270 $lienBoutonAnnuler = $page . '&file_code=' . $fileCode;
271 }
249 $lienAlbum[$i] = 'page=album&file_code=' . $Albums->fileList[$i]['fileCode']; 272 $lienAlbum[$i] = 'page=album&file_code=' . $Albums->fileList[$i]['fileCode'];
250 $avecLien[$i] = true; 273 $avecLien[$i] = true;
251 $linkDiscoChrono[$i] = 'linkChrono'; // css 274 $linkDiscoChrono[$i] = 'linkChrono'; // css
@@ -256,7 +279,7 @@ function discoEdit($fileCode, int $suppression)
256 $avecLien[$i] = false; 279 $avecLien[$i] = false;
257 $linkDiscoChrono[$i] = 'noLinkChrono'; // css 280 $linkDiscoChrono[$i] = 'noLinkChrono'; // css
258 } 281 }
259 $lienBoutonModif[$i] = 'page=discographie&action=edition&file_code=' . $Albums->fileList[$i]['fileCode'] . '#' . $Albums->fileList[$i]['fileCode']; 282 $lienBoutonModif[$i] = 'page=album&action=edition&file_code=' . $Albums->fileList[$i]['fileCode'];
260 } 283 }
261 284
262 // morceaux en HTML à assembler 285 // morceaux en HTML à assembler
@@ -264,7 +287,14 @@ function discoEdit($fileCode, int $suppression)
264 require('view/template-formulaires.php'); 287 require('view/template-formulaires.php');
265 // variables $css, $js, $header et $content, 288 // variables $css, $js, $header et $content,
266 // $content contient ???? et $editeurHTML 289 // $content contient ???? et $editeurHTML
267 require('view/discographie.php'); 290 if($page === 'discographie')
291 {
292 require('view/discographie.php');
293 }
294 elseif($page === 'album')
295 {
296 require('view/album.php');
297 }
268 // fin de l'assemblage 298 // fin de l'assemblage
269 require('view/template.php'); 299 require('view/template.php');
270} 300}
@@ -273,7 +303,11 @@ function discoEdit($fileCode, int $suppression)
273// version sans JS (l'autre est dans ajax.php) 303// version sans JS (l'autre est dans ajax.php)
274function inversionPositions(string $page, $fileCode, string $class, int $direction) 304function inversionPositions(string $page, $fileCode, string $class, int $direction)
275{ 305{
276 $Object = new $class($page); 306 $Object = new $class($page, $page);
307 if($page === 'album')
308 {
309 $Object->setFolder('discographie');
310 }
277 $Object->fileCode = $fileCode; 311 $Object->fileCode = $fileCode;
278 // direction: 1 = monter, -1 = descendre 312 // direction: 1 = monter, -1 = descendre
279 $Object->inversionPositions($direction); 313 $Object->inversionPositions($direction);
diff --git a/controller/ajax.php b/controller/ajax.php
index 188b01f..26aa9c6 100644
--- a/controller/ajax.php
+++ b/controller/ajax.php
@@ -17,8 +17,14 @@ if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_
17 else 17 else
18 { 18 {
19 require('model/Image.php'); 19 require('model/Image.php');
20 // paramètre "true" parce qu'on reçoit une requête AJAX 20 // vaut "true" parce qu'on reçoit une requête AJAX
21 $Image = new Image(true); 21 $Image = new Image($_GET['page'], $_GET['page'], true);
22 // les données des albums sont dans le dossier discographie
23 if($_GET['page'] === 'album')
24 {
25 $Image->setFolder('discographie');
26 }
27
22 $Image->upload(); 28 $Image->upload();
23 29
24 echo($Image->reponseAjax); // attendu par l'éditeur 30 echo($Image->reponseAjax); // attendu par l'éditeur
diff --git a/controller/ckeditor.php b/controller/ckeditor.php
index 3e14494..f73107d 100644
--- a/controller/ckeditor.php
+++ b/controller/ckeditor.php
@@ -44,46 +44,28 @@ function submitCKeditor()
44 // POST de l'éditeur 44 // POST de l'éditeur
45 if(isset($_POST['contenu'])) // optionnel pour discographie 45 if(isset($_POST['contenu'])) // optionnel pour discographie
46 { 46 {
47 $contenu = Security::secureString($_POST['contenu']); 47 $html = Security::secureString($_POST['contenu']);
48 48
49 // liens sans http:// devant 49 // liens sans http:// devant
50 $contenu = fixLinks($contenu); 50 $html = fixLinks($html);
51 51
52 // récupérer les liens multimedia 52 // récupérer les liens multimedia
53 //require("media.php"); 53 //require("media.php");
54 //$contenu = mediaSubmit($contenu); 54 //$html = mediaSubmit($html);
55 55
56 // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! 56 // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !!
57 if($_GET['page'] != 'discographie' && $contenu == '') 57 if($_GET['page'] != 'discographie' && $_GET['page'] != 'album' && $html == '')
58 { 58 {
59 header('Location: index.php?page=' . $_GET['page'] . '&erreur=contenu_vide'); 59 header('Location: index.php?page=' . $_GET['page'] . '&erreur=contenu_editeur_vide');
60 exit(); 60 exit();
61 } 61 }
62 } 62 }
63 63
64 // pages avec des articles simples (melaine...) 64
65 if($_GET['page'] != 'discographie')
66 {
67 $Article = new Article($_GET['page']);
68
69 if(!isset($_SESSION['target']) || $_SESSION['target'] == '')
70 {
71 $Article->create($contenu);
72
73 // create html-mini
74 }
75 else
76 {
77 $Article->fileCode = $_SESSION['target']; // erreur ici?
78 $Article->update($contenu);
79
80 // update html-mini
81 }
82 }
83 // page discographie 65 // page discographie
84 else if($_GET['page'] == 'discographie') 66 if($_GET['page'] === 'discographie' || $_GET['page'] === 'album')
85 { 67 {
86 $Album = new Album($_GET['page']); 68 $Album = new Album($_GET['page'], 'discographie');
87 69
88 // on retrouve les données si nécessaire 70 // on retrouve les données si nécessaire
89 if(isset($_SESSION['target']) && $_SESSION['target'] != '') 71 if(isset($_SESSION['target']) && $_SESSION['target'] != '')
@@ -117,7 +99,7 @@ function submitCKeditor()
117 if(!empty($_POST['contenu'])) 99 if(!empty($_POST['contenu']))
118 { 100 {
119 $Album->format = 'html'; 101 $Album->format = 'html';
120 $Album->create($contenu); 102 $Album->create($html);
121 } 103 }
122 } 104 }
123 // modification 105 // modification
@@ -131,16 +113,50 @@ function submitCKeditor()
131 $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); 113 $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini);
132 114
133 // page de l'album 115 // page de l'album
134 // si $contenu est vide, le fichier est supprimé 116 // si $html est vide, le fichier est supprimé
135 $Album->format = 'html'; 117 $Album->format = 'html';
136 $Album->update($contenu); 118 $Album->update($html);
119 }
120 }
121 // pages avec des articles simples (melaine...)
122 //if($_GET['page'] != 'discographie')
123 else
124 {
125 $Article = new Article($_GET['page'], $_GET['page']);
126
127 if(!isset($_SESSION['target']) || $_SESSION['target'] === '')
128 {
129 $Article->create($html);
130
131 // create html-mini
132 }
133 else
134 {
135 $Article->fileCode = $_SESSION['target']; // erreur ici?
136 $Article->update($html);
137
138 // update html-mini
137 } 139 }
138 } 140 }
139 141
140 // nettoyage 142 // nettoyage
141 unset($_SESSION['target']); 143 unset($_SESSION['target']);
142 unset($_GET['action']); 144
143 unset($_POST['contenu']); 145 if($_GET['page'] === 'discographie' || $_GET['page'] === 'album')
144 header('Location: index.php?page=' . $_GET['page']); 146 {
147 if($html === '')
148 {
149 $redirection = 'index.php?page=discographie';
150 }
151 else
152 {
153 $redirection = 'index.php?page=album&file_code=' . $Album->fileCode;
154 }
155 }
156 else
157 {
158 $redirection = 'index.php?page=' . $_GET['page'];
159 }
160 header('Location: ' . $redirection);
145 exit(); 161 exit();
146} 162}
diff --git a/controller/visitor.php b/controller/visitor.php
index d03197d..92f3db7 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -21,7 +21,7 @@ function accueil()
21function pageArticlesSimplesVisitor(string $page, string $title, string $headerPaintedTitle) 21function pageArticlesSimplesVisitor(string $page, string $title, string $headerPaintedTitle)
22{ 22{
23 // infos sur les fichiers $Articles->fileList 23 // infos sur les fichiers $Articles->fileList
24 $Articles = new Article($page); 24 $Articles = new Article($page, $page);
25 25
26 // données des dates 26 // données des dates
27 //print_r($Articles->fileList[$i]['date']); 27 //print_r($Articles->fileList[$i]['date']);
@@ -115,14 +115,16 @@ function legalVisitor()
115} 115}
116 116
117 117
118// page plus complexe que les autres 118
119// page complexe avec albums et articles
120// cas où on ne fait rien, même en en mode admin
119function discoVisitor() 121function discoVisitor()
120{ 122{
121 $page = "discographie"; 123 $page = $_GET['page'];
122 $title = "Discographie"; 124 $title = "Discographie";
123 125
124 // modèle 126 // modèle
125 $Albums = new Album($page); 127 $Albums = new Album($page, $page);
126 //var_dump($Albums->fileList); die(); 128 //var_dump($Albums->fileList); die();
127 129
128 // on récupère tout: JSON, HTML, noms et chemins des fichiers 130 // on récupère tout: JSON, HTML, noms et chemins des fichiers
@@ -148,7 +150,7 @@ function discoVisitor()
148 $avecLien[$i] = false; 150 $avecLien[$i] = false;
149 $linkDiscoChrono[$i] = 'noLinkChrono'; // pour le css 151 $linkDiscoChrono[$i] = 'noLinkChrono'; // pour le css
150 } 152 }
151 $lienBoutonModif[$i] = 'page=discographie&action=edition&file_code=' . $Albums->fileList[$i]['fileCode'] . '#' . $Albums->fileList[$i]['fileCode']; 153 $lienBoutonModif[$i] = 'page=album&action=edition&file_code=' . $Albums->fileList[$i]['fileCode'];
152 } 154 }
153 155
154 // variables $css, $js et $content 156 // variables $css, $js et $content
@@ -158,11 +160,11 @@ function discoVisitor()
158} 160}
159 161
160// page d'un album 162// page d'un album
161function album($fileCode) 163function albumVisitor($fileCode)
162{ 164{
163 $page = 'discographie'; // = nom du dossier où sont les données 165 $page = $_GET['page'];
166 $Albums = new Album($page, 'discographie');
164 167
165 $Albums = new Album($page);
166 $Albums->getAllJSON(); 168 $Albums->getAllJSON();
167 if(!empty($Albums->fileList)) 169 if(!empty($Albums->fileList))
168 { 170 {
@@ -174,6 +176,7 @@ function album($fileCode)
174 $title = $Albums->oneAlbum['titre']; 176 $title = $Albums->oneAlbum['titre'];
175 $album = $Albums->oneAlbum['HTMLcontent']; 177 $album = $Albums->oneAlbum['HTMLcontent'];
176 178
179 // création des liens: menu déroulant et section principale
177 for($i = 0; $i < $Albums->fileListCount; $i++) 180 for($i = 0; $i < $Albums->fileListCount; $i++)
178 { 181 {
179 if(file_exists('data/discographie/html/' . $Albums->fileList[$i]['fileCode'] . '.html')) 182 if(file_exists('data/discographie/html/' . $Albums->fileList[$i]['fileCode'] . '.html'))
diff --git a/index.php b/index.php
index 66b2f89..14371e5 100644
--- a/index.php
+++ b/index.php
@@ -40,7 +40,7 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
40 require('controller/Security.php'); // sécurité des chaines 40 require('controller/Security.php'); // sécurité des chaines
41 require('model/Article.php'); 41 require('model/Article.php');
42 42
43 if($_GET['page'] == 'discographie') 43 if($_GET['page'] === 'discographie' || $_GET['page'] === 'album')
44 { 44 {
45 require('model/Album.php'); 45 require('model/Album.php');
46 } 46 }
@@ -174,31 +174,28 @@ if(isset($_GET['page']))
174 $fonctionVisitor(); 174 $fonctionVisitor();
175 } 175 }
176 176
177 if($_GET['page'] == 'melaine') 177 //if($_GET['page'] === 'melaine'){}
178 {}
179 } 178 }
180 // page discographie (avec albums et articles) 179 // page discographie (avec albums et articles)
181 elseif($_GET['page'] == 'discographie') 180 elseif($_GET['page'] === 'discographie')
182 { 181 {
183 // rédaction 182 // nouvel album
184 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') 183 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition')
185 { 184 {
186 // modification 185 if(!isset($_GET['file_code']) || empty($_GET['file_code']))
187 if(isset($_GET['file_code']) || !empty($_GET['file_code']))
188 {
189 discoEdit($_GET['file_code'], 0);
190 }
191 // nouvel article
192 else
193 { 186 {
194 // par sécurité 187 // par sécurité
195 unset($_GET['file_code']); 188 unset($_GET['file_code']);
196 189
197 discoEdit('', 0); 190 albumEdit('', 0);
191 }
192 else
193 {
194 discoVisitor();
198 } 195 }
199 } 196 }
200 // modification d'un positions.json (version sans JS) 197 // modification d'un positions.json (version sans JS)
201 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'monter') 198 elseif($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] === 'monter')
202 { 199 {
203 if(isset($_GET['file_code']) && !empty($_GET['file_code'])) 200 if(isset($_GET['file_code']) && !empty($_GET['file_code']))
204 { 201 {
@@ -211,11 +208,11 @@ if(isset($_GET['page']))
211 discoVisitor(); 208 discoVisitor();
212 } 209 }
213 } 210 }
214 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'descendre') 211 elseif($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] === 'descendre')
215 { 212 {
216 if(isset($_GET['file_code']) && !empty($_GET['file_code'])) 213 if(isset($_GET['file_code']) && !empty($_GET['file_code']))
217 { 214 {
218 // 0 pour descendre 215 // -1 pour descendre
219 inversionPositions($_GET['page'], $_GET['file_code'], 'Album', -1); 216 inversionPositions($_GET['page'], $_GET['file_code'], 'Album', -1);
220 discoVisitor(); 217 discoVisitor();
221 } 218 }
@@ -227,7 +224,14 @@ if(isset($_GET['page']))
227 // suppression 224 // suppression
228 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') 225 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
229 { 226 {
230 discoEdit($_GET['file_code'], 1); 227 if(isset($_GET['file_code']) && !empty($_GET['file_code']))
228 {
229 albumEdit($_GET['file_code'], 1);
230 }
231 else
232 {
233 discoVisitor();
234 }
231 } 235 }
232 else 236 else
233 { 237 {
@@ -235,10 +239,40 @@ if(isset($_GET['page']))
235 } 239 }
236 } 240 }
237 // page d'un album de la discographie 241 // page d'un album de la discographie
238 // page visiteur uniquement
239 elseif($_GET['page'] == 'album') 242 elseif($_GET['page'] == 'album')
240 { 243 {
241 album($_GET['file_code']); 244 // page d'aucun album
245 if(!isset($_GET['file_code']) || $_GET['file_code'] == '')
246 {
247 header('Location: index.php?page=discographie');
248 }
249
250 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition')
251 {
252 // modification
253 if(isset($_GET['file_code']) || !empty($_GET['file_code']))
254 {
255 albumEdit($_GET['file_code'], 0);
256 }
257 // suppression
258 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
259 {
260 albumEdit($_GET['file_code'], 1);
261 }
262 // on fait rien
263 else
264 {
265 // par sécurité
266 unset($_GET['file_code']);
267
268 //albumEdit('', 0);
269 discoVisitor();
270 }
271 }
272 else
273 {
274 albumVisitor($_GET['file_code']);
275 }
242 } 276 }
243 // page connexion 277 // page connexion
244 elseif($_GET['page'] == 'connexion') 278 elseif($_GET['page'] == 'connexion')
diff --git a/model/Album.php b/model/Album.php
index b4b7afe..d2537f7 100644
--- a/model/Album.php
+++ b/model/Album.php
@@ -5,12 +5,12 @@ class Album extends Article
5{ 5{
6 public $oneAlbum; 6 public $oneAlbum;
7 7
8 public function __construct($page) 8 public function __construct(string $page, string $folder)
9 { 9 {
10 $this->format = 'json'; // vaut 'html' dans la classe mère 10 $this->format = 'json'; // vaut 'html' dans la classe mère
11 11
12 // pour: page, fileCode, time et makeFileList() 12 // pour: page, fileCode, time et makeFileList()
13 parent::__construct($page); 13 parent::__construct($page, $folder);
14 } 14 }
15 15
16 // GET 16 // GET
@@ -49,7 +49,7 @@ class Album extends Article
49 49
50 // télécharger la pochette 50 // télécharger la pochette
51 require('model/Image.php'); 51 require('model/Image.php');
52 $Image = new Image(false); 52 $Image = new Image($this->page, $this->folder, false);
53 $Image->upload(); 53 $Image->upload();
54 $Image->makeThumbnail(201); 54 $Image->makeThumbnail(201);
55 55
@@ -61,7 +61,7 @@ class Album extends Article
61 $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]); 61 $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]);
62 //var_dump($albumJSON); die(); 62 //var_dump($albumJSON); die();
63 63
64 $nom_fichier = 'data/' . $this->page . '/' . $this->format . '/' . $this->time . '.' . $this->format; 64 $nom_fichier = 'data/' . $this->folder . '/' . $this->format . '/' . $this->time . '.' . $this->format;
65 65
66 $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser 66 $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser
67 fputs($fichier, $albumJSON); 67 fputs($fichier, $albumJSON);
@@ -95,9 +95,9 @@ class Album extends Article
95 $this->fileList[$i]['pochetteMini'] = $content[3]; 95 $this->fileList[$i]['pochetteMini'] = $content[3];
96 96
97 // ajout du HTML si il existe 97 // ajout du HTML si il existe
98 if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format)) 98 if(file_exists('data/' . $this->folder . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format))
99 { 99 {
100 $this->fileList[$i]['HTMLfileName'] = 'data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format; 100 $this->fileList[$i]['HTMLfileName'] = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format;
101 $this->fileList[$i]['HTMLcontent'] = file_get_contents($this->fileList[$i]['HTMLfileName']); 101 $this->fileList[$i]['HTMLcontent'] = file_get_contents($this->fileList[$i]['HTMLfileName']);
102 } 102 }
103 // utile? 103 // utile?
@@ -120,7 +120,7 @@ class Album extends Article
120 { 120 {
121 // json 121 // json
122 $this->oneAlbum['fileCode'] = $this->fileList[$i]['fileCode']; 122 $this->oneAlbum['fileCode'] = $this->fileList[$i]['fileCode'];
123 $this->oneAlbum['fileName'] = 'data/' . $this->page . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format; 123 $this->oneAlbum['fileName'] = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format;
124 $this->oneAlbum['content'] = file_get_contents($this->fileList[$i]['fileName']); 124 $this->oneAlbum['content'] = file_get_contents($this->fileList[$i]['fileName']);
125 $content = json_decode($this->oneAlbum['content']); 125 $content = json_decode($this->oneAlbum['content']);
126 $this->oneAlbum['titre'] = $content[0]; 126 $this->oneAlbum['titre'] = $content[0];
@@ -130,9 +130,9 @@ class Album extends Article
130 130
131 // html 131 // html
132 $this->format = 'html'; 132 $this->format = 'html';
133 if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format)) 133 if(file_exists('data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format))
134 { 134 {
135 $this->oneAlbum['HTMLfileName'] = 'data/' . $this->page . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format; 135 $this->oneAlbum['HTMLfileName'] = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format;
136 $this->oneAlbum['HTMLcontent'] = file_get_contents($this->oneAlbum['HTMLfileName']); 136 $this->oneAlbum['HTMLcontent'] = file_get_contents($this->oneAlbum['HTMLfileName']);
137 } 137 }
138 } 138 }
@@ -175,7 +175,7 @@ class Album extends Article
175 { 175 {
176 // télécharger la pochette 176 // télécharger la pochette
177 require('model/Image.php'); 177 require('model/Image.php');
178 $Image = new Image(false); 178 $Image = new Image($this->page, $this->folder, false);
179 $Image->upload(); 179 $Image->upload();
180 $Image->makeThumbnail(201); 180 $Image->makeThumbnail(201);
181 $erreur = $Image->erreur; 181 $erreur = $Image->erreur;
@@ -203,7 +203,7 @@ class Album extends Article
203 { 203 {
204 parent::delete(); // json 204 parent::delete(); // json
205 205
206 if(file_exists('data/' . $this->page . '/html/' . $this->fileCode . '.' . $this->format)); 206 if(file_exists('data/' . $this->folder . '/html/' . $this->fileCode . '.' . $this->format));
207 { 207 {
208 $this->format = 'html'; 208 $this->format = 'html';
209 parent::delete(); // html 209 parent::delete(); // html
diff --git a/model/Article.php b/model/Article.php
index 33848bb..2ea80f8 100644
--- a/model/Article.php
+++ b/model/Article.php
@@ -9,7 +9,8 @@
9class Article 9class Article
10{ 10{
11 // pour tous les articles 11 // pour tous les articles
12 public $page; // page et donc dossier concerné 12 public $page; // page du site
13 public $folder; // dossier des données (vaut souvent $page)
13 public $format = 'html'; // 'html' ou 'json' 14 public $format = 'html'; // 'html' ou 'json'
14 public $fileListCount; // pour les boucles "for" 15 public $fileListCount; // pour les boucles "for"
15 // pas de "foreach", on a besoin des compteurs $i 16 // pas de "foreach", on a besoin des compteurs $i
@@ -20,20 +21,29 @@ class Article
20 public $fileCode = ''; // $_SESSION['target'] 21 public $fileCode = ''; // $_SESSION['target']
21 protected $time; // timestamp pour noms des fichiers créés 22 protected $time; // timestamp pour noms des fichiers créés
22 23
23 public function __construct($page) 24 public function __construct(string $page, string $folder)
24 { 25 {
25 $this->page = $page; 26 $this->page = $page;
27 $this->folder = $folder;
26 $this->time = time(); 28 $this->time = time();
27 $this->makeFileList(); 29 $this->makeFileList();
28 } 30 }
29 31
32 // GET
33
34 // SET
35 public function setFolder(string $folder)
36 {
37 $this->folder = $folder;
38 }
39
30 // tableaux des noms des fichiers 40 // tableaux des noms des fichiers
31 // noter que le chemin et l'extension ne varient pas 41 // noter que le chemin et l'extension ne varient pas
32 public function makeFileList() 42 public function makeFileList()
33 { 43 {
34 // noms des fichiers 44 // noms des fichiers
35 // globbing = utiliser un pattern pour cibler des fichiers 45 // globbing = utiliser un pattern pour cibler des fichiers
36 $nameList = glob('data/' . $this->page . '/' . $this->format . '/*.' . $this->format); 46 $nameList = glob('data/' . $this->folder . '/' . $this->format . '/*.' . $this->format);
37 47
38 $this->fileListCount = count($nameList); 48 $this->fileListCount = count($nameList);
39 49
@@ -77,10 +87,10 @@ class Article
77 87
78 private function readPositionsJSON() // retourne array ou NULL 88 private function readPositionsJSON() // retourne array ou NULL
79 { 89 {
80 if(file_exists('data/' . $this->page . '/positions.json')) 90 if(file_exists('data/' . $this->folder . '/positions.json'))
81 { 91 {
82 // "true" pour retourner un tableau et non un objet 92 // "true" pour retourner un tableau et non un objet
83 $positions = json_decode(file_get_contents('data/' . $this->page . '/positions.json'), true); 93 $positions = json_decode(file_get_contents('data/' . $this->folder . '/positions.json'), true);
84 } 94 }
85 return $positions; 95 return $positions;
86 } 96 }
@@ -105,7 +115,7 @@ class Article
105 $positions[$this->fileList[$i]['fileCode']] = $this->fileList[$i]['position']; 115 $positions[$this->fileList[$i]['fileCode']] = $this->fileList[$i]['position'];
106 } 116 }
107 117
108 file_put_contents('data/' . $this->page . '/positions.json', json_encode($positions)); 118 file_put_contents('data/' . $this->folder . '/positions.json', json_encode($positions));
109 } 119 }
110 120
111 private function sortFileListByPositions() 121 private function sortFileListByPositions()
@@ -157,10 +167,6 @@ class Article
157 167
158 return $content; 168 return $content;
159 } 169 }
160
161 // GET
162
163 // SET
164 170
165 // fonctions CRUD (create - read - update - delete) 171 // fonctions CRUD (create - read - update - delete)
166 172
@@ -177,7 +183,7 @@ class Article
177 { 183 {
178 // html version images normales 184 // html version images normales
179 $contentMaxi = $content; 185 $contentMaxi = $content;
180 $fileName = 'data/' . $this->page . '/' . $this->format . '-maxi-images/' . $this->time . '.' . $this->format; 186 $fileName = 'data/' . $this->folder . '/' . $this->format . '-maxi-images/' . $this->time . '.' . $this->format;
181 $file = fopen($fileName, 'w'); // w pour créer ou écraser 187 $file = fopen($fileName, 'w'); // w pour créer ou écraser
182 fputs($file, $contentMaxi); 188 fputs($file, $contentMaxi);
183 fclose($file); 189 fclose($file);
@@ -187,7 +193,7 @@ class Article
187 $content = self::makeHtmlMiniImages($content); 193 $content = self::makeHtmlMiniImages($content);
188 } 194 }
189 195
190 $fileName = 'data/' . $this->page . '/' . $this->format . '/' . $this->time . '.' . $this->format; 196 $fileName = 'data/' . $this->folder . '/' . $this->format . '/' . $this->time . '.' . $this->format;
191 $file = fopen($fileName, 'w'); // w pour créer ou écraser 197 $file = fopen($fileName, 'w'); // w pour créer ou écraser
192 fputs($file, $content); 198 fputs($file, $content);
193 fclose($file); 199 fclose($file);
@@ -207,7 +213,7 @@ class Article
207 } 213 }
208 public function readOne() 214 public function readOne()
209 { 215 {
210 return(file_get_contents('data/' . $this->page . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format)); 216 return(file_get_contents('data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format));
211 } 217 }
212 218
213 // update 219 // update
@@ -217,7 +223,7 @@ class Article
217 { 223 {
218 // html version images normales 224 // html version images normales
219 $contentMaxi = $content; 225 $contentMaxi = $content;
220 $fileName = 'data/' . $this->page . '/' . $this->format . '-maxi-images/' . $this->fileCode . '.' . $this->format; 226 $fileName = 'data/' . $this->folder . '/' . $this->format . '-maxi-images/' . $this->fileCode . '.' . $this->format;
221 if(file_exists($fileName) && empty($content)) 227 if(file_exists($fileName) && empty($content))
222 { 228 {
223 $this->delete(); 229 $this->delete();
@@ -235,7 +241,7 @@ class Article
235 } 241 }
236 242
237 // json ou html version petites images 243 // json ou html version petites images
238 $fileName = 'data/' . $this->page . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format; 244 $fileName = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format;
239 if(file_exists($fileName) && empty($content)) 245 if(file_exists($fileName) && empty($content))
240 { 246 {
241 $this->delete(); 247 $this->delete();
@@ -252,11 +258,11 @@ class Article
252 // delete 258 // delete
253 public function delete() 259 public function delete()
254 { 260 {
255 $path = 'data/' . $this->page . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format; 261 $path = 'data/' . $this->folder . '/' . $this->format . '/' . $this->fileCode . '.' . $this->format;
256 unlink($path); 262 unlink($path);
257 263
258 // fichiers html dans html-maxi-images 264 // fichiers html dans html-maxi-images
259 $path_maxi = 'data/' . $this->page . '/' . $this->format . '-maxi-images/' . $this->fileCode . '.' . $this->format; 265 $path_maxi = 'data/' . $this->folder . '/' . $this->format . '-maxi-images/' . $this->fileCode . '.' . $this->format;
260 if(file_exists($path_maxi)) 266 if(file_exists($path_maxi))
261 { 267 {
262 unlink($path_maxi); 268 unlink($path_maxi);
diff --git a/model/Image.php b/model/Image.php
index 1cc0e22..d71b96a 100644
--- a/model/Image.php
+++ b/model/Image.php
@@ -4,6 +4,7 @@
4class Image 4class Image
5{ 5{
6 private $page; 6 private $page;
7 private $folder;
7 8
8 private $ajax; // vaut true avec le ckeditor 9 private $ajax; // vaut true avec le ckeditor
9 public $reponseAjax; 10 public $reponseAjax;
@@ -13,18 +14,25 @@ class Image
13 public $pathInfos; 14 public $pathInfos;
14 public $erreur; 15 public $erreur;
15 16
16 public function __construct($ajax) 17 public function __construct(string $page, string $folder, bool $ajax)
17 { 18 {
18 // get envoyé avec le javascript
19 $this->ajax = $ajax; 19 $this->ajax = $ajax;
20 $this->page = $_GET['page']; 20 $this->page = $page;
21 $this->path = 'data/' . $this->page . '/images/'; 21 $this->folder = $folder;
22 $this->pathMini = 'data/' . $this->page . '/images-mini/'; 22 $this->path = 'data/' . $this->folder . '/images/';
23 $this->pathMini = 'data/' . $this->folder . '/images-mini/';
23 } 24 }
24 25
25 // GET 26 // GET
26 27
27 // SET 28 // SET
29 public function setFolder(string $folder)
30 {
31 $this->folder = $folder;
32 $this->path = 'data/' . $this->folder . '/images/';
33 $this->pathMini = 'data/' . $this->folder . '/images-mini/';
34 }
35
28 36
29 public function upload() 37 public function upload()
30 { 38 {
@@ -55,7 +63,7 @@ class Image
55 if($this->ajax && empty($Image->erreur)) 63 if($this->ajax && empty($Image->erreur))
56 { 64 {
57 // chemin en JSON attendu par l'éditeur 65 // chemin en JSON attendu par l'éditeur
58 $this->reponseAjax = '{"url": "data/' . $this->page . '/images/' . $_FILES['upload']['name'] . '"}'; 66 $this->reponseAjax = '{"url": "data/' . $this->folder . '/images/' . $_FILES['upload']['name'] . '"}';
59 } 67 }
60 } 68 }
61 69
@@ -108,7 +116,7 @@ class Image
108 116
109 // message d'erreur 117 // message d'erreur
110 $_SESSION['erreur'] = addslashes("Echec de la création d'une miniature. Vérifier le fichier config.php"); 118 $_SESSION['erreur'] = addslashes("Echec de la création d'une miniature. Vérifier le fichier config.php");
111 header('Location: index.php?page=' . $this->page . '&erreur=dependance_bibli_images'); 119 header('Location: index.php?page=' . $this->folder . '&erreur=dependance_bibli_images');
112 exit(); 120 exit();
113 } 121 }
114 } 122 }
diff --git a/view/album.php b/view/album.php
index 47d771f..e2989dc 100644
--- a/view/album.php
+++ b/view/album.php
@@ -15,6 +15,14 @@ ob_start();
15?> 15?>
16 <script type="text/javascript" src="public/main.js" ></script> 16 <script type="text/javascript" src="public/main.js" ></script>
17<?php 17<?php
18if(isset($_GET['action']) && $_GET['action'] === 'edition')
19{
20
21 // bibliothèques JS ckeditor
22?>
23 <script src="lib/ckeditor5/build/ckeditor.js"></script>
24<?php
25}
18$js = ob_get_clean(); 26$js = ob_get_clean();
19 27
20// variable $header 28// variable $header
@@ -52,18 +60,50 @@ for($i = 0; $i < $Albums->fileListCount; $i++)
52 </div> 60 </div>
53 </div> 61 </div>
54 </aside> 62 </aside>
55 <article id="albumHTML" > 63<?php
64
65// formulaires et éditeur à la place de l'article à modifier
66if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
67 && isset($_GET['action']) && $_GET['action'] === 'edition')
68{
69 $style = 'class="articleAvecEditeur"';
70?>
71 <article id="albumHTML" <?= $style ?> >
72 <h3>Modifier cet album</h3>
73 <?= $editeurHTML ?>
74<?php
75}
76// affichage normal
77else
78{
79?>
80 <article id="albumHTML" >
56 <?= $album ?> 81 <?= $album ?>
82<?php
83}
84?>
57 </article> 85 </article>
58<?php 86<?php
59// boutons 87// boutons modifier et supprimer, mais pas monter ni descendre
60if($_SESSION['admin'] == 1) 88// modifier ouvre l'éditeur, supprimer renvoie vers la discographie
89if($_SESSION['admin'] == 1 && (!isset($_GET['action']) || $_GET['action'] !== 'edition'))
61{ 90{
62?> 91?>
63 <p> 92 <p>
64 <a href="index.php?page=discographie&action=edition&file_code=<?= $fileCode ?>#<?= $fileCode ?>" > 93 <a href="index.php?page=album&action=edition&file_code=<?= $fileCode ?>" >
65 <img src="public/icone_modifier.png" > 94 <img src="public/icone_modifier.png" >
66 </a> 95 </a>
96 <a href="index.php?page=discographie&action=suppression&file_code=<?= $fileCode ?>" onclick="confirmerSuppression()" >
97 <img src="public/icone_supprimer.png" >
98 </a>
99 <a class="linkAlbumHTML" href="index.php?page=discographie" >Retour à la discographie</a>
100 </p>
101<?php
102}
103else
104{
105?>
106 <p>
67 <a class="linkAlbumHTML" href="index.php?page=discographie" >Retour à la discographie</a> 107 <a class="linkAlbumHTML" href="index.php?page=discographie" >Retour à la discographie</a>
68 </p> 108 </p>
69<?php 109<?php
diff --git a/view/discographie.php b/view/discographie.php
index 1660b0c..206a9b8 100644
--- a/view/discographie.php
+++ b/view/discographie.php
@@ -15,7 +15,7 @@ ob_start();
15?> 15?>
16 <script type="text/javascript" src="public/main.js" ></script> 16 <script type="text/javascript" src="public/main.js" ></script>
17<?php 17<?php
18if(isset($_GET['action']) && $_GET['action'] == 'edition') 18if(isset($_GET['action']) && $_GET['action'] === 'edition')
19{ 19{
20 20
21 // bibliothèques JS ckeditor 21 // bibliothèques JS ckeditor
@@ -67,7 +67,7 @@ for($i = 0; $i < $Albums->fileListCount; $i++)
67// éditeur ou bouton "Nouvel album" 67// éditeur ou bouton "Nouvel album"
68if($_SESSION['admin'] == 1) 68if($_SESSION['admin'] == 1)
69{ 69{
70 if(isset($_GET['action']) && $_GET['action'] == 'edition' && $fileCode == '') 70 if(isset($_GET['action']) && $_GET['action'] === 'edition' && $fileCode === '')
71 { 71 {
72 $style = 'class="articleAvecEditeur"'; 72 $style = 'class="articleAvecEditeur"';
73?> 73?>
@@ -112,9 +112,9 @@ for($i = 0; $i < $Albums->fileListCount; $i++)
112?> 112?>
113 <article id="<?= $Albums->fileList[$i]['fileCode'] ?>" <?= $style ?>> 113 <article id="<?= $Albums->fileList[$i]['fileCode'] ?>" <?= $style ?>>
114<?php 114<?php
115 // formulaires et éditeur 115 // formulaires et éditeur à la place de l'article à modifier
116 if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 116 if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
117 && isset($_GET['action']) && $_GET['action'] == 'edition' 117 && isset($_GET['action']) && $_GET['action'] === 'edition'
118 && $Albums->fileList[$i]['fileCode'] == $fileCode) 118 && $Albums->fileList[$i]['fileCode'] == $fileCode)
119 { 119 {
120 ?> 120 ?>
diff --git a/view/template-formulaires.php b/view/template-formulaires.php
index 01f86c2..be51df6 100644
--- a/view/template-formulaires.php
+++ b/view/template-formulaires.php
@@ -43,9 +43,9 @@ ob_start();
43?> 43?>
44 44
45 <div class="conteneur_article" > 45 <div class="conteneur_article" >
46 <form action="index.php?page=<?= $page ?><?= $fileCodeArgument ?>&action=submit" method="post" enctype="multipart/form-data" > 46 <form action="index.php?page=<?= $page ?>&action=submit<?= $fileCodeArgument ?>" method="post" enctype="multipart/form-data" >
47<?php 47<?php
48if($page == 'discographie') 48if($page === 'discographie' || $page === 'album')
49{ 49{
50 echo($inputsAlbum . "<p><i>Infos qui seront affichées dans la page spécifique à cet album:</i></p>"); 50 echo($inputsAlbum . "<p><i>Infos qui seront affichées dans la page spécifique à cet album:</i></p>");
51} 51}
@@ -53,7 +53,7 @@ if($page == 'discographie')
53 53
54 <textarea id="editor" name="contenu" ></textarea> 54 <textarea id="editor" name="contenu" ></textarea>
55 <input class="boutonSubmitEditeur" type="submit" value="Valider" /> 55 <input class="boutonSubmitEditeur" type="submit" value="Valider" />
56 <a class="boutonAnnuler" href="index.php?page=<?= $page ?>" > 56 <a class="boutonAnnuler" href="index.php?page=<?= $lienBoutonAnnuler ?>" >
57 <input type="button" value="Annuler" /> 57 <input type="button" value="Annuler" />
58 </a> 58 </a>
59 59
diff --git a/à faire après livraison.txt b/à faire après livraison.txt
index 5037312..8c95b2f 100644
--- a/à faire après livraison.txt
+++ b/à faire après livraison.txt
@@ -1,6 +1,13 @@
1empêcher de monter ou descendre à nouveau un élément en rechargeant la page
2-> solution 1: rediriger vers la même page sans action dans l'url après le déplacement
3-> solution 2: déplacement AJAX avec javascript
4ne remplace pas la solution 1 qui doit toujours fonctionner
5
6infobulles en mode admin
7
1bouton partage et lien d'encre sur tous les articles 8bouton partage et lien d'encre sur tous les articles
2 9
3barre de défilement au menu déroulant de la discographie (penser aussi à le rendre moins moche) 10menu déroulant de la discographie de longueur fixe et avec barre de défilement en CSS (penser aussi à le rendre moins moche)
4 11
5miniatures albums, le même fichier est utilisé pour la pochette et dans la page album, la miniature de l'une écrase celle de l'autre 12miniatures albums, le même fichier est utilisé pour la pochette et dans la page album, la miniature de l'une écrase celle de l'autre
6(problème: les dimensions des deux miniatures sont censées être différentes) 13(problème: les dimensions des deux miniatures sont censées être différentes)
@@ -11,13 +18,15 @@ images d'en-tête svg?
11 18
12trouver mieux que la police "comic sans MS" dans les images de BD 19trouver mieux que la police "comic sans MS" dans les images de BD
13 20
21quand un article ou album est ajouté, le mentionner pendant une semaine dans la section actualité de la page menu
22
14images des articles en grand et miniature, Zoom sur images (articles) 23images des articles en grand et miniature, Zoom sur images (articles)
15affichage avec javascript OU au moins dans une "page" dotée d'un bouton pour sortir (avec GD? avec imagemagick?) 24affichage avec javascript OU au moins dans une "page" dotée d'un bouton pour sortir (avec GD? avec imagemagick?)
16 25
17galerie en css (ou/et en javascript) pour les peintures de bateau 26galerie en css (ou/et en javascript) pour les peintures de bateau
18https://www.guyom-design.com/blog/astuces/css/tuto_diapo_css/ 27https://www.guyom-design.com/blog/astuces/css/tuto_diapo_css/
19 28
20hyperlien avec liens relatifs (par exemple dans emoi des mots) 29hyperlien avec liens relatifs (par exemple dans emoi des mots qui doit pointer vers la presse)
21 30
22créer page musique 31créer page musique
23 32