summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-11-29 03:25:19 +0100
committerpolo <ordipolo@gmx.fr>2021-11-29 03:25:19 +0100
commit29df6f1362745eabf4fbcaedf309eb63795152fa (patch)
tree8c2f4839c119db193eca4f35aeac96356a8ef439
parentb97a68343ec5c4ff1fae25ff5dc41f1a2ce6a17f (diff)
downloadmelaine-29df6f1362745eabf4fbcaedf309eb63795152fa.zip
discographie
-rw-r--r--controller/admin.php92
-rw-r--r--controller/ckeditor.php63
-rw-r--r--controller/visitor.php55
-rw-r--r--index.php39
-rw-r--r--lisez-moi.txt11
-rw-r--r--model/Album.php73
-rw-r--r--model/Image.php16
-rw-r--r--model/Page.php15
-rw-r--r--view/discographie.php48
-rw-r--r--view/template-formulaires.php10
10 files changed, 235 insertions, 187 deletions
diff --git a/controller/admin.php b/controller/admin.php
index 90924e0..e319c80 100644
--- a/controller/admin.php
+++ b/controller/admin.php
@@ -1,15 +1,15 @@
1<?php 1<?php
2// controller/admin.php 2// controller/admin.php
3// 3//
4// utilisation du site en écriture 4// utilisation du site en écriture (admin uniquement)
5// version des pages en mode admin lorsque celui-ci crée ou modifie quelque chose 5// l'éditeur ouvert ou demande de suppression d'un élément
6 6
7function melaineEdit($numArticle, $suppression) 7function melaineEdit($numArticle, $suppression)
8{ 8{
9 $page_actuelle = "melaine"; 9 $page_actuelle = "melaine";
10 10
11 // modèle 11 // modèle
12 $Article = new Page($page_actuelle, 'html'); 12 $Article = new Page($page_actuelle);
13 13
14 // nouvel article 14 // nouvel article
15 if($numArticle == 0) 15 if($numArticle == 0)
@@ -21,7 +21,7 @@ function melaineEdit($numArticle, $suppression)
21 { 21 {
22 // nom de l'article ciblé (objet et session) 22 // nom de l'article ciblé (objet et session)
23 $Article->findFileName($numArticle); 23 $Article->findFileName($numArticle);
24 $_SESSION['nomFichier'] = $Article->fileName; 24 $_SESSION['target'] = $Article->fileName;
25 25
26 // suppression 26 // suppression
27 if($suppression) 27 if($suppression)
@@ -42,10 +42,10 @@ function melaineEdit($numArticle, $suppression)
42 $articles = array_reverse($Article->readAll()); // lourd 42 $articles = array_reverse($Article->readAll()); // lourd
43 43
44 // sécurisation du contenu pré-existant inséré dans l'éditeur 44 // sécurisation du contenu pré-existant inséré dans l'éditeur
45 if($numArticle >= 0 && !$suppression) 45 if($numArticle > 0 && !$suppression)
46 { 46 {
47 require('controller/ckeditor.php'); 47 require('controller/ckeditor.php');
48 $texte = preparationCKeditor($numArticle, $texte); 48 $texte = preparationCKeditor($texte);
49 } 49 }
50 50
51 // NB: penser à ajouter au template la fonctionnalité "autosave" 51 // NB: penser à ajouter au template la fonctionnalité "autosave"
@@ -61,104 +61,96 @@ function melaineEdit($numArticle, $suppression)
61 require('view/template.php'); 61 require('view/template.php');
62} 62}
63 63
64function discoEdit($numArticle, $albumCode, $suppression) 64function discoEdit($albumCode, $suppression)
65{ 65{
66 $page_actuelle = "discographie"; 66 $page_actuelle = "discographie";
67 $title = "Discographie"; 67 $title = "Discographie";
68 68
69 // modèle 69 // modèle
70 $Album = new Album($page_actuelle); 70 $Albums = new Album($page_actuelle);
71 $Album->makeFileList(); 71 $Albums->makeFileList();
72 72
73 // nouvel album 73 // nouvel album
74 if($numArticle == 0) 74 if($albumCode == '')
75 { 75 {
76 unset($_SESSION['target']);
76 $title = "Ajouter un album"; 77 $title = "Ajouter un album";
78
79 // formulaires vides
80 $vignette = ['', '', ''];
77 $texte = ''; 81 $texte = '';
78 } 82 }
79 else 83 else
80 { 84 {
81 // nom de l'article ciblé (objet et session) 85 // album ciblé
82 $Album->findFileName($numArticle); 86 $Albums->albumCode = $albumCode;
83 $_SESSION['nomFichier'] = $Album->fileName;
84 87
85 // suppression 88 // suppression
86 if($suppression) 89 if($suppression)
87 { 90 {
88 $Album->delete(); 91 $Albums->delete();
89 header('Location: index.php?page=' . $page_actuelle); 92 header('Location: index.php?page=' . $page_actuelle);
90 exit(); 93 exit();
91 } 94 }
92 // modification 95 // modification
93 else 96 else
94 { 97 {
98 $_SESSION['target'] = $Albums->albumCode;
95 $title = "Modifier un album"; 99 $title = "Modifier un album";
96 $texte = $Album->readOneAlbum($albumCode); 100 $texte = $Albums->readOneHTML($albumCode);
97 $vignette = json_decode($Album->getVignette(), true); 101 $vignette = $Albums->getVignetteJSON();
98 } 102 }
99 } 103 }
100 104
101 // traitements PHP pour l'éditeur 105 // traitements PHP pour l'éditeur
102 // sécurisation du contenu pré-existant inséré dans l'éditeur 106 // sécurisation du contenu pré-existant inséré dans l'éditeur
103 if($numArticle >= 0 && !$suppression) 107 if(!empty($albumCode) && !$suppression && !empty($texte))
104 { 108 {
105 require('controller/ckeditor.php'); 109 require('controller/ckeditor.php');
106 $texte = preparationCKeditor($numArticle, $texte); 110 $texte = preparationCKeditor($texte);
107 } 111 }
108 112
113 // préremplir le champ <input type="file" >
114 // c'est normallement impossible
115
109 // contenu de tous les fichiers JSON (= tableau de chaines) 116 // contenu de tous les fichiers JSON (= tableau de chaines)
110 $albumsJSON = $Album->readAll(); 117 $albumsJSON = $Albums->readAll();
111 // noms des fichiers JSON 118 // noms des fichiers JSON
112 $albumNamesJSON = $Album->fileList; 119 $albumNamesJSON = $Albums->fileList;
113 120
114 // changer les chaines JSON en tableaux: titre, année, pochette 121 $annees = [];
115 $i = 0; 122 for($i = 0; $i < count($albumsJSON); $i++)
116 $annees = array();
117 foreach($albumsJSON as $oneAlbum)
118 { 123 {
119 $albumsJSON[$i] = json_decode($oneAlbum, true); 124 // une case supplémentaire contient le "albumCode"
125 $albumsJSON[$i][3] = pathinfo($albumNamesJSON[$i])['filename'];
120 126
121 // ajout des noms des fichiers JSON
122 $albumsJSON[$i][3] = $albumNamesJSON[$i];
123 $annees[$i] = $albumsJSON[$i][1]; 127 $annees[$i] = $albumsJSON[$i][1];
124 $i++;
125 } 128 }
126 print_r($albumsJSON); 129
127 //exit();
128 // tri d'un tableau multidimensionnel 130 // tri d'un tableau multidimensionnel
129 array_multisort($annees, $albumsJSON); 131 array_multisort($annees, $albumsJSON);
130 132
131 // on passe maintenant au contenu HTML
132 $Album->format = 'html';
133 $Album->makeFileList();
134 $albumNamesHTML = $Album->fileList;
135
136 // lien vers le HTML ou ancre? 133 // lien vers le HTML ou ancre?
137 // pour chaque album, détecter le fichier html
138 // si non, ne fournir qu'un lien d'ancre pour la liste d'album
139 $i = 0;
140 $avecLien = []; 134 $avecLien = [];
141 foreach($albumsJSON as $oneAlbum) 135 $linkDiscoChrono = [];
136 for($i = 0; $i < count($albumsJSON); $i++)
142 { 137 {
143 // nom sans extension 138 // cas particulier où le dossier "html" est vide
144 $chemin = pathinfo($oneAlbum[3]); 139 if(!empty($Albums->fileList))
145 $nomJSONsansExt = $chemin['filename'];
146
147 // au cas où la discographie ne contient aucun html
148 if(!empty($albumNamesHTML))
149 { 140 {
150 if(file_exists('data/discographie/html/' . $nomJSONsansExt . '.html')) 141 if(file_exists('data/discographie/html/' . $albumsJSON[$i][3] . '.html'))
151 { 142 {
152 $lienAlbum[$i] = 'album&album_code=' . $nomJSONsansExt . '&album_name=' . $albumsJSON[$i][0]; 143 $lienAlbum[$i] = 'page=album&album_name=' . $albumsJSON[$i][0] . '&album_code=' . $albumsJSON[$i][3];
153 $lienBoutonModif[$i] = 'discographie&action=edition&album_code=' . $nomJSONsansExt;
154 $avecLien[$i] = true; 144 $avecLien[$i] = true;
145 $linkDiscoChrono[$i] = 'linkChrono'; // css
155 } 146 }
156 else 147 else
157 { 148 {
158 $lienAlbum[$i] = 'discographie#' . $albumsJSON[$i][0]; 149 $lienAlbum[$i] = 'page=discographie#' . $albumsJSON[$i][0];
159 $avecLien[$i] = false; 150 $avecLien[$i] = false;
151 $linkDiscoChrono[$i] = 'noLinkChrono'; // css
160 } 152 }
161 $i++; 153 $lienBoutonModif[$i] = 'page=discographie&action=edition&album_code=' . $albumsJSON[$i][3];
162 } 154 }
163 } 155 }
164 156
diff --git a/controller/ckeditor.php b/controller/ckeditor.php
index 2b9f168..661e0e3 100644
--- a/controller/ckeditor.php
+++ b/controller/ckeditor.php
@@ -7,41 +7,33 @@
7// il y a aussi un fichier CSS parce que le HTML créé par l'éditeur ne suffit pas à lui-même 7// il y a aussi un fichier CSS parce que le HTML créé par l'éditeur ne suffit pas à lui-même
8 8
9// avant de placer l'éditeur 9// avant de placer l'éditeur
10function preparationCKeditor($numArticle, $texte) 10function preparationCKeditor($html)
11{ 11{
12 // ici $numArticle sert uniquement à savoir si on crée ou modifie un article 12 // texte initial inséré avec setData() dans l'éditeur
13 // danger!
14 // setData() n'insère pas le texte si il ne respecte pas certains critères, l'utilisateur risque de perdre des données en validant un nouveau contenu sans avoir pu modifier l'ancien
13 15
14 // texte initial inséré avec setData() dans l'éditeur, 16 if(empty($html))
15 // on recherche ici les causes expliquant qu'il n'apparaisse pas à l'ouverture de l'éditeur,
16 // les données précédentes sont écrasées à la validation du nouveau texte
17 if ($numArticle > 0)
18 { 17 {
19 if(empty($texte)) 18 header('Location: index.php?erreur=empty_input');
20 { 19 }
21 header('Location: index.php?erreur=empty_input');
22 }
23 20
24 // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine 21 // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
25 $texte = trim($texte); 22 $html = trim($html);
26 23
27 // supprimer les sauts de ligne 24 // supprimer les sauts de ligne
28 $sautsDeLigne = array("\n", "\r", "\r\n"); 25 $sautsDeLigne = array("\n", "\r", "\r\n");
29 $texte = str_replace($sautsDeLigne, '', $texte); 26 $html = str_replace($sautsDeLigne, '', $html);
30 27
31 // échapper tous les ', ", \ et caractère NULL 28 // échapper tous les ', ", \ et caractère NULL
32 $texte = addslashes($texte); 29 $html = addslashes($html);
33 }
34 else
35 {
36 $texte = ''; // nouveau contenu
37 }
38 30
39 return($texte); 31 return($html);
40} 32}
41 33
42// réception du HTML créé par l'éditeur 34// réception du HTML créé par l'éditeur
43// le nom du fichier est celui dans $_SESSION['nomFichier'] 35// le nom du fichier est celui dans $_SESSION['nomFichier']
44function submitCKeditor($nomFichier) 36function submitCKeditor($target)
45{ 37{
46 $page = $_GET['page']; 38 $page = $_GET['page'];
47 39
@@ -79,10 +71,10 @@ function submitCKeditor($nomFichier)
79 $Album = new Album($page); 71 $Album = new Album($page);
80 72
81 // enregistrement 73 // enregistrement
82 if($_GET['article'] == 0) 74 if($target == '')
83 { 75 {
84 // page disco 76 // page disco
85 $Album->createVignette($titre, $annee, $pochette); 77 $_SESSION['erreur'] = $Album->createVignette($titre, $annee, $pochette);
86 78
87 // page de l'album 79 // page de l'album
88 if(!empty($_POST['contenu'])) 80 if(!empty($_POST['contenu']))
@@ -92,28 +84,35 @@ function submitCKeditor($nomFichier)
92 } 84 }
93 else 85 else
94 { 86 {
87 $Album->albumCode = $target;
88
95 // page disco 89 // page disco
96 $Album->updateVignette($titre, $annee, $pochette); 90 $_SESSION['erreur'] = $Album->updateVignetteJSON($titre, $annee, $pochette);
97 91
98 // page de l'album 92 // page de l'album
99 if(isset($_POST['contenu'])) 93 if(isset($_POST['contenu']))
100 { 94 {
101 $Album->update($content); 95 $Album->format = 'html';
96 $Album->setFileName();
97 if(!empty($Album->fileName))
98 {
99 $Album->update($_POST['contenu']);
100 }
102 } 101 }
103 } 102 }
104 } 103 }
105 // autres pages 104 // autres pages
106 else 105 else
107 { 106 {
108 $Article = new Page($page, 'html'); 107 $Article = new Page($page);
109 108
110 if($_GET['article'] == 0) 109 if($target == '')
111 { 110 {
112 $Article->create($contenu); 111 $Article->create($contenu);
113 } 112 }
114 else 113 else
115 { 114 {
116 $Article->fileName = $nomFichier; 115 $Article->fileName = $target;
117 $Article->update($contenu); 116 $Article->update($contenu);
118 } 117 }
119 } 118 }
diff --git a/controller/visitor.php b/controller/visitor.php
index 0e79ee2..6c6146b 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -1,7 +1,7 @@
1<?php 1<?php
2// controller/visitor.php 2// controller/visitor.php
3// 3//
4// simple affichage du site au visiteur 4// affichage du site en lecture seul (visiteur ou admin)
5 5
6// pages du sites 6// pages du sites
7function accueil() 7function accueil()
@@ -50,63 +50,48 @@ function discoVisitor()
50 $title = "Discographie"; 50 $title = "Discographie";
51 51
52 // modèle 52 // modèle
53 $AllAlbums = new Album($page_actuelle); 53 $Albums = new Album($page_actuelle);
54 $AllAlbums->makeFileList(); 54 $Albums->makeFileList();
55 55
56 // contenu de tous les fichiers JSON (= tableau de chaines) 56 // contenu de tous les fichiers JSON (= tableau de chaines)
57 $albumsJSON = array_reverse($AllAlbums->readAll()); 57 $albumsJSON = $Albums->readAll();
58 // noms des fichiers JSON 58 // noms des fichiers JSON
59 $albumNamesJSON = $AllAlbums->fileList; 59 $albumNamesJSON = $Albums->fileList;
60 60
61 // changer les chaines JSON en tableaux: titre, année, pochette 61 $annees = [];
62 $i = 0; 62 for($i = 0; $i < count($albumsJSON); $i++)
63 $annees = array();
64 foreach($albumsJSON as $oneAlbum)
65 { 63 {
66 $albumsJSON[$i] = json_decode($oneAlbum, true); 64 // une case supplémentaire contient le "albumCode"
67 $annees[$i] = $albumsJSON[$i][1]; 65 $albumsJSON[$i][3] = pathinfo($albumNamesJSON[$i])['filename'];
68 66
69 // ajout des noms des fichiers JSON 67 $annees[$i] = $albumsJSON[$i][1];
70 $albumsJSON[$i][3] = $albumNamesJSON[$i];
71
72 $i++;
73 } 68 }
69
74 // tri d'un tableau multidimensionnel 70 // tri d'un tableau multidimensionnel
75 array_multisort($annees, $albumsJSON); 71 array_multisort($annees, $albumsJSON);
76 72
77 // on passe maintenant au contenu HTML
78 $AllAlbums->format = 'html';
79 $AllAlbums->makeFileList();
80 $albumNamesHTML = $AllAlbums->fileList;
81
82 // lien vers le HTML ou ancre? 73 // lien vers le HTML ou ancre?
83 // pour chaque album, détecter le fichier html 74 $lienAlbum = [];
84 // si non, ne fournir qu'un lien d'ancre pour la liste d'album
85 $i = 0;
86 $avecLien = []; 75 $avecLien = [];
87 $linkDiscoChrono = []; 76 $linkDiscoChrono = [];
88 foreach($albumsJSON as $oneAlbum) 77 for($i = 0; $i < count($albumsJSON); $i++)
89 { 78 {
90 // nom sans extension 79 // cas particulier où le dossier "html" est vide
91 $chemin = pathinfo($oneAlbum[3]); 80 if(!empty($Albums->fileList))
92 $nomJSONsansExt = $chemin['filename'];
93
94 // au cas où la discographie ne contient aucun html
95 if(!empty($albumNamesHTML))
96 { 81 {
97 if(file_exists('data/discographie/html/' . $nomJSONsansExt . '.html')) 82 if(file_exists('data/discographie/html/' . $albumsJSON[$i][3] . '.html'))
98 { 83 {
99 $lienAlbum[$i] = 'album&album_code=' . $nomJSONsansExt . '&album_name=' . $albumsJSON[$i][0]; 84 $lienAlbum[$i] = 'page=album&album_name=' . $albumsJSON[$i][0] . '&album_code=' . $albumsJSON[$i][3];
100 $avecLien[$i] = true; 85 $avecLien[$i] = true;
101 $linkDiscoChrono[$i] = 'linkChrono'; // css 86 $linkDiscoChrono[$i] = 'linkChrono'; // css
102 } 87 }
103 else 88 else
104 { 89 {
105 $lienAlbum[$i] = 'discographie#' . $albumsJSON[$i][0]; 90 $lienAlbum[$i] = 'page=discographie#' . $albumsJSON[$i][0];
106 $avecLien[$i] = false; 91 $avecLien[$i] = false;
107 $linkDiscoChrono[$i] = 'noLinkChrono'; // css 92 $linkDiscoChrono[$i] = 'noLinkChrono'; // css
108 } 93 }
109 $i++; 94 $lienBoutonModif[$i] = 'page=discographie&action=edition&album_code=' . $albumsJSON[$i][3];
110 } 95 }
111 } 96 }
112 97
@@ -122,7 +107,7 @@ function album($albumCode, $albumName)
122 $page_actuelle = 'discographie'; 107 $page_actuelle = 'discographie';
123 $title = $albumName; 108 $title = $albumName;
124 109
125 $album = Album::readOneAlbum($albumCode); // simple, efficace 110 $album = Album::readOneHTML($albumCode); // simple, efficace
126 111
127 // variables $css, $header et $content 112 // variables $css, $header et $content
128 require('view/album.php'); 113 require('view/album.php');
diff --git a/index.php b/index.php
index a534ddf..a34a4be 100644
--- a/index.php
+++ b/index.php
@@ -47,6 +47,12 @@
47// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery 47// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
48session_start(); 48session_start();
49 49
50if(!empty($_SESSION['erreur']))
51{
52 echo('<script>alert(\'' . $_SESSION['erreur'] . '\');</script>');
53 unset($_SESSION['erreur']);
54}
55
50// au premier démarrage du site 56// au premier démarrage du site
51// l'explication des éventuels problèmes de droits en lecture/écriture est à chercher ici: 57// l'explication des éventuels problèmes de droits en lecture/écriture est à chercher ici:
52require('controller/installation.php'); 58require('controller/installation.php');
@@ -58,8 +64,10 @@ installation();
58if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') 64if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image')
59{ 65{
60 // et une backdoor de fermée! 66 // et une backdoor de fermée!
61 if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 || !isset($_FILES['upload']) || empty($_FILES['upload'])) 67 if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1
68 || !isset($_FILES['upload']) || empty($_FILES['upload']))
62 { 69 {
70 // sans effet?
63 header('Location: index.php?erreur=image_ajax'); 71 header('Location: index.php?erreur=image_ajax');
64 } 72 }
65 else 73 else
@@ -90,9 +98,9 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
90 } 98 }
91 99
92 // modification 100 // modification
93 if(isset($_SESSION['nomFichier'])) 101 if(isset($_SESSION['target']))
94 { 102 {
95 submitCKeditor($_SESSION['nomFichier']); 103 submitCKeditor($_SESSION['target']);
96 } 104 }
97 // nouvel article 105 // nouvel article
98 else 106 else
@@ -179,10 +187,8 @@ if(isset($_GET['page']))
179 else 187 else
180 { 188 {
181 // par sécurité 189 // par sécurité
182 if(isset($_SESSION['nomFichier'])) 190 unset($_SESSION['nomFichier']);
183 { 191
184 unset($_SESSION['nomFichier']);
185 }
186 melaineEdit(0, 0); 192 melaineEdit(0, 0);
187 } 193 }
188 } 194 }
@@ -202,29 +208,24 @@ if(isset($_GET['page']))
202 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') 208 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition')
203 { 209 {
204 // modification 210 // modification
205 if(isset($_GET['album']) && is_numeric($_GET['album']) && $_GET['album'] > 0) 211 if(isset($_GET['album_code']) || !empty($_GET['album_code']))
206 { 212 {
207 if(!isset($_GET['album_code'])) 213 discoEdit($_GET['album_code'], 0);
208 {
209 $_GET['album_code'] = '';
210 }
211 discoEdit($_GET['album'], $_GET['album_code'], 0);
212 } 214 }
213 // nouvel article 215 // nouvel article
214 else 216 else
215 { 217 {
216 // par sécurité 218 // par sécurité
217 if(isset($_SESSION['nomFichier'])) 219 $_GET['album_code'] = '';
218 { 220 unset($_SESSION['nomFichier']);
219 unset($_SESSION['nomFichier']); 221
220 } 222 discoEdit('', 0);
221 discoEdit(0, '', 0);
222 } 223 }
223 } 224 }
224 // suppression 225 // suppression
225 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') 226 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
226 { 227 {
227 discoEdit($_GET['album'], '', 1); 228 discoEdit($_GET['album_code'], 1);
228 } 229 }
229 else 230 else
230 { 231 {
diff --git a/lisez-moi.txt b/lisez-moi.txt
index f15c227..255b452 100644
--- a/lisez-moi.txt
+++ b/lisez-moi.txt
@@ -1,20 +1,20 @@
1Pré-requis: 1Pré-requis:
2 2
3- Un serveur apache avec PHP. 3- Un serveur apache ecutant PHP.
4- Le n'utilise pas de base de données mais un ensemble de fichiers HTML. 4- Le n'utilise pas de base de données mais un ensemble de fichiers HTML.
5- Le module GD de PHP qui est une dépendance du "kcfinder" (bibliothèque nécessaire à l'upload d'image dans le ckeditor). 5- Le module GD de PHP pour créer des miniatures des photos (bande passante).
6- La possibilité d'utiliser un fichier .htaccess pour la sécurité (du mot de passe admin en particulier). 6- La possibilité d'utiliser un fichier .htaccess pour la sécurité (du mot de passe admin en particulier).
7- L'admin du site (Melaine lui-même à priori) ne doit pas utiliser un navigateur trop vieux (pour le code javascript du ckeditor). 7- Le responsable du site (Melaine) ne doit pas utiliser un navigateur trop vieux (ckeditor).
8 8
9 9
10Informations: 10Informations:
11 11
12Le site n'utilise pas de base de données mais à la place un ensemble de fichiers. Le dossier data contient des dossiers "html" et "images". 12Le site n'utilise pas de base de données mais à la place un ensemble de fichiers. Le dossier data contient des dossiers "html" et "images", ainsi qu'un dossier 'json'.
13- Les premiers contiennent le texte sous forme de fichiers HTML. 13- Les premiers contiennent le texte sous forme de fichiers HTML.
14- Les seconds les images ainsi qu'un dossier "thumbnails" (chargement rapide des pages). 14- Les seconds les images ainsi qu'un dossier "thumbnails" (chargement rapide des pages).
15Le code suit une architecture modèle-vue-contrôleur, il n'utilise pas de framework. 15Le code suit une architecture modèle-vue-contrôleur, il n'utilise pas de framework.
16- Il n'est pas possible pour l'instant d'uploader du multimedia (son et video). Peut-être plus tard. 16- Il n'est pas possible pour l'instant d'uploader du multimedia (son et video). Peut-être plus tard.
17- La fonctionnalité d'embarquer du multimedia (mettre une video youtube dans la page) n'est pas prévue. 17- Il n'est pas possible non plus d'embarquer du multimedia (son et vidéo bergé ailleurs). Peut-être plus tard.
18 18
19 19
20Installation: 20Installation:
@@ -24,6 +24,7 @@ Installation:
24chmod -R 777 data 24chmod -R 777 data
25Le php se chargera des ajustements (supprimer l'autorisation des fichiers en exécution, permettre à l'utilisateur de manipuler les nouveaux fichiers sans accès root, créer un backup des données). 25Le php se chargera des ajustements (supprimer l'autorisation des fichiers en exécution, permettre à l'utilisateur de manipuler les nouveaux fichiers sans accès root, créer un backup des données).
26- Autoriser le .htaccess (normalement par une manipulation dans le fichier /etc/php/php.ini du serveur) 26- Autoriser le .htaccess (normalement par une manipulation dans le fichier /etc/php/php.ini du serveur)
27- Augmenter la taille maximale des fichiers (par défaut de 2Mo) pouvant être téléchargés dans le php.ini, ainsi que dans le fichier model/Image.php. Une taille max de 5Mo est très raisonnable.
27 28
28 29
29Redirections: 30Redirections:
diff --git a/model/Album.php b/model/Album.php
index 2254c10..1631c46 100644
--- a/model/Album.php
+++ b/model/Album.php
@@ -6,6 +6,7 @@ class Album extends Page // classe "objet"
6 public function __construct($page) 6 public function __construct($page)
7 { 7 {
8 $this->page = $page; 8 $this->page = $page;
9 $this->albumCode = ''; // désigne un fichier json et un html
9 $this->format = 'json'; // vaut 'html' dans la classe mère 10 $this->format = 'json'; // vaut 'html' dans la classe mère
10 $this->time = time(); 11 $this->time = time();
11 } 12 }
@@ -19,7 +20,7 @@ class Album extends Page // classe "objet"
19 // create 20 // create
20 public function createVignette($titre, $annee, $pochette) 21 public function createVignette($titre, $annee, $pochette)
21 { 22 {
22 $this->format = 'json'; 23 //$this->format = 'json';
23 24
24 if($pochette != '') 25 if($pochette != '')
25 { 26 {
@@ -28,7 +29,7 @@ class Album extends Page // classe "objet"
28 $Image = new Image(false); 29 $Image = new Image(false);
29 $Image->upload(); 30 $Image->upload();
30 31
31 /*$erreur = $Image->getError(); 32 /*$erreur = $Image->erreur;
32 if(!empty($erreur)) 33 if(!empty($erreur))
33 {}*/ 34 {}*/
34 } 35 }
@@ -41,18 +42,41 @@ class Album extends Page // classe "objet"
41 fputs($fichier, $albumJSON); 42 fputs($fichier, $albumJSON);
42 fclose($fichier); 43 fclose($fichier);
43 chmod($nom_fichier, 0666); 44 chmod($nom_fichier, 0666);
45
46 return($Image->erreur);
44 } 47 }
45 48
46 // read 49 // read
47 public function getVignette() 50 public function readAll()
51 {
52 // lecture des données
53 $albumsJSON = parent::readAll();
54
55 // conversion des chaines JSON en tableaux: titre, année, pochette
56 for($i = 0; $i < count($albumsJSON); $i++)
57 {
58 $albumsJSON[$i] = json_decode($albumsJSON[$i], true);
59 }
60
61 return($albumsJSON);
62 }
63
64 public function getVignetteJSON()
48 { 65 {
49 return(file_get_contents($this->fileName)); 66 return(json_decode(file_get_contents('data/discographie/json/' . $this->albumCode . '.json')));
50 } 67 }
51 68
52 // page de l'album 69 // page de l'album
53 public static function readOneAlbum($albumCode) 70 public static function readOneHTML($albumCode)
54 { 71 {
55 return(file_get_contents('data/discographie/html/' . $albumCode . '.html')); 72 if(file_exists('data/discographie/html/' . $albumCode . '.html'))
73 {
74 return(file_get_contents('data/discographie/html/' . $albumCode . '.html'));
75 }
76 else
77 {
78 return('');
79 }
56 } 80 }
57 81
58 // pour afficher des dates 82 // pour afficher des dates
@@ -64,12 +88,43 @@ class Album extends Page // classe "objet"
64 }*/ 88 }*/
65 89
66 // update 90 // update
67 public function updateVignette() 91 public function updateVignetteJSON($titre, $annee, $pochette)
68 {} 92 {
93 // garder l'ancienne image
94 $albumJSON = self::getVignetteJSON();
95
96 if($pochette == '')
97 {
98 $pochette = $albumJSON[2];
99 }
100 else
101 {
102 // télécharger la pochette
103 require('model/Image.php');
104 $Image = new Image(false);
105 $Image->upload();
106 }
107
108 $albumJSON = json_encode([$titre, $annee, $pochette]);
109
110 // écriture
111 $nom_fichier = 'data/discographie/json/' . $this->albumCode . '.json';
112 $fichier = fopen($nom_fichier, 'w+'); // w pour créer ou écraser
113 fputs($fichier, $albumJSON);
114 fclose($fichier);
115 chmod($nom_fichier, 0666);
116
117 return($Image->erreur);
118 }
69 119
70 // delete 120 // delete
71 public function delete() 121 public function delete()
72 { 122 {
73 unlink($this->fileName); 123 unlink('data/' . $this->page . '/' . $this->format . '/' . $this->albumCode . '.json');
124
125 if(file_exists('data/' . $this->page . '/html/' . $this->albumCode . '.html'));
126 {
127 unlink('data/' . $this->page . '/html/' . $this->albumCode . '.html');
128 }
74 } 129 }
75} 130}
diff --git a/model/Image.php b/model/Image.php
index efd75cc..51d2fa4 100644
--- a/model/Image.php
+++ b/model/Image.php
@@ -3,10 +3,10 @@
3 3
4class Image 4class Image
5{ 5{
6 private const MAX_WEIGHT = 2000000; // taille max des images (par défaut 2Mo dans php.ini) 6 private const MAX_WEIGHT = 2000000; // à adapter au php.ini
7 private $page; 7 private $page;
8 private $ajax = false; 8 private $ajax = false; // vaut true avec le ckeditor
9 public $erreur = ''; 9 public $erreur;
10 10
11 public function __construct($ajax) 11 public function __construct($ajax)
12 { 12 {
@@ -37,19 +37,21 @@ class Image
37 } 37 }
38 else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';} 38 else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';}
39 } 39 }
40 else{$this->erreur = 'fichier trop lourd';} 40 else
41 {
42 $this->erreur = 'erreur du serveur: le fichier téléchargé est trop lourd, poids max = ' . self::MAX_WEIGHT . ' octets';
43 }
41 } 44 }
42 else 45 else
43 { 46 {
44 $this->erreur = $_FILES['upload']['error']; 47 $this->erreur = 'erreur du serveur: le fichier téléchargé est trop lourd, poids max = ' . self::MAX_WEIGHT . ' octets';
45 } 48 }
46 49
47 // retour des rêquetes AJAX 50 // retour des rêquetes AJAX
48 if($this->ajax) 51 if($this->ajax && empty($Image->erreur))
49 { 52 {
50 // nouveau chemin à renvoyer en format json 53 // nouveau chemin à renvoyer en format json
51 $chemin = '{"url": "data/' . $this->page . '/images/' . $_FILES['upload']['name'] . '"}'; 54 $chemin = '{"url": "data/' . $this->page . '/images/' . $_FILES['upload']['name'] . '"}';
52 //echo json_encode($chemin);
53 echo $chemin; 55 echo $chemin;
54 } 56 }
55 } 57 }
diff --git a/model/Page.php b/model/Page.php
index e03efe1..63730d8 100644
--- a/model/Page.php
+++ b/model/Page.php
@@ -13,10 +13,9 @@ class Page // classe "objet"
13 public $fileName = ''; // correspond à $_SESSION['nomFichier'] 13 public $fileName = ''; // correspond à $_SESSION['nomFichier']
14 protected $time; // timestamp pour noms des fichiers créés 14 protected $time; // timestamp pour noms des fichiers créés
15 15
16 public function __construct($page, $format) 16 public function __construct($page)
17 { 17 {
18 $this->page = $page; 18 $this->page = $page;
19 $this->format = $format;
20 $this->time = time(); 19 $this->time = time();
21 $this->makeFileList(); 20 $this->makeFileList();
22 } 21 }
@@ -39,6 +38,14 @@ class Page // classe "objet"
39 } 38 }
40 } 39 }
41 40
41 public function setFileName()
42 {
43 if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->albumCode . '.' . $this->format))
44 {
45 $this->fileName = 'data/' . $this->page . '/' . $this->format . '/' . $this->albumCode . '.' . $this->format;
46 }
47 }
48
42 // GET 49 // GET
43 50
44 // SET 51 // SET
@@ -48,7 +55,7 @@ class Page // classe "objet"
48 // create 55 // create
49 public function create($content) 56 public function create($content)
50 { 57 {
51 $format = 'html'; 58 //$format = 'html';
52 59
53 // nommer les fichiers avec le timestamp pour: 60 // nommer les fichiers avec le timestamp pour:
54 // - les trier par ordre chronologique 61 // - les trier par ordre chronologique
@@ -65,7 +72,7 @@ class Page // classe "objet"
65 public function readAll() 72 public function readAll()
66 { 73 {
67 $i = 0; 74 $i = 0;
68 $articles = array(); 75 $articles = [];
69 foreach ($this->fileList as $oneFile) 76 foreach ($this->fileList as $oneFile)
70 { 77 {
71 $articles[$i] = file_get_contents($oneFile); 78 $articles[$i] = file_get_contents($oneFile);
diff --git a/view/discographie.php b/view/discographie.php
index 25b82e1..d9bc6be 100644
--- a/view/discographie.php
+++ b/view/discographie.php
@@ -49,16 +49,15 @@ ob_start();
49 <div id="chronologie" > 49 <div id="chronologie" >
50 <!-- ajouter à chaque entrée une ancre et un lien soit vers l'ancre soit vers la page dédiée --> 50 <!-- ajouter à chaque entrée une ancre et un lien soit vers l'ancre soit vers la page dédiée -->
51<?php 51<?php
52//$i = 0;
53for($i = count($albumsJSON) - 1; $i >= 0; $i--) 52for($i = count($albumsJSON) - 1; $i >= 0; $i--)
53//for($i = 0; $i < count($albumsJSON); $i++)
54//foreach($albumsJSON as $oneAlbum) 54//foreach($albumsJSON as $oneAlbum)
55{ 55{
56 // mettre une adresse lorsqu'un fichier html existe 56 // menu dessous la mouette
57 // si il n'existe pas, mettre une ancre vers l'endroit sur la page 57 // comporte un lien si fichier html existe, sinon une ancre
58?> 58?>
59 <p><a class="<?= $linkDiscoChrono[$i] ?>" href="index.php?page=<?= $lienAlbum[$i] ?>" ><?= $albumsJSON[$i][1] ?> <?= $albumsJSON[$i][0] ?></a></p> 59 <p><a class="<?= $linkDiscoChrono[$i] ?>" href="index.php?<?= $lienAlbum[$i] ?>" ><?= $albumsJSON[$i][1] ?> - <?= $albumsJSON[$i][0] ?></a></p>
60<?php 60<?php
61 //$i++;
62} 61}
63?> 62?>
64 </div> 63 </div>
@@ -66,9 +65,10 @@ for($i = count($albumsJSON) - 1; $i >= 0; $i--)
66 </aside> 65 </aside>
67 <section> 66 <section>
68<?php 67<?php
68// éditeur ou bouton "Nouvel album"
69if($_SESSION['admin'] == 1) 69if($_SESSION['admin'] == 1)
70{ 70{
71 if(isset($_GET['action']) && $_GET['action'] == 'edition' && !isset($_GET['album'])) 71 if(isset($_GET['action']) && $_GET['action'] == 'edition' && $albumCode == '')
72 { 72 {
73?> 73?>
74 <h3>Ajouter un album</h3> 74 <h3>Ajouter un album</h3>
@@ -88,31 +88,36 @@ if($_SESSION['admin'] == 1)
88} 88}
89 89
90// tableau des albums 90// tableau des albums
91//$i = count($albumsJSON); 91for($i = count($albumsJSON) - 1; $i >= 0; $i--)
92$i = 0; 92//for($i = 0; $i < count($albumsJSON); $i++)
93//for($i = count($albumsJSON) - 1; $i >= 0; $i--)
94foreach($albumsJSON as $oneAlbum)
95{ 93{
96 //$i--; 94 // formulaires et éditeur
97 // modification 95 // comparer le GET avec $albumsJSON[3]
98 if(false) 96 if(isset($_GET['action']) && $_GET['action'] == 'edition'
99 {} 97 && $albumsJSON[$i][3] == $_GET['album_code'])
98 {
99 ?>
100 <h3>Modifier un album</h3>
101<?= $editeurHTML ?>
102<?php
103 }
104 // affichage normal
100 else 105 else
101 { 106 {
102 // mettre une adresse lorsqu'un fichier html existe
103?> 107?>
104 <article id="<?= $oneAlbum[0] ?>" > 108 <article id="<?= $albumsJSON[$i][0] ?>" >
105<?php 109<?php
110 // mettre une adresse lorsqu'un fichier html existe
106 if($avecLien[$i]) 111 if($avecLien[$i])
107 { 112 {
108?> 113?>
109 <a href="index.php?page=<?= $lienAlbum[$i] ?>" > 114 <a href="index.php?<?= $lienAlbum[$i] ?>" >
110<?php 115<?php
111 } 116 }
112?> 117?>
113 <figure> 118 <figure>
114 <img class="vignette" src="data/discographie/images/<?= $oneAlbum[2] ?>" alt="" > 119 <img class="vignette" src="data/discographie/images/<?= $albumsJSON[$i][2] ?>" alt="" >
115 <figcaption><?= $oneAlbum[0] ?><br><?= $oneAlbum[1] ?></figcaption> 120 <figcaption><?= $albumsJSON[$i][0] ?><br><?= $albumsJSON[$i][1] ?></figcaption>
116 </figure> 121 </figure>
117<?php 122<?php
118 if($avecLien[$i]) 123 if($avecLien[$i])
@@ -126,11 +131,11 @@ foreach($albumsJSON as $oneAlbum)
126 { 131 {
127 ?> 132 ?>
128 <p> 133 <p>
129 <a href="index.php?page=<?= $lienBoutonModif[$i] ?>" > 134 <a href="index.php?<?= $lienBoutonModif[$i] ?>" >
130 Modifier cet article 135 Modifier cet article
131 </a> 136 </a>
132 &nbsp;<!-- un espace --> 137 &nbsp;<!-- un espace -->
133 <a href="index.php?page=discographie&action=suppression&album=<?= $i ?>" onclick="confirmerSuppression()" > 138 <a href="index.php?page=discographie&action=suppression&album_code=<?= $albumsJSON[$i][3] ?>" onclick="confirmerSuppression()" >
134 Supprimer cet article 139 Supprimer cet article
135 </a> 140 </a>
136 </p> 141 </p>
@@ -144,7 +149,6 @@ foreach($albumsJSON as $oneAlbum)
144 if($_SESSION['admin'] == 1) 149 if($_SESSION['admin'] == 1)
145 {} 150 {}
146 } 151 }
147 $i++;
148} 152}
149?> 153?>
150 </section> 154 </section>
diff --git a/view/template-formulaires.php b/view/template-formulaires.php
index 391f729..e864719 100644
--- a/view/template-formulaires.php
+++ b/view/template-formulaires.php
@@ -18,14 +18,16 @@
18 18
19 19
20// variable $inputsAlbum (page discographie uniquement) 20// variable $inputsAlbum (page discographie uniquement)
21// note: on ne peut préremplir le champ input texte
22// solution: on affiche le nom du fichier, si l'utilisateur en télécharge un autre, on le remplace
21ob_start(); 23ob_start();
22?> 24?>
23 <p><i>Infos qui seront affichées sur cette page:</i></p> 25 <p><i>Infos qui seront affichées sur cette page:</i></p>
24 <label for="titre" >Titre</label> 26 <label for="titre" >Titre</label>
25 <input type="text" name="titre" required ><br /> 27 <input type="text" name="titre" value="<?= $vignette[0] ?>" required ><br />
26 <label for="annee" >Année</label> 28 <label for="annee" >Année</label>
27 <input type="text" name="annee" required ><br /> 29 <input type="text" name="annee" value="<?= $vignette[1] ?>" required ><br />
28 <label for="pochette" >Pochette du disque (jpg ou png)</label> 30 <label for="pochette" >Pochette du disque (jpg ou png) : <?= $vignette[2] ?></label><br/>
29 <input type="file" name="upload" > 31 <input type="file" name="upload" >
30 <br /><br /> 32 <br /><br />
31<?php 33<?php
@@ -37,7 +39,7 @@ ob_start();
37?> 39?>
38 40
39 <div class="conteneur_article" > 41 <div class="conteneur_article" >
40 <form action="index.php?page=<?= $page_actuelle ?>&article=<?= $numArticle ?>&action=submit" method="post" enctype="multipart/form-data" > 42 <form action="index.php?page=<?= $page_actuelle ?>&article=<?= $album_code ?>&action=submit" method="post" enctype="multipart/form-data" >
41<?php 43<?php
42if($page_actuelle == 'discographie') 44if($page_actuelle == 'discographie')
43{ 45{