diff options
author | polo <ordipolo@gmx.fr> | 2021-09-01 23:35:42 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2021-09-01 23:35:42 +0200 |
commit | 10954c386cacb270e4ae16837483120ca3406259 (patch) | |
tree | e3107a29984b0e91db899fc08d4a7e066eaf2710 | |
parent | 452420d0cd05822a9974fe27f0edc4cc4dc300cc (diff) | |
download | melaine-10954c386cacb270e4ae16837483120ca3406259.zip |
albums
-rw-r--r-- | controller/admin.php | 86 | ||||
-rw-r--r-- | controller/ckeditor.php | 124 | ||||
-rw-r--r-- | controller/installation.php | 5 | ||||
-rw-r--r-- | controller/visitor.php | 65 | ||||
-rw-r--r-- | index.php | 6 | ||||
-rw-r--r-- | model/Classes.php | 190 | ||||
-rw-r--r-- | public/discographie.css | 14 | ||||
-rw-r--r-- | view/discographie.php | 51 | ||||
-rw-r--r-- | view/melaine.php | 4 | ||||
-rw-r--r-- | view/template.php | 2 |
10 files changed, 362 insertions, 185 deletions
diff --git a/controller/admin.php b/controller/admin.php index 0abdb1c..2588d36 100644 --- a/controller/admin.php +++ b/controller/admin.php | |||
@@ -8,11 +8,9 @@ function melaineEdit($numArticle, $suppression) | |||
8 | { | 8 | { |
9 | $page_actuelle = "melaine"; | 9 | $page_actuelle = "melaine"; |
10 | 10 | ||
11 | $Articles = new ArticlesManager; | 11 | // modèle |
12 | 12 | $Article = new OneArticle($page_actuelle); | |
13 | // contenu de la page | 13 | $Article->makeFileList(); |
14 | $Articles->setPage($page_actuelle); | ||
15 | $Articles->getFiles(); | ||
16 | 14 | ||
17 | // nouvel article | 15 | // nouvel article |
18 | if($numArticle == 0) | 16 | if($numArticle == 0) |
@@ -23,13 +21,13 @@ function melaineEdit($numArticle, $suppression) | |||
23 | else | 21 | else |
24 | { | 22 | { |
25 | // nom de l'article ciblé (objet et session) | 23 | // nom de l'article ciblé (objet et session) |
26 | $Articles->findFileName($numArticle); | 24 | $Article->findFileName($numArticle); |
27 | $_SESSION['nomFichier'] = $Articles->getFileName(); | 25 | $_SESSION['nomFichier'] = $Article->getFileName(); |
28 | 26 | ||
29 | // suppression | 27 | // suppression |
30 | if($suppression) | 28 | if($suppression) |
31 | { | 29 | { |
32 | $Articles->delete(); | 30 | $Article->delete(); |
33 | header('Location: index.php?page=' . $page_actuelle); | 31 | header('Location: index.php?page=' . $page_actuelle); |
34 | exit(); | 32 | exit(); |
35 | } | 33 | } |
@@ -37,15 +35,12 @@ function melaineEdit($numArticle, $suppression) | |||
37 | else | 35 | else |
38 | { | 36 | { |
39 | $title = "Modifier un article"; | 37 | $title = "Modifier un article"; |
40 | 38 | $texte = $Article->readOne(); // entrée de l'éditeur | |
41 | // contenu envoyé à l'éditeur | ||
42 | $texte = $Articles->getOne(); | ||
43 | } | 39 | } |
44 | } | 40 | } |
45 | 41 | ||
46 | // pour l'affichage des articles | 42 | // pour l'affichage des articles |
47 | $Articles->reverseFilesArray(); | 43 | $articles = array_reverse($Article->readAll()); // lourd |
48 | $articles = $Articles->getAll(); | ||
49 | 44 | ||
50 | // sécurisation du contenu pré-existant inséré dans l'éditeur | 45 | // sécurisation du contenu pré-existant inséré dans l'éditeur |
51 | if($numArticle >= 0 && !$suppression) | 46 | if($numArticle >= 0 && !$suppression) |
@@ -73,13 +68,70 @@ function discoEdit($numArticle, $suppression) | |||
73 | $title = "Discographie"; | 68 | $title = "Discographie"; |
74 | 69 | ||
75 | // modèle | 70 | // modèle |
76 | $Albums = new AlbumsManager; | 71 | $Album = new OneArticle($page_actuelle); |
77 | $texte = ''; | 72 | $Album->makeFileList(); |
73 | |||
74 | // nouvel album | ||
75 | if($numArticle == 0) | ||
76 | { | ||
77 | $title = "Ajouter un album"; | ||
78 | $texte = ''; | ||
79 | } | ||
80 | else | ||
81 | { | ||
82 | // nom de l'article ciblé (objet et session) | ||
83 | $Album->findFileName($numArticle); | ||
84 | $_SESSION['nomFichier'] = $Album->getFileName(); | ||
85 | |||
86 | // suppression | ||
87 | if($suppression) | ||
88 | { | ||
89 | $Album->delete(); | ||
90 | header('Location: index.php?page=' . $page_actuelle); | ||
91 | exit(); | ||
92 | } | ||
93 | // modification | ||
94 | else | ||
95 | { | ||
96 | $title = "Modifier un album"; | ||
97 | $texte = $Album->readOne(); // entrée de l'éditeur | ||
98 | } | ||
99 | } | ||
100 | |||
101 | $albums = array_reverse($Album->readAll()); // lourd | ||
102 | |||
103 | // $albums contient un tableau de chaines JSON, | ||
104 | // on extrait de chacune 3 variables: titre, année, pochette | ||
78 | 105 | ||
79 | // traitements PHP pour l'éditeur | 106 | // traitements PHP pour l'éditeur |
80 | require('controller/ckeditor.php'); | ||
81 | // sécurisation du contenu pré-existant inséré dans l'éditeur | 107 | // sécurisation du contenu pré-existant inséré dans l'éditeur |
82 | $texte = preparationCKeditor($numArticle, $texte); | 108 | if($numArticle >= 0 && !$suppression) |
109 | { | ||
110 | require('controller/ckeditor.php'); | ||
111 | $texte = preparationCKeditor($numArticle, $texte); | ||
112 | } | ||
113 | |||
114 | // changer les chaines JSON en tableaux | ||
115 | $i = 0; | ||
116 | foreach($albums as $oneAlbum) | ||
117 | { | ||
118 | $albums[$i] = json_decode($oneAlbum, true); | ||
119 | $i++; | ||
120 | } | ||
121 | |||
122 | // pour chaque album, détecter le fichier html | ||
123 | // si il y en a un, proposer un lien <a> | ||
124 | // si non, ne fournir qu'un lien d'ancre pour la liste d'album | ||
125 | $titreAlbum = 'discographie'; | ||
126 | if(false) | ||
127 | { | ||
128 | $lienAlbum = $titreAlbum; | ||
129 | } | ||
130 | else | ||
131 | { | ||
132 | $lienAlbum = 'discographie#' . $titreAlbum; | ||
133 | } | ||
134 | //echo($lienAlbum); | ||
83 | 135 | ||
84 | // morceaux en HTML à assembler | 136 | // morceaux en HTML à assembler |
85 | // variable $editeurHTML, contient $texte | 137 | // variable $editeurHTML, contient $texte |
diff --git a/controller/ckeditor.php b/controller/ckeditor.php index d25e5ac..2e72be2 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php | |||
@@ -44,35 +44,51 @@ function preparationCKeditor($numArticle, $texte) | |||
44 | function submitCKeditor($nomFichier) | 44 | function submitCKeditor($nomFichier) |
45 | { | 45 | { |
46 | $page = $_GET['page']; | 46 | $page = $_GET['page']; |
47 | $contenu = $_POST['contenu']; | ||
48 | 47 | ||
49 | // déjà fait mais on ne sait jamais | 48 | // déjà fait mais on ne sait jamais |
50 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) | 49 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) |
51 | { | 50 | { |
52 | header('Location: index.php?page=' . $page . '&erreur=connexion'); | 51 | header('Location: index.php?page=' . $page . '&erreur=connexion'); |
52 | exit(); | ||
53 | } | 53 | } |
54 | else | 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 | ||
65 | if(isset($_POST['contenu'])) // optionnel pour discographie | ||
55 | { | 66 | { |
67 | $contenu = $_POST['contenu']; | ||
68 | |||
56 | // récupérer les liens multimedia | 69 | // récupérer les liens multimedia |
57 | //require("media.php"); | 70 | //require("media.php"); |
58 | //$contenu = mediaSubmit($contenu); | 71 | //$contenu = mediaSubmit($contenu); |
59 | 72 | ||
60 | // sécurité faille XSS | 73 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); |
61 | $configHtmLawed = array( | 74 | // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) |
62 | 'safe'=>1, // protection contre les élements et attributs dangereux | 75 | $contenu = trim($contenu); |
63 | '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 | 76 | |
64 | 'deny_attribute'=>'id', // gêner le JS hostile | 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 !! |
65 | // on garde 'class' et 'style' utilisés par le ckediteur | 78 | if($page != 'discographie' && $contenu == '') |
66 | ); | 79 | { |
67 | $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs | 80 | header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); |
81 | exit(); | ||
82 | } | ||
68 | } | 83 | } |
69 | 84 | ||
85 | |||
70 | if($page == 'discographie') | 86 | if($page == 'discographie') |
71 | { | 87 | { |
72 | $titre = $_POST['titre']; | 88 | $titre = $_POST['titre']; |
73 | $annee = $_POST['annee']; | 89 | $annee = $_POST['annee']; |
74 | $pochette = $_POST['pochette']; // une image | 90 | $pochette = $_POST['pochette']; // une image |
75 | 91 | ||
76 | // des formulaires simples | 92 | // des formulaires simples |
77 | $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); | 93 | $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); |
78 | $titre = trim($titre); | 94 | $titre = trim($titre); |
@@ -83,25 +99,6 @@ function submitCKeditor($nomFichier) | |||
83 | // Album->imageUpload(); | 99 | // Album->imageUpload(); |
84 | // test formats jpg, jpeg, png, gif, tiff | 100 | // test formats jpg, jpeg, png, gif, tiff |
85 | // enregistrement du fichier | 101 | // enregistrement du fichier |
86 | |||
87 | // du ckeditor | ||
88 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); | ||
89 | $contenu = trim($contenu); | ||
90 | } | ||
91 | else // pages comme "melaine" | ||
92 | { | ||
93 | // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! | ||
94 | if($contenu == '') | ||
95 | { | ||
96 | header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); | ||
97 | } | ||
98 | else | ||
99 | { | ||
100 | // failles XSS | ||
101 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); | ||
102 | // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) | ||
103 | $contenu = trim($contenu); | ||
104 | } | ||
105 | } | 102 | } |
106 | 103 | ||
107 | // lien sans http:// | 104 | // lien sans http:// |
@@ -114,42 +111,61 @@ function submitCKeditor($nomFichier) | |||
114 | // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; | 111 | // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; |
115 | // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... | 112 | // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... |
116 | 113 | ||
117 | //var_dump($titre, $annee, $pochette, $contenu); | ||
118 | //die(); | ||
119 | |||
120 | // modèle | ||
121 | $Article = new ArticlesManager; | ||
122 | $Article->setPage($page); | ||
123 | 114 | ||
124 | // enregistrement | 115 | // enregistrement |
125 | if($_GET['article'] == 0) | 116 | // var_dump($titre, $annee, $pochette, $contenu); |
126 | { | 117 | // die(); |
127 | $Article->create($contenu); | ||
128 | } | ||
129 | else | ||
130 | { | ||
131 | $Article->setFileName($nomFichier); | ||
132 | $Article->update($contenu); | ||
133 | } | ||
134 | 118 | ||
119 | // modèle | ||
135 | if($page == 'discographie') | 120 | if($page == 'discographie') |
136 | { | 121 | { |
137 | $Album = new AlbumsManager; | 122 | // on instancie avec l'enfant de OneArticle |
123 | $Album = new Album($page); | ||
138 | 124 | ||
139 | var_dump($_POST); | ||
140 | echo('<br />'); | ||
141 | //var_dump($_GET['article']); | 125 | //var_dump($_GET['article']); |
142 | 126 | //var_dump($_POST); | |
127 | //exit(); | ||
128 | |||
143 | // enregistrement | 129 | // enregistrement |
144 | if($_GET['article'] == 0) | 130 | if($_GET['article'] == 0) |
145 | { | 131 | { |
146 | // ERREUR, il faut le même nombre de paramètre pour une méthode du même nom | 132 | // page disco |
147 | $Album->create($titre, $annee, $pochette); | 133 | $Album->createVignette($titre, $annee, $pochette); |
134 | |||
135 | // page détail de l'album | ||
136 | if(!empty($_POST['contenu'])) | ||
137 | { | ||
138 | $Album->create($contenu); | ||
139 | } | ||
140 | } | ||
141 | else | ||
142 | { | ||
143 | // page disco | ||
144 | $Album->updateVignette($titre, $annee, $pochette); | ||
145 | |||
146 | // page détail de l'album | ||
147 | if(isset($_POST['contenu'])) | ||
148 | { | ||
149 | $Album->update($content); | ||
150 | } | ||
151 | } | ||
152 | } | ||
153 | // autres pages | ||
154 | else | ||
155 | { | ||
156 | $Article = new OneArticle($page); | ||
157 | |||
158 | if($_GET['article'] == 0) | ||
159 | { | ||
160 | $Article->create($contenu); | ||
148 | } | 161 | } |
149 | else | 162 | else |
150 | { | 163 | { |
151 | $Album->update($titre, $annee, $pochette); | 164 | $Article->setFileName($nomFichier); |
165 | $Article->update($contenu); | ||
152 | } | 166 | } |
153 | die(); | ||
154 | } | 167 | } |
155 | } \ No newline at end of file | 168 | } |
169 | |||
170 | function cleanHTML($contenu) | ||
171 | {} | ||
diff --git a/controller/installation.php b/controller/installation.php index 42212f5..fc8c900 100644 --- a/controller/installation.php +++ b/controller/installation.php | |||
@@ -25,7 +25,7 @@ function installation() | |||
25 | if(!file_exists(".htaccess")) | 25 | if(!file_exists(".htaccess")) |
26 | { | 26 | { |
27 | echo('<p style="color: red;" >Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.</p>'); | 27 | echo('<p style="color: red;" >Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.</p>'); |
28 | // $contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes"; | 28 | //$contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes"; |
29 | // $fichier = fopen('.htaccess', 'w'); | 29 | // $fichier = fopen('.htaccess', 'w'); |
30 | // fputs($fichier, $contenu); | 30 | // fputs($fichier, $contenu); |
31 | // fclose($fichier); | 31 | // fclose($fichier); |
@@ -49,8 +49,7 @@ function installation() | |||
49 | // - modifier ceux du dossier parent (nom du site) avec son client FTP à la mise en ligne chez l'hébergeur et ensuite remettre tout comme avant | 49 | // - modifier ceux du dossier parent (nom du site) avec son client FTP à la mise en ligne chez l'hébergeur et ensuite remettre tout comme avant |
50 | 50 | ||
51 | // le 0 devant signifie que le nombre est en octal | 51 | // le 0 devant signifie que le nombre est en octal |
52 | // changer cette valeur à la mise en production du site si le script d'upload des données est bon | 52 | $droitsDossiers = 0777; // mettre 0700 à la fin |
53 | $droitsDossiers = 0777; | ||
54 | 53 | ||
55 | $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); | 54 | $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); |
56 | foreach ($listePages as $page) | 55 | foreach ($listePages as $page) |
diff --git a/controller/visitor.php b/controller/visitor.php index 4f51dda..936eb35 100644 --- a/controller/visitor.php +++ b/controller/visitor.php | |||
@@ -33,18 +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 ArticlesManager; | 36 | $Articles = new AllArticles($page_actuelle); |
37 | $Articles->setPage($page_actuelle); | 37 | $Articles->makeFileList(); |
38 | $Articles->getFiles(); | 38 | $articles = array_reverse($Articles->readAll()); // lourd |
39 | $Articles->reverseFilesArray(); | ||
40 | $articles = $Articles->getAll(); // lourd | ||
41 | |||
42 | // vérification pour protéger les visiteurs | ||
43 | // normalement déjà faite dans submit.php, au cas où la base a été trafiquée | ||
44 | foreach ($Articles as $oneArticle) | ||
45 | { | ||
46 | $oneArticle = htmLawed($oneArticle); | ||
47 | } | ||
48 | 39 | ||
49 | // variables $css, $js, $header et $content | 40 | // variables $css, $js, $header et $content |
50 | require('view/melaine.php'); | 41 | require('view/melaine.php'); |
@@ -58,7 +49,55 @@ function discoVisitor() | |||
58 | $title = "Discographie"; | 49 | $title = "Discographie"; |
59 | 50 | ||
60 | // modèle | 51 | // modèle |
61 | $Albums = new AlbumsManager; | 52 | $Albums = new Album($page_actuelle); |
53 | $Albums->makeFileList(); | ||
54 | $albumsJSON = array_reverse($Albums->readAll()); // lourd | ||
55 | |||
56 | // $albums est un tableau de chaines JSON, | ||
57 | // chacune renferme 3 variables: titre, année, pochette | ||
58 | |||
59 | // changer les chaines JSON en tableaux | ||
60 | $i = 0; | ||
61 | foreach($albumsJSON as $oneAlbum) | ||
62 | { | ||
63 | $albumsJSON[$i] = json_decode($oneAlbum, true); | ||
64 | $i++; | ||
65 | } | ||
66 | |||
67 | // on passe maintenant au contenu HTML | ||
68 | $albumNamesJSON = array_reverse($Albums->getFileNames()); | ||
69 | $Albums->setFormat('html'); | ||
70 | $Albums->makeFileList(); | ||
71 | $albumNamesHTML = array_reverse($Albums->getFileNames()); | ||
72 | |||
73 | // pour chaque album, détecter le fichier html | ||
74 | // si il y en a un, proposer un lien <a> | ||
75 | // si non, ne fournir qu'un lien d'ancre pour la liste d'album | ||
76 | $i = 0; | ||
77 | //print_r($albumNamesJSON); exit(); | ||
78 | |||
79 | foreach($albumNamesJSON as $oneAlbum) | ||
80 | { | ||
81 | $chemin = pathinfo($oneAlbum); | ||
82 | $nomJSONsansExt = $chemin['filename']; | ||
83 | $chemin = pathinfo($albumNamesHTML[0]); | ||
84 | $nomHTMLsansExt = $chemin['filename']; | ||
85 | |||
86 | // détecter un fichier du même nom | ||
87 | if(isset($nomJSONsansExt . '.html')) // c'est pas ça!! | ||
88 | { | ||
89 | //$lienAlbum[$i] = $titreAlbum; | ||
90 | } | ||
91 | else | ||
92 | { | ||
93 | //$lienAlbum[$i] = 'discographie#' . $oneAlbum[0]; | ||
94 | } | ||
95 | $i++; | ||
96 | } | ||
97 | //exit(); | ||
98 | |||
99 | |||
100 | //echo($lienAlbum); | ||
62 | 101 | ||
63 | // variables $css, $js et $content | 102 | // variables $css, $js et $content |
64 | require('view/discographie.php'); | 103 | require('view/discographie.php'); |
@@ -54,12 +54,13 @@ require('controller/password.php'); | |||
54 | installation(); | 54 | installation(); |
55 | 55 | ||
56 | 56 | ||
57 | |||
58 | // traitement des POST du ckeditor | 57 | // traitement des POST du ckeditor |
59 | // la fonction submitCKeditor n'affiche rien (controller/admin.php n'est pas utilisé) puis redirige sans GET | 58 | // la fonction submitCKeditor n'affiche rien (controller/admin.php n'est pas utilisé) puis redirige sans GET |
60 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 | 59 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 |
61 | && isset($_GET['action']) && $_GET['action'] == 'submit' | 60 | && isset($_GET['action']) && $_GET['action'] == 'submit' |
62 | && isset($_POST['contenu']) && $_POST['contenu'] != '') | 61 | // trois possibilités: on a un contenu HTML ou JSON ou les deux |
62 | && ((isset($_POST['contenu']) && $_POST['contenu'] != '') | ||
63 | || (isset($_POST['titre']) && isset($_POST['annee']) && isset($_POST['pochette'])))) | ||
63 | { | 64 | { |
64 | require('controller/ckeditor.php'); // traitement du POST | 65 | require('controller/ckeditor.php'); // traitement du POST |
65 | require('lib/htmlawed/htmLawed.php'); // failles XSS | 66 | require('lib/htmlawed/htmLawed.php'); // failles XSS |
@@ -119,7 +120,6 @@ else | |||
119 | } | 120 | } |
120 | 121 | ||
121 | 122 | ||
122 | |||
123 | // page du site demandée | 123 | // page du site demandée |
124 | if(isset($_GET['page'])) | 124 | if(isset($_GET['page'])) |
125 | { | 125 | { |
diff --git a/model/Classes.php b/model/Classes.php index e574eeb..1349cd7 100644 --- a/model/Classes.php +++ b/model/Classes.php | |||
@@ -1,127 +1,137 @@ | |||
1 | <?php | 1 | <?php |
2 | // model/Classes.php | 2 | // model/Classes.php |
3 | 3 | ||
4 | class ArticlesManager | 4 | class AllArticles |
5 | { | 5 | { |
6 | private $page = ''; // page et donc dossier concerné | 6 | protected $page; // page et donc dossier concerné |
7 | //private $Ascending = True; // ordre des éléments du tableau $files | 7 | protected $format = 'html'; // vaut 'html' ou 'json' |
8 | private $files; // noms des fichiers d'un dossier | 8 | protected $files; // noms des fichiers dans ce dossier |
9 | private $fileName; // correspond à $_SESSION['nomFichier'] | 9 | protected $time; // timestamp pour création de fichiers |
10 | private $articles; // contenu | ||
10 | private $nbArticles; // un fichier = un article | 11 | private $nbArticles; // un fichier = un article |
11 | private $articles; // contenu des fichiers | ||
12 | 12 | ||
13 | // SET | 13 | // en paramètre à l'instanciation |
14 | public function setPage($page) | 14 | public function __construct($page) |
15 | { | 15 | { |
16 | $this->page = $page; | 16 | $this->page = $page; |
17 | $this->time = time(); | ||
18 | if($this->page == 'discographie') | ||
19 | { | ||
20 | $this->format = 'json'; | ||
21 | } | ||
17 | } | 22 | } |
18 | 23 | ||
19 | public function findFileName($numArticle) | 24 | // GET |
25 | public function getPage() | ||
20 | { | 26 | { |
21 | $this->fileName = $this->files[$numArticle - 1]; | 27 | return($this->page); |
22 | } | 28 | } |
23 | 29 | ||
24 | public function setFileName($nomFichier) | 30 | public function getNbArticles() |
25 | { | 31 | { |
26 | $this->fileName = $nomFichier; | 32 | return($this->nbArticles); |
27 | } | 33 | } |
28 | 34 | public function getFileNames() | |
29 | // GET | ||
30 | public function getPage() | ||
31 | { | 35 | { |
32 | return($this->page); | 36 | return($this->files); |
33 | } | 37 | } |
34 | 38 | ||
35 | public function getFileName() | 39 | // SET |
40 | public function setFormat($format) | ||
36 | { | 41 | { |
37 | return($this->fileName); | 42 | $this->format = $format; |
38 | } | 43 | } |
39 | 44 | ||
40 | public function nbArticles() | 45 | // tableaux des noms des fichiers |
46 | public function makeFileList() | ||
41 | { | 47 | { |
42 | return($this->nbArticles); | 48 | $this->files = glob('data/' . $this->page . '/' . $this->format . '/*.' . $this->format); |
49 | //$this->files = glob('*.' . $this->format); | ||
43 | } | 50 | } |
51 | /*public function makeFilePath() | ||
52 | {}*/ | ||
44 | 53 | ||
54 | // fonctions CRUD (create - read - update - delete) | ||
55 | |||
56 | // create | ||
45 | 57 | ||
46 | // tableau des noms des articles | 58 | // read |
47 | public function getFiles() | 59 | public function readAll() |
48 | { | 60 | { |
49 | if($this->page == '') | 61 | $i = 0; |
62 | $articles = array(); | ||
63 | foreach ($this->files as $oneFile) | ||
50 | { | 64 | { |
51 | die("debug: la méthode setPage() doit être appelée avant getFiles()."); | 65 | $articles[$i] = file_get_contents($oneFile); |
66 | $i++; | ||
52 | } | 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 | ||
78 | class OneArticle extends AllArticles | ||
79 | { | ||
80 | private $fileName; // correspond à $_SESSION['nomFichier'] | ||
53 | 81 | ||
54 | $this->files = glob('data/' . $this->page . '/html/*.html'); | 82 | // GET |
83 | public function getFileName() | ||
84 | { | ||
85 | return($this->fileName); | ||
55 | } | 86 | } |
56 | 87 | ||
57 | // ordre du tableau des noms de fichiers | 88 | // SET |
58 | public function reverseFilesArray() | 89 | public function setFileName($nomFichier) // modification |
59 | { | 90 | { |
60 | $this->files = array_reverse($this->files); | 91 | $this->fileName = $nomFichier; |
61 | } | 92 | } |
62 | 93 | ||
94 | public function findFileName($numArticle) // nouvel article | ||
95 | { | ||
96 | $this->fileName = $this->files[$numArticle - 1]; | ||
97 | } | ||
63 | 98 | ||
64 | // fonctions CRUD (create - read - update - delete) | 99 | // fonctions CRUD (create - read - update - delete) |
65 | // ce sont les 4 opérations de base qu'un programme doit permettre pour être complet | 100 | |
66 | |||
67 | // create | 101 | // create |
68 | public function create($content) | 102 | public function create($content) |
69 | { | 103 | { |
70 | if($this->page == '') | 104 | $format = 'html'; |
71 | { | 105 | |
72 | die("debug: la méthode setPage() doit être appelée avant toute autre."); | 106 | // nommer les fichiers avec le timestamp pour: |
73 | } | 107 | // - les trier par ordre chronologique |
74 | |||
75 | // nommer les fichiers avec le timestamp | ||
76 | // - trie par ordre chronologique | ||
77 | // - rendre quasi impossible d'avoir deux fois le même nom (à la condition de gérer la "concurrence") | 108 | // - rendre quasi impossible d'avoir deux fois le même nom (à la condition de gérer la "concurrence") |
78 | $nom_fichier = 'data/' . $this->page . '/html/' . time() . '.html'; | 109 | $nom_fichier = 'data/' . $this->page . '/' . $format . '/' . $this->time . '.' . $format; |
79 | 110 | ||
80 | $fichier = fopen($nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu | 111 | $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser |
81 | fputs($fichier, $content); | 112 | fputs($fichier, $content); |
82 | fclose($fichier); | 113 | fclose($fichier); |
83 | chmod($nom_fichier, 0666); | 114 | chmod($nom_fichier, 0666); |
84 | } | 115 | } |
85 | 116 | ||
86 | // read | 117 | // read |
87 | public function getNumber() | 118 | public function readOne() |
88 | { | ||
89 | return $this->nbArticles; | ||
90 | } | ||
91 | |||
92 | public function getOne() | ||
93 | { | 119 | { |
94 | return(file_get_contents($this->fileName)); | 120 | return(file_get_contents($this->fileName)); |
95 | } | 121 | } |
96 | 122 | ||
97 | public function getAll() | 123 | // pour afficher des dates |
98 | { | 124 | /*public function getDate($fileNumber) |
99 | //$this->getFiles(); | ||
100 | |||
101 | $i = 0; | ||
102 | $articles = array(); | ||
103 | foreach ($this->files as $file) | ||
104 | { | ||
105 | $articles[$i] = file_get_contents($file); | ||
106 | $i++; | ||
107 | } | ||
108 | |||
109 | //print_r($articles); | ||
110 | return $articles; | ||
111 | } | ||
112 | |||
113 | public function getDate($fileNumber) | ||
114 | { | 125 | { |
115 | // le 2è paramètre exclut le suffixe .html | 126 | // le 2è paramètre exclut le suffixe .html |
116 | $timestamp = basename($this->files[$fileNumber], '.html'); | 127 | $timestamp = basename($this->files[$fileNumber], '.html'); |
117 | return getdate($timestamp); | 128 | return getdate($timestamp); |
118 | } | 129 | }*/ |
119 | 130 | ||
120 | // update | 131 | // update |
121 | public function update($content) | 132 | public function update($content) |
122 | { | 133 | { |
123 | $file = fopen($this->fileName, 'w'); | 134 | $file = fopen($this->fileName, 'w'); // crée ou écrase |
124 | // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu | ||
125 | fputs($file, $content); | 135 | fputs($file, $content); |
126 | fclose($file); | 136 | fclose($file); |
127 | //chown($this->fileName, 'http'); | 137 | //chown($this->fileName, 'http'); |
@@ -135,39 +145,55 @@ class ArticlesManager | |||
135 | } | 145 | } |
136 | } | 146 | } |
137 | 147 | ||
138 | // note: les pros font de l'hydration | ||
139 | // le code du modèle est orienté objet et "refactorisé" d'une manière précise: | ||
140 | // on utilise un objet pour une chose (des articles, commentaires, etc), | ||
141 | // un objet article contiendrait ainsi tout le nécessaire pour lire, écrire ou modifier un article | ||
142 | // il y a pour ça un programme appelé "doctrine" (inclu dans symphony) qui est capable de lire une base de données et d'en écrire les objets PHP | ||
143 | 148 | ||
144 | class AlbumsManager extends ArticlesManager | 149 | class Album extends OneArticle |
145 | { | 150 | { |
146 | // variables | 151 | // variables |
147 | 152 | //private $fileNameJSON; // même nom en .json | |
148 | // SET | 153 | //protected $format = 'json'; |
149 | 154 | ||
150 | // GET | 155 | // GET |
151 | 156 | ||
157 | // SET | ||
158 | |||
152 | // fonctions CRUD | 159 | // fonctions CRUD |
153 | 160 | ||
154 | // create | 161 | // create |
155 | //public function create($titre, $annee, $pochette) | 162 | public function createVignette($titre, $annee, $pochette) |
156 | public function create($content) | 163 | { |
157 | //public function create($content, $titre, $annee, $pochette) | 164 | if($pochette != '') |
158 | {} | 165 | { |
166 | // enregistrer le fichier | ||
167 | // retourner une erreur en cas d'échec de l'upload | ||
168 | } | ||
169 | |||
170 | $albumJSON = json_encode([$titre, $annee, $pochette]); | ||
171 | |||
172 | $nom_fichier = 'data/' . $this->page . '/' . $this->format . '/' . $this->time . '.' . $this->format; | ||
173 | |||
174 | $fichier = fopen($nom_fichier, 'w'); // w pour créer ou écraser | ||
175 | fputs($fichier, $albumJSON); | ||
176 | fclose($fichier); | ||
177 | chmod($nom_fichier, 0666); | ||
178 | } | ||
159 | 179 | ||
160 | // read | 180 | // read |
161 | public function read() | 181 | public function read() |
162 | {} | 182 | {} |
163 | 183 | ||
164 | // update | 184 | // update |
165 | //public function update($titre, $annee, $pochette) | 185 | public function updateVignette($titre, $annee, $pochette) |
166 | public function update($content) | ||
167 | //public function update($content, $titre, $annee, $pochette) | ||
168 | {} | 186 | {} |
169 | 187 | ||
170 | // delete | 188 | // delete |
171 | public function delete() | 189 | public function delete() |
172 | {} | 190 | {} |
173 | } \ No newline at end of file | 191 | } |
192 | |||
193 | |||
194 | |||
195 | // note: les pros font de l'hydration | ||
196 | // le code du modèle est orienté objet et "refactorisé" d'une manière précise: | ||
197 | // on utilise un objet pour une chose (des articles, commentaires, etc), | ||
198 | // un objet article contiendrait ainsi tout le nécessaire pour lire, écrire ou modifier un article | ||
199 | // il y a pour ça un programme appelé "doctrine" (inclu dans symphony) qui est capable de lire une base de données et d'en écrire les objets PHP \ No newline at end of file | ||
diff --git a/public/discographie.css b/public/discographie.css index ff622e9..cb0c9b5 100644 --- a/public/discographie.css +++ b/public/discographie.css | |||
@@ -90,6 +90,12 @@ input | |||
90 | article | 90 | article |
91 | { | 91 | { |
92 | margin: 5px 0px; | 92 | margin: 5px 0px; |
93 | width: 45%; | ||
94 | } | ||
95 | |||
96 | .vignette | ||
97 | { | ||
98 | width: 100%; | ||
93 | } | 99 | } |
94 | 100 | ||
95 | figure | 101 | figure |
@@ -97,6 +103,10 @@ figure | |||
97 | margin: 0px; | 103 | margin: 0px; |
98 | display: inline-block; | 104 | display: inline-block; |
99 | } | 105 | } |
106 | figure:hover | ||
107 | { | ||
108 | border: 2px blue solid; | ||
109 | } | ||
100 | 110 | ||
101 | figcaption | 111 | figcaption |
102 | { | 112 | { |
@@ -113,10 +123,10 @@ a | |||
113 | display: inline-block; | 123 | display: inline-block; |
114 | } | 124 | } |
115 | 125 | ||
116 | article a:hover | 126 | /*article a:hover |
117 | { | 127 | { |
118 | border: 2px blue solid; | 128 | border: 2px blue solid; |
119 | } | 129 | }*/ |
120 | 130 | ||
121 | 131 | ||
122 | a:hover figure figcaption | 132 | a:hover figure figcaption |
diff --git a/view/discographie.php b/view/discographie.php index 4eb8e58..47ee377 100644 --- a/view/discographie.php +++ b/view/discographie.php | |||
@@ -48,12 +48,19 @@ ob_start(); | |||
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 | <p><a href="emoi_des_mots.php" >Emoi des mots, MF chante Max Jacob (2012)</a></p> | 51 | <?php |
52 | <p>Kan Tri (2011)</p> | 52 | $i = 0; |
53 | <p>Tri Men (2007)</p> | 53 | foreach($albumsJSON as $oneAlbum) |
54 | <p><a href="kan_tri_2003.php" >Kan Tri (2003)</a></p> | 54 | { |
55 | <p><a href="hey_ho.php" >Hey ! Ho ! (2005)</a></p> | 55 | // mettre une adresse lorsqu'un fichier html existe |
56 | </div> | 56 | // si il n'existe pas, mettre une ancre vers l'endroit sur la page |
57 | ?> | ||
58 | <p><a href="index.php?page=<?= $lienAlbum[$i] ?>" ><?= $oneAlbum[0] ?> (<?= $oneAlbum[1] ?>)</a></p> | ||
59 | <?php | ||
60 | $i++; | ||
61 | } | ||
62 | ?> | ||
63 | </div> | ||
57 | </div> | 64 | </div> |
58 | </aside> | 65 | </aside> |
59 | <section> | 66 | <section> |
@@ -64,7 +71,7 @@ if($_SESSION['admin'] == 1) | |||
64 | { | 71 | { |
65 | ?> | 72 | ?> |
66 | <h3>Ajouter un album</h3> | 73 | <h3>Ajouter un album</h3> |
67 | <?= $editeurHTML ?> | 74 | <?= $editeurHTML ?> |
68 | <?php | 75 | <?php |
69 | } | 76 | } |
70 | else | 77 | else |
@@ -75,10 +82,38 @@ if($_SESSION['admin'] == 1) | |||
75 | Nouvel album | 82 | Nouvel album |
76 | </a> | 83 | </a> |
77 | </p> | 84 | </p> |
78 | <!-- <article></article> --> | ||
79 | <?php | 85 | <?php |
80 | } | 86 | } |
81 | } | 87 | } |
88 | |||
89 | // tableau des albums | ||
90 | //$j = count($albums); | ||
91 | $i = 0; | ||
92 | foreach($albumsJSON as $oneAlbum) | ||
93 | { | ||
94 | // modification | ||
95 | if(false) | ||
96 | {} | ||
97 | else | ||
98 | { | ||
99 | // mettre une adresse lorsqu'un fichier html existe | ||
100 | ?> | ||
101 | <article id="<?= $oneAlbum[0] ?>" > | ||
102 | <a href="index.php?page=<?= $lienAlbum[$i] ?>" > | ||
103 | <figure> | ||
104 | <img class="vignette" src="data/discographie/images/<?= $oneAlbum[2] ?>" alt="" > | ||
105 | <figcaption><?= $oneAlbum[0] ?><br><?= $oneAlbum[1] ?></figcaption> | ||
106 | </figure> | ||
107 | </a> | ||
108 | </article> | ||
109 | <?php | ||
110 | |||
111 | // bouton pour modifier | ||
112 | if($_SESSION['admin'] == 1) | ||
113 | {} | ||
114 | } | ||
115 | $i++; | ||
116 | } | ||
82 | ?> | 117 | ?> |
83 | </section> | 118 | </section> |
84 | <?php | 119 | <?php |
diff --git a/view/melaine.php b/view/melaine.php index cdb24cc..0067738 100644 --- a/view/melaine.php +++ b/view/melaine.php | |||
@@ -80,8 +80,8 @@ foreach ($articles as $article) | |||
80 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['article']) && $_GET['article'] == $j) | 80 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['article']) && $_GET['article'] == $j) |
81 | { | 81 | { |
82 | // on pourrait utiliser le timedate, ou encore le nom de l'article | 82 | // on pourrait utiliser le timedate, ou encore le nom de l'article |
83 | echo("\n<p>Modifier l'article " . $j . "</p>"); | 83 | //echo("\n<p>Modifier l'article " . $j . "</p>"); |
84 | //echo("<p>Modification d'un article</p>"); | 84 | echo("<p>Modification d'un article</p>"); |
85 | echo "\n"; | 85 | echo "\n"; |
86 | 86 | ||
87 | echo($editeurHTML); // injection de template-editor.php | 87 | echo($editeurHTML); // injection de template-editor.php |
diff --git a/view/template.php b/view/template.php index dad4e17..a14555d 100644 --- a/view/template.php +++ b/view/template.php | |||
@@ -71,7 +71,7 @@ if($_SESSION['admin'] == 1) | |||
71 | 71 | ||
72 | <div id="modeAdmin" > | 72 | <div id="modeAdmin" > |
73 | <p>Vous êtes en mode administrateur. | 73 | <p>Vous êtes en mode administrateur. |
74 | <!-- <a id="options" >Options</a> --> | 74 | <a id="options" >Options</a> |
75 | <a href="index.php?page=<?= $page_actuelle ?>&action=deconnexion" >Déconnexion</a> | 75 | <a href="index.php?page=<?= $page_actuelle ?>&action=deconnexion" >Déconnexion</a> |
76 | </p> | 76 | </p> |
77 | <div> | 77 | <div> |