summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-09-01 23:35:42 +0200
committerpolo <ordipolo@gmx.fr>2021-09-01 23:35:42 +0200
commit10954c386cacb270e4ae16837483120ca3406259 (patch)
treee3107a29984b0e91db899fc08d4a7e066eaf2710
parent452420d0cd05822a9974fe27f0edc4cc4dc300cc (diff)
downloadmelaine-10954c386cacb270e4ae16837483120ca3406259.zip
albums
-rw-r--r--controller/admin.php86
-rw-r--r--controller/ckeditor.php124
-rw-r--r--controller/installation.php5
-rw-r--r--controller/visitor.php65
-rw-r--r--index.php6
-rw-r--r--model/Classes.php190
-rw-r--r--public/discographie.css14
-rw-r--r--view/discographie.php51
-rw-r--r--view/melaine.php4
-rw-r--r--view/template.php2
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)
44function submitCKeditor($nomFichier) 44function 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
170function 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');
diff --git a/index.php b/index.php
index dc5f3ba..b9989fd 100644
--- a/index.php
+++ b/index.php
@@ -54,12 +54,13 @@ require('controller/password.php');
54installation(); 54installation();
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
60if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 59if(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
124if(isset($_GET['page'])) 124if(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
4class ArticlesManager 4class 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
78class 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
144class AlbumsManager extends ArticlesManager 149class 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
90article 90article
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
95figure 101figure
@@ -97,6 +103,10 @@ figure
97 margin: 0px; 103 margin: 0px;
98 display: inline-block; 104 display: inline-block;
99} 105}
106figure:hover
107{
108 border: 2px blue solid;
109}
100 110
101figcaption 111figcaption
102{ 112{
@@ -113,10 +123,10 @@ a
113 display: inline-block; 123 display: inline-block;
114} 124}
115 125
116article a:hover 126/*article a:hover
117{ 127{
118 border: 2px blue solid; 128 border: 2px blue solid;
119} 129}*/
120 130
121 131
122a:hover figure figcaption 132a: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> 53foreach($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;
92foreach($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>