summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-11-26 04:29:10 +0100
committerpolo <ordipolo@gmx.fr>2021-11-26 04:29:10 +0100
commitb97a68343ec5c4ff1fae25ff5dc41f1a2ce6a17f (patch)
tree528ec98f86a61b492d7ebce61486647f633b1f42
parentcdf1bda847edd3e22e9fe817a802219ad8e0f626 (diff)
downloadmelaine-b97a68343ec5c4ff1fae25ff5dc41f1a2ce6a17f.zip
disco modif/suppr désordre
-rw-r--r--controller/Security.php23
-rw-r--r--controller/admin.php26
-rw-r--r--controller/ckeditor.php32
-rw-r--r--controller/visitor.php16
-rw-r--r--index.php26
-rw-r--r--model/Album.php75
-rw-r--r--model/Classes.php201
-rw-r--r--model/Image.php9
-rw-r--r--model/Page.php97
-rw-r--r--public/discographie.css5
-rw-r--r--view/discographie.php103
11 files changed, 312 insertions, 301 deletions
diff --git a/controller/Security.php b/controller/Security.php
new file mode 100644
index 0000000..98d2e74
--- /dev/null
+++ b/controller/Security.php
@@ -0,0 +1,23 @@
1<?php
2// controller/Security.php
3
4// sécurité faille XSS avec htmLawed
5require('lib/htmlawed/htmLawed.php');
6
7class Security // toute statique, inutile de l'instancier
8{
9 private static $configHtmLawed = array(
10 'safe'=>1, // protection contre les élements et attributs dangereux
11 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées
12 'deny_attribute'=>'id', // gêner le JS hostile
13 // on garde 'class' et 'style' utilisés par le ckediteur
14 );
15 private static $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
16
17 public static function secureString($chaine)
18 {
19 $chaine = htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed);
20 $chaine = trim($chaine); // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur)
21 return $chaine;
22 }
23}
diff --git a/controller/admin.php b/controller/admin.php
index ba6fd83..90924e0 100644
--- a/controller/admin.php
+++ b/controller/admin.php
@@ -9,9 +9,8 @@ function melaineEdit($numArticle, $suppression)
9 $page_actuelle = "melaine"; 9 $page_actuelle = "melaine";
10 10
11 // modèle 11 // modèle
12 $Article = new OneArticle($page_actuelle); 12 $Article = new Page($page_actuelle, 'html');
13 $Article->makeFileList(); 13
14
15 // nouvel article 14 // nouvel article
16 if($numArticle == 0) 15 if($numArticle == 0)
17 { 16 {
@@ -22,7 +21,7 @@ function melaineEdit($numArticle, $suppression)
22 { 21 {
23 // nom de l'article ciblé (objet et session) 22 // nom de l'article ciblé (objet et session)
24 $Article->findFileName($numArticle); 23 $Article->findFileName($numArticle);
25 $_SESSION['nomFichier'] = $Article->getFileName(); 24 $_SESSION['nomFichier'] = $Article->fileName;
26 25
27 // suppression 26 // suppression
28 if($suppression) 27 if($suppression)
@@ -62,13 +61,13 @@ function melaineEdit($numArticle, $suppression)
62 require('view/template.php'); 61 require('view/template.php');
63} 62}
64 63
65function discoEdit($numArticle, $suppression) 64function discoEdit($numArticle, $albumCode, $suppression)
66{ 65{
67 $page_actuelle = "discographie"; 66 $page_actuelle = "discographie";
68 $title = "Discographie"; 67 $title = "Discographie";
69 68
70 // modèle 69 // modèle
71 $Album = new OneArticle($page_actuelle); 70 $Album = new Album($page_actuelle);
72 $Album->makeFileList(); 71 $Album->makeFileList();
73 72
74 // nouvel album 73 // nouvel album
@@ -81,7 +80,7 @@ function discoEdit($numArticle, $suppression)
81 { 80 {
82 // nom de l'article ciblé (objet et session) 81 // nom de l'article ciblé (objet et session)
83 $Album->findFileName($numArticle); 82 $Album->findFileName($numArticle);
84 $_SESSION['nomFichier'] = $Album->getFileName(); 83 $_SESSION['nomFichier'] = $Album->fileName;
85 84
86 // suppression 85 // suppression
87 if($suppression) 86 if($suppression)
@@ -94,7 +93,8 @@ function discoEdit($numArticle, $suppression)
94 else 93 else
95 { 94 {
96 $title = "Modifier un album"; 95 $title = "Modifier un album";
97 $texte = $Album->readOne(); // entrée de l'éditeur 96 $texte = $Album->readOneAlbum($albumCode);
97 $vignette = json_decode($Album->getVignette(), true);
98 } 98 }
99 } 99 }
100 100
@@ -106,11 +106,10 @@ function discoEdit($numArticle, $suppression)
106 $texte = preparationCKeditor($numArticle, $texte); 106 $texte = preparationCKeditor($numArticle, $texte);
107 } 107 }
108 108
109
110 // contenu de tous les fichiers JSON (= tableau de chaines) 109 // contenu de tous les fichiers JSON (= tableau de chaines)
111 $albumsJSON = $Album->readAll(); 110 $albumsJSON = $Album->readAll();
112 // noms des fichiers JSON 111 // noms des fichiers JSON
113 $albumNamesJSON = $Album->getFileList(); 112 $albumNamesJSON = $Album->fileList;
114 113
115 // changer les chaines JSON en tableaux: titre, année, pochette 114 // changer les chaines JSON en tableaux: titre, année, pochette
116 $i = 0; 115 $i = 0;
@@ -124,13 +123,15 @@ function discoEdit($numArticle, $suppression)
124 $annees[$i] = $albumsJSON[$i][1]; 123 $annees[$i] = $albumsJSON[$i][1];
125 $i++; 124 $i++;
126 } 125 }
126 print_r($albumsJSON);
127 //exit();
127 // tri d'un tableau multidimensionnel 128 // tri d'un tableau multidimensionnel
128 array_multisort($annees, $albumsJSON); 129 array_multisort($annees, $albumsJSON);
129 130
130 // on passe maintenant au contenu HTML 131 // on passe maintenant au contenu HTML
131 $Album->setFormat('html'); 132 $Album->format = 'html';
132 $Album->makeFileList(); 133 $Album->makeFileList();
133 $albumNamesHTML = $Album->getFileList(); 134 $albumNamesHTML = $Album->fileList;
134 135
135 // lien vers le HTML ou ancre? 136 // lien vers le HTML ou ancre?
136 // pour chaque album, détecter le fichier html 137 // pour chaque album, détecter le fichier html
@@ -149,6 +150,7 @@ function discoEdit($numArticle, $suppression)
149 if(file_exists('data/discographie/html/' . $nomJSONsansExt . '.html')) 150 if(file_exists('data/discographie/html/' . $nomJSONsansExt . '.html'))
150 { 151 {
151 $lienAlbum[$i] = 'album&album_code=' . $nomJSONsansExt . '&album_name=' . $albumsJSON[$i][0]; 152 $lienAlbum[$i] = 'album&album_code=' . $nomJSONsansExt . '&album_name=' . $albumsJSON[$i][0];
153 $lienBoutonModif[$i] = 'discographie&action=edition&album_code=' . $nomJSONsansExt;
152 $avecLien[$i] = true; 154 $avecLien[$i] = true;
153 } 155 }
154 else 156 else
diff --git a/controller/ckeditor.php b/controller/ckeditor.php
index d07f2a2..2b9f168 100644
--- a/controller/ckeditor.php
+++ b/controller/ckeditor.php
@@ -52,28 +52,15 @@ function submitCKeditor($nomFichier)
52 exit(); 52 exit();
53 } 53 }
54 54
55 // sécurité faille XSS avec htmLawed
56 $configHtmLawed = array(
57 'safe'=>1, // protection contre les élements et attributs dangereux
58 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées
59 'deny_attribute'=>'id', // gêner le JS hostile
60 // on garde 'class' et 'style' utilisés par le ckediteur
61 );
62 $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
63
64 // de l'éditeur 55 // de l'éditeur
65 if(isset($_POST['contenu'])) // optionnel pour discographie 56 if(isset($_POST['contenu'])) // optionnel pour discographie
66 { 57 {
67 $contenu = $_POST['contenu']; 58 $contenu = Security::secureString($_POST['contenu']);
68 59
69 // récupérer les liens multimedia 60 // récupérer les liens multimedia
70 //require("media.php"); 61 //require("media.php");
71 //$contenu = mediaSubmit($contenu); 62 //$contenu = mediaSubmit($contenu);
72 63
73 $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
74 // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur)
75 $contenu = trim($contenu);
76
77 // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! 64 // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !!
78 if($page != 'discographie' && $contenu == '') 65 if($page != 'discographie' && $contenu == '')
79 { 66 {
@@ -82,18 +69,11 @@ function submitCKeditor($nomFichier)
82 } 69 }
83 } 70 }
84 71
85
86 if($page == 'discographie') 72 if($page == 'discographie')
87 { 73 {
88 $titre = $_POST['titre']; 74 $titre = Security::secureString($_POST['titre']);
89 $annee = $_POST['annee']; 75 $annee = Security::secureString($_POST['annee']);
90 $pochette = $_FILES['upload']['name']; 76 $pochette = $_FILES['upload']['name'];
91
92 // des formulaires simples
93 $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed);
94 $titre = trim($titre);
95 $annee = htmLawed($annee, $configHtmLawed, $specHtmLawed);
96 $annee = trim($annee);
97 77
98 // on instancie avec l'enfant de OneArticle 78 // on instancie avec l'enfant de OneArticle
99 $Album = new Album($page); 79 $Album = new Album($page);
@@ -103,7 +83,7 @@ function submitCKeditor($nomFichier)
103 { 83 {
104 // page disco 84 // page disco
105 $Album->createVignette($titre, $annee, $pochette); 85 $Album->createVignette($titre, $annee, $pochette);
106 86
107 // page de l'album 87 // page de l'album
108 if(!empty($_POST['contenu'])) 88 if(!empty($_POST['contenu']))
109 { 89 {
@@ -125,7 +105,7 @@ function submitCKeditor($nomFichier)
125 // autres pages 105 // autres pages
126 else 106 else
127 { 107 {
128 $Article = new OneArticle($page); 108 $Article = new Page($page, 'html');
129 109
130 if($_GET['article'] == 0) 110 if($_GET['article'] == 0)
131 { 111 {
@@ -133,7 +113,7 @@ function submitCKeditor($nomFichier)
133 } 113 }
134 else 114 else
135 { 115 {
136 $Article->setFileName($nomFichier); 116 $Article->fileName = $nomFichier;
137 $Article->update($contenu); 117 $Article->update($contenu);
138 } 118 }
139 } 119 }
diff --git a/controller/visitor.php b/controller/visitor.php
index a5bf538..0e79ee2 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -33,8 +33,9 @@ function melaineVisitor()
33 $title = "Mais qui est Melaine Favennec?"; 33 $title = "Mais qui est Melaine Favennec?";
34 34
35 // modèle 35 // modèle
36 $Articles = new AllArticles($page_actuelle); 36 $Articles = new Page($page_actuelle, 'html');
37 $Articles->makeFileList(); 37
38 // récupération de toute la page dans $articles
38 $articles = array_reverse($Articles->readAll()); // lourd 39 $articles = array_reverse($Articles->readAll()); // lourd
39 40
40 // variables $css, $js, $header et $content 41 // variables $css, $js, $header et $content
@@ -53,9 +54,9 @@ function discoVisitor()
53 $AllAlbums->makeFileList(); 54 $AllAlbums->makeFileList();
54 55
55 // contenu de tous les fichiers JSON (= tableau de chaines) 56 // contenu de tous les fichiers JSON (= tableau de chaines)
56 $albumsJSON = $AllAlbums->readAll(); 57 $albumsJSON = array_reverse($AllAlbums->readAll());
57 // noms des fichiers JSON 58 // noms des fichiers JSON
58 $albumNamesJSON = $AllAlbums->getFileList(); 59 $albumNamesJSON = $AllAlbums->fileList;
59 60
60 // changer les chaines JSON en tableaux: titre, année, pochette 61 // changer les chaines JSON en tableaux: titre, année, pochette
61 $i = 0; 62 $i = 0;
@@ -74,9 +75,9 @@ function discoVisitor()
74 array_multisort($annees, $albumsJSON); 75 array_multisort($annees, $albumsJSON);
75 76
76 // on passe maintenant au contenu HTML 77 // on passe maintenant au contenu HTML
77 $AllAlbums->setFormat('html'); 78 $AllAlbums->format = 'html';
78 $AllAlbums->makeFileList(); 79 $AllAlbums->makeFileList();
79 $albumNamesHTML = $AllAlbums->getFileList(); 80 $albumNamesHTML = $AllAlbums->fileList;
80 81
81 // lien vers le HTML ou ancre? 82 // lien vers le HTML ou ancre?
82 // pour chaque album, détecter le fichier html 83 // pour chaque album, détecter le fichier html
@@ -121,8 +122,7 @@ function album($albumCode, $albumName)
121 $page_actuelle = 'discographie'; 122 $page_actuelle = 'discographie';
122 $title = $albumName; 123 $title = $albumName;
123 124
124 //$Album = new OneArticle ($page_actuelle); 125 $album = Album::readOneAlbum($albumCode); // simple, efficace
125 $album = OneArticle::readOneAlbum($albumCode);
126 126
127 // variables $css, $header et $content 127 // variables $css, $header et $content
128 require('view/album.php'); 128 require('view/album.php');
diff --git a/index.php b/index.php
index 7ffcad7..a534ddf 100644
--- a/index.php
+++ b/index.php
@@ -72,6 +72,7 @@ if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_
72 exit; // arrêt ici !! 72 exit; // arrêt ici !!
73} 73}
74 74
75
75// traitement des POST du ckeditor 76// traitement des POST du ckeditor
76// la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET 77// la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET
77if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 78if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
@@ -81,8 +82,12 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
81 || (isset($_POST['titre']) && isset($_POST['annee'])))) 82 || (isset($_POST['titre']) && isset($_POST['annee']))))
82{ 83{
83 require('controller/ckeditor.php'); // traitement du POST 84 require('controller/ckeditor.php'); // traitement du POST
84 require('lib/htmlawed/htmLawed.php'); // failles XSS 85 require('controller/Security.php'); // sécurité des chaines
85 require('model/Classes.php'); // modèle 86 require('model/Page.php'); // modèle
87 if($_GET['page'] == 'discographie')
88 {
89 require('model/Album.php');
90 }
86 91
87 // modification 92 // modification
88 if(isset($_SESSION['nomFichier'])) 93 if(isset($_SESSION['nomFichier']))
@@ -100,6 +105,7 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
100 unset($_GET['action']); 105 unset($_GET['action']);
101 unset($_POST['contenu']); 106 unset($_POST['contenu']);
102 header('Location: index.php?page=' . $_GET['page']); 107 header('Location: index.php?page=' . $_GET['page']);
108 exit();
103} 109}
104 110
105// déconnexion: nettoyer et recharger la page 111// déconnexion: nettoyer et recharger la page
@@ -119,7 +125,11 @@ require('controller/visitor.php');
119// utile pour presque toutes les pages 125// utile pour presque toutes les pages
120if(isset($_GET['page']) && $_GET['page'] != 'menu') 126if(isset($_GET['page']) && $_GET['page'] != 'menu')
121{ 127{
122 require('model/Classes.php'); 128 require('model/Page.php');
129 if($_GET['page'] == 'discographie' || $_GET['page'] == 'album')
130 {
131 require('model/Album.php');
132 }
123} 133}
124 134
125// contrôleur des pages en mode admin 135// contrôleur des pages en mode admin
@@ -194,7 +204,11 @@ if(isset($_GET['page']))
194 // modification 204 // modification
195 if(isset($_GET['album']) && is_numeric($_GET['album']) && $_GET['album'] > 0) 205 if(isset($_GET['album']) && is_numeric($_GET['album']) && $_GET['album'] > 0)
196 { 206 {
197 discoEdit($_GET['album'], 0); 207 if(!isset($_GET['album_code']))
208 {
209 $_GET['album_code'] = '';
210 }
211 discoEdit($_GET['album'], $_GET['album_code'], 0);
198 } 212 }
199 // nouvel article 213 // nouvel article
200 else 214 else
@@ -204,13 +218,13 @@ if(isset($_GET['page']))
204 { 218 {
205 unset($_SESSION['nomFichier']); 219 unset($_SESSION['nomFichier']);
206 } 220 }
207 discoEdit(0, 0); 221 discoEdit(0, '', 0);
208 } 222 }
209 } 223 }
210 // suppression 224 // suppression
211 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') 225 else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression')
212 { 226 {
213 discoEdit($_GET['album'], 1); 227 discoEdit($_GET['album'], '', 1);
214 } 228 }
215 else 229 else
216 { 230 {
diff --git a/model/Album.php b/model/Album.php
new file mode 100644
index 0000000..2254c10
--- /dev/null
+++ b/model/Album.php
@@ -0,0 +1,75 @@
1<?php
2// model/Album.php
3
4class Album extends Page // classe "objet"
5{
6 public function __construct($page)
7 {
8 $this->page = $page;
9 $this->format = 'json'; // vaut 'html' dans la classe mère
10 $this->time = time();
11 }
12
13 // GET
14
15 // SET
16
17 // fonctions CRUD
18
19 // create
20 public function createVignette($titre, $annee, $pochette)
21 {
22 $this->format = 'json';
23
24 if($pochette != '')
25 {
26 // télécharger la pochette
27 require('model/Image.php');
28 $Image = new Image(false);
29 $Image->upload();
30
31 /*$erreur = $Image->getError();
32 if(!empty($erreur))
33 {}*/
34 }
35
36 $albumJSON = json_encode([$titre, $annee, $pochette]);
37
38 $nom_fichier = 'data/' . $this->page . '/' . $this->format . '/' . $this->time . '.' . $this->format;
39
40 $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser
41 fputs($fichier, $albumJSON);
42 fclose($fichier);
43 chmod($nom_fichier, 0666);
44 }
45
46 // read
47 public function getVignette()
48 {
49 return(file_get_contents($this->fileName));
50 }
51
52 // page de l'album
53 public static function readOneAlbum($albumCode)
54 {
55 return(file_get_contents('data/discographie/html/' . $albumCode . '.html'));
56 }
57
58 // pour afficher des dates
59 /*public function getDate($fileNumber)
60 {
61 // le 2è paramètre exclut le suffixe .html
62 $timestamp = basename($this->files[$fileNumber], '.html');
63 return getdate($timestamp);
64 }*/
65
66 // update
67 public function updateVignette()
68 {}
69
70 // delete
71 public function delete()
72 {
73 unlink($this->fileName);
74 }
75}
diff --git a/model/Classes.php b/model/Classes.php
deleted file mode 100644
index 97a137a..0000000
--- a/model/Classes.php
+++ /dev/null
@@ -1,201 +0,0 @@
1<?php
2// model/Classes.php
3
4class AllArticles
5{
6 protected $page; // page et donc dossier concerné
7 protected $format = 'html'; // vaut 'html' ou 'json'
8 protected $files; // noms des fichiers dans ce dossier
9 protected $time; // timestamp pour création de fichiers
10 private $articles; // contenu
11 private $nbArticles; // un fichier = un article
12
13 // en paramètre à l'instanciation
14 public function __construct($page)
15 {
16 $this->page = $page;
17 $this->time = time();
18 if($this->page == 'discographie')
19 {
20 $this->format = 'json';
21 }
22 }
23
24 // GET
25 public function getPage()
26 {
27 return($this->page);
28 }
29
30 public function getNbArticles()
31 {
32 return($this->nbArticles);
33 }
34 public function getFileList()
35 {
36 return($this->files);
37 }
38
39 // SET
40 public function setFormat($format)
41 {
42 $this->format = $format;
43 }
44
45 // tableaux des noms des fichiers
46 public function makeFileList()
47 {
48 $this->files = glob('data/' . $this->page . '/' . $this->format . '/*.' . $this->format);
49 //$this->files = glob('*.' . $this->format);
50 }
51 /*public function makeFilePath()
52 {}*/
53
54 // fonctions CRUD (create - read - update - delete)
55
56 // create
57
58 // read
59 public function readAll()
60 {
61 $i = 0;
62 $articles = array();
63 foreach ($this->files as $oneFile)
64 {
65 $articles[$i] = file_get_contents($oneFile);
66 $i++;
67 }
68 //print_r($articles);
69 return $articles;
70 }
71
72 // update
73
74 // delete
75}
76
77// article créé ou ciblé pour modification/suppression
78class OneArticle extends AllArticles
79{
80 private $fileName; // correspond à $_SESSION['nomFichier']
81
82 // GET
83 public function getFileName()
84 {
85 return($this->fileName);
86 }
87
88 // SET
89 public function setFileName($nomFichier) // modification
90 {
91 $this->fileName = $nomFichier;
92 }
93
94 public function findFileName($numArticle) // nouvel article
95 {
96 $this->fileName = $this->files[$numArticle - 1];
97 }
98
99 // fonctions CRUD (create - read - update - delete)
100
101 // create
102 public function create($content)
103 {
104 $format = 'html';
105
106 // nommer les fichiers avec le timestamp pour:
107 // - les trier par ordre chronologique
108 // - rendre quasi impossible d'avoir deux fois le même nom (à la condition de gérer la "concurrence")
109 $nom_fichier = 'data/' . $this->page . '/' . $format . '/' . $this->time . '.' . $format;
110
111 $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser
112 fputs($fichier, $content);
113 fclose($fichier);
114 chmod($nom_fichier, 0666);
115 }
116
117 // read
118 public function readOne()
119 {
120 return(file_get_contents($this->fileName));
121 }
122 public static function readOneAlbum($albumCode)
123 {
124 return(file_get_contents('data/discographie/html/' . $albumCode . '.html'));
125 }
126
127 // pour afficher des dates
128 /*public function getDate($fileNumber)
129 {
130 // le 2è paramètre exclut le suffixe .html
131 $timestamp = basename($this->files[$fileNumber], '.html');
132 return getdate($timestamp);
133 }*/
134
135 // update
136 public function update($content)
137 {
138 $file = fopen($this->fileName, 'w'); // crée ou écrase
139 fputs($file, $content);
140 fclose($file);
141 //chown($this->fileName, 'http');
142 chmod($this->fileName, 0666);
143 }
144
145 // delete
146 public function delete()
147 {
148 unlink($this->fileName);
149 }
150}
151
152
153class Album extends OneArticle
154{
155 // variables
156 //private $fileNameJSON; // même nom en .json
157
158 // GET
159
160 // SET
161
162 // fonctions CRUD
163 // create
164 public function createVignette($titre, $annee, $pochette)
165 {
166 $this->format = 'json';
167
168 if($pochette != '')
169 {
170 // télécharger la pochette
171 require('model/Image.php');
172 $Image = new Image(false);
173 $Image->upload();
174
175 /*$erreur = $Image->getError();
176 if(!empty($erreur))
177 {}*/
178 }
179
180 $albumJSON = json_encode([$titre, $annee, $pochette]);
181
182 $nom_fichier = 'data/' . $this->page . '/' . $this->format . '/' . $this->time . '.' . $this->format;
183
184 $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser
185 fputs($fichier, $albumJSON);
186 fclose($fichier);
187 chmod($nom_fichier, 0666);
188 }
189
190 // read
191 public function read()
192 {}
193
194 // update
195 public function updateVignette($titre, $annee, $pochette)
196 {}
197
198 // delete
199 public function delete()
200 {}
201} \ No newline at end of file
diff --git a/model/Image.php b/model/Image.php
index 0070b70..efd75cc 100644
--- a/model/Image.php
+++ b/model/Image.php
@@ -6,7 +6,7 @@ class Image
6 private const MAX_WEIGHT = 2000000; // taille max des images (par défaut 2Mo dans php.ini) 6 private const MAX_WEIGHT = 2000000; // taille max des images (par défaut 2Mo dans php.ini)
7 private $page; 7 private $page;
8 private $ajax = false; 8 private $ajax = false;
9 private $erreur = ''; 9 public $erreur = '';
10 10
11 public function __construct($ajax) 11 public function __construct($ajax)
12 { 12 {
@@ -16,14 +16,11 @@ class Image
16 } 16 }
17 17
18 // GET 18 // GET
19 public function getError() 19
20 { 20 // SET
21 return($this->erreur);
22 }
23 21
24 public function upload() 22 public function upload()
25 { 23 {
26
27 // traitement et enregistrement de l'image 24 // traitement et enregistrement de l'image
28 if (isset($_FILES['upload']) AND $_FILES['upload']['error'] == 0) // 0 signifie ok 25 if (isset($_FILES['upload']) AND $_FILES['upload']['error'] == 0) // 0 signifie ok
29 { 26 {
diff --git a/model/Page.php b/model/Page.php
new file mode 100644
index 0000000..e03efe1
--- /dev/null
+++ b/model/Page.php
@@ -0,0 +1,97 @@
1<?php
2// model/Page.php
3
4class Page // classe "objet"
5{
6 public $page; // page et donc dossier concerné
7 public $format = 'html'; // vaut 'html' ou 'json'
8 public $fileList; // noms des fichiers dans ce dossier
9 protected $articles; // contenu de toute la page
10 protected $nbArticles; // un fichier = un article
11
12 // gestion d'un article spécifique
13 public $fileName = ''; // correspond à $_SESSION['nomFichier']
14 protected $time; // timestamp pour noms des fichiers créés
15
16 public function __construct($page, $format)
17 {
18 $this->page = $page;
19 $this->format = $format;
20 $this->time = time();
21 $this->makeFileList();
22 }
23
24 // tableaux des noms des fichiers
25 public function makeFileList()
26 {
27 $this->fileList = glob('data/' . $this->page . '/' . $this->format . '/*.' . $this->format);
28 //$this->files = glob('*.' . $this->format);
29 }
30 /*public function makeFilePath()
31 {}*/
32
33 // nom d'un fichier
34 public function findFileName($numArticle)
35 {
36 if($numArticle > 0)
37 {
38 $this->fileName = $this->fileList[$numArticle - 1];
39 }
40 }
41
42 // GET
43
44 // SET
45
46 // fonctions CRUD (create - read - update - delete)
47
48 // create
49 public function create($content)
50 {
51 $format = 'html';
52
53 // nommer les fichiers avec le timestamp pour:
54 // - les trier par ordre chronologique
55 // - rendre quasi impossible d'avoir deux fois le même nom (à la condition de gérer la "concurrence")
56 $nom_fichier = 'data/' . $this->page . '/' . $format . '/' . $this->time . '.' . $format;
57
58 $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser
59 fputs($fichier, $content);
60 fclose($fichier);
61 chmod($nom_fichier, 0666);
62 }
63
64 // read
65 public function readAll()
66 {
67 $i = 0;
68 $articles = array();
69 foreach ($this->fileList as $oneFile)
70 {
71 $articles[$i] = file_get_contents($oneFile);
72 $i++;
73 }
74 //print_r($articles);
75 return $articles;
76 }
77 public function readOne()
78 {
79 return(file_get_contents($this->fileName));
80 }
81
82 // update
83 public function update($content)
84 {
85 $file = fopen($this->fileName, 'w'); // crée ou écrase
86 fputs($file, $content);
87 fclose($file);
88 //chown($this->fileName, 'http');
89 chmod($this->fileName, 0666);
90 }
91
92 // delete
93 public function delete()
94 {
95 unlink($this->fileName);
96 }
97} \ No newline at end of file
diff --git a/public/discographie.css b/public/discographie.css
index 8b050db..f2e9a5b 100644
--- a/public/discographie.css
+++ b/public/discographie.css
@@ -83,6 +83,10 @@ section
83{ 83{
84 /*border: 1px red solid;*/ 84 /*border: 1px red solid;*/
85} 85}
86.flexArticles
87{
88 /*display: flex;*/
89}
86 90
87h3 91h3
88{ 92{
@@ -115,6 +119,7 @@ article
115{ 119{
116 margin: 5px 0px; 120 margin: 5px 0px;
117 width: 45%; 121 width: 45%;
122 /*min-width: 300px;*/
118} 123}
119 124
120.vignette 125.vignette
diff --git a/view/discographie.php b/view/discographie.php
index 19e982b..25b82e1 100644
--- a/view/discographie.php
+++ b/view/discographie.php
@@ -43,80 +43,99 @@ $header = ob_get_clean();
43// variable $content 43// variable $content
44ob_start(); 44ob_start();
45?> 45?>
46 <aside> 46 <aside>
47 <div> 47 <div>
48 <p id="bouton_chronologie" >Chronologie</p> 48 <p id="bouton_chronologie" >Chronologie</p>
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; 52//$i = 0;
53foreach($albumsJSON as $oneAlbum) 53for($i = count($albumsJSON) - 1; $i >= 0; $i--)
54//foreach($albumsJSON as $oneAlbum)
54{ 55{
55 // mettre une adresse lorsqu'un fichier html existe 56 // mettre une adresse lorsqu'un fichier html existe
56 // si il n'existe pas, mettre une ancre vers l'endroit sur la page 57 // si il n'existe pas, mettre une ancre vers l'endroit sur la page
57?> 58?>
58 <p><a class="<?= $linkDiscoChrono[$i] ?>" href="index.php?page=<?= $lienAlbum[$i] ?>" ><?= $oneAlbum[1] ?> <?= $oneAlbum[0] ?></a></p> 59 <p><a class="<?= $linkDiscoChrono[$i] ?>" href="index.php?page=<?= $lienAlbum[$i] ?>" ><?= $albumsJSON[$i][1] ?> <?= $albumsJSON[$i][0] ?></a></p>
59<?php 60<?php
60 $i++; 61 //$i++;
61} 62}
62?> 63?>
63 </div> 64 </div>
64 </div> 65 </div>
65 </aside> 66 </aside>
66 <section> 67 <section>
67<?php 68<?php
68if($_SESSION['admin'] == 1) 69if($_SESSION['admin'] == 1)
69{ 70{
70 if(isset($_GET['action']) && $_GET['action'] == 'edition' && !isset($_GET['album'])) 71 if(isset($_GET['action']) && $_GET['action'] == 'edition' && !isset($_GET['album']))
71 { 72 {
72?> 73?>
73 <h3>Ajouter un album</h3> 74 <h3>Ajouter un album</h3>
74<?= $editeurHTML ?> 75<?= $editeurHTML ?>
75<?php 76<?php
76 } 77 }
77 else 78 else
78 { 79 {
79?> 80?>
80 <p class="boutonAlbum" > 81 <p class="boutonAlbum" >
81 <a href="index.php?page=discographie&action=edition" > 82 <a href="index.php?page=discographie&action=edition" >
82 Nouvel album 83 Nouvel album
83 </a> 84 </a>
84 </p> 85 </p>
85<?php 86<?php
86 } 87 }
87} 88}
88 89
89// tableau des albums 90// tableau des albums
91//$i = count($albumsJSON);
90$i = 0; 92$i = 0;
93//for($i = count($albumsJSON) - 1; $i >= 0; $i--)
91foreach($albumsJSON as $oneAlbum) 94foreach($albumsJSON as $oneAlbum)
92{ 95{
93 // modification 96 //$i--;
94 if(false) 97 // modification
95 {} 98 if(false)
96 else 99 {}
97 { 100 else
98 // mettre une adresse lorsqu'un fichier html existe 101 {
102 // mettre une adresse lorsqu'un fichier html existe
99?> 103?>
100 <article id="<?= $oneAlbum[0] ?>" > 104 <article id="<?= $oneAlbum[0] ?>" >
101<?php 105<?php
102 if($avecLien[$i]) 106 if($avecLien[$i])
103 { 107 {
104?> 108?>
105 <a href="index.php?page=<?= $lienAlbum[$i] ?>" > 109 <a href="index.php?page=<?= $lienAlbum[$i] ?>" >
106<?php 110<?php
107 } 111 }
108?> 112?>
109 <figure> 113 <figure>
110 <img class="vignette" src="data/discographie/images/<?= $oneAlbum[2] ?>" alt="" > 114 <img class="vignette" src="data/discographie/images/<?= $oneAlbum[2] ?>" alt="" >
111 <figcaption><?= $oneAlbum[0] ?><br><?= $oneAlbum[1] ?></figcaption> 115 <figcaption><?= $oneAlbum[0] ?><br><?= $oneAlbum[1] ?></figcaption>
112 </figure> 116 </figure>
113<?php 117<?php
114 if($avecLien[$i]) 118 if($avecLien[$i])
115 { 119 {
116?> 120?>
117 </a> 121 </a>
118<?php 122<?php
119 } 123 }
124 // bouton
125 if($_SESSION['admin'] == 1)
126 {
127 ?>
128 <p>
129 <a href="index.php?page=<?= $lienBoutonModif[$i] ?>" >
130 Modifier cet article
131 </a>
132 &nbsp;<!-- un espace -->
133 <a href="index.php?page=discographie&action=suppression&album=<?= $i ?>" onclick="confirmerSuppression()" >
134 Supprimer cet article
135 </a>
136 </p>
137 <?php
138 }
120?> 139?>
121 </article> 140 </article>
122<?php 141<?php
@@ -124,10 +143,10 @@ foreach($albumsJSON as $oneAlbum)
124 // bouton pour modifier 143 // bouton pour modifier
125 if($_SESSION['admin'] == 1) 144 if($_SESSION['admin'] == 1)
126 {} 145 {}
127 } 146 }
128 $i++; 147 $i++;
129} 148}
130?> 149?>
131 </section> 150 </section>
132<?php 151<?php
133$content = ob_get_clean(); 152$content = ob_get_clean();