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.tar.gz melaine-10954c386cacb270e4ae16837483120ca3406259.tar.bz2 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> |
