From 610291f311aeab7363d1dbc39e62cbce8533c73f Mon Sep 17 00:00:00 2001 From: polo Date: Mon, 10 May 2021 03:31:18 +0200 Subject: classe --- .htaccess | 12 ++++++- controller/admin.php | 60 ++++++++++++++++++++++----------- controller/ckeditor.php | 22 +++++++++--- controller/visitor.php | 4 ++- index.php | 4 +-- model/Article.php | 84 ++++++++++++++++++++++++++++++++++++++++++++++ model/melaine-read.php | 49 +++++++++++++++++++-------- model/melaine-write.php | 17 +++++++--- view/melaine.php | 11 ++++-- view/template-ckeditor.php | 8 ++--- 10 files changed, 216 insertions(+), 55 deletions(-) create mode 100644 model/Article.php diff --git a/.htaccess b/.htaccess index 9c3a9cc..f4a4cf8 100644 --- a/.htaccess +++ b/.htaccess @@ -1 +1,11 @@ -ErrorDocument 404 http://localhost/melaine-polo-mvc/erreur404.php +# redirection en cas d'erreur 404 + +# site simple +#ErrorDocument 404 http://localhost/melaine/erreur404.php + +# site "hôte virtuel" (cas des hébergeurs et d'une debian par défaut) +ErrorDocument 404 http://melaine.localhost/erreur404.php +#ErrorDocument 404 "retour au site" + +# Interdire exploration du répertoire +#Options All -Indexes diff --git a/controller/admin.php b/controller/admin.php index 2b3583f..77ab34e 100644 --- a/controller/admin.php +++ b/controller/admin.php @@ -4,37 +4,59 @@ // utilisation du site en écriture // pages du site en version admin -function melaineAdmin($numArticle) +function melaineEdit($numArticle) { - $title = "Ajouter ou modifier un article"; $page_actuelle = "melaine"; - // variables $nombreDarticles et tableau $articles[] + // tableau $articles[] require('model/melaine-read.php'); + $croissant = False; + $articles = lireArticles($page_actuelle, $croissant); + + if($numArticle == 0) + { + $title = "Ajouter un article"; + $texte = ''; + //$numArticle = count($articles) + 1; + } + else + { + $title = "Modifier un article"; + // faire correspondre le numéro de l'article du GET et le tableau des articles qui est inversé + $texte = $articles[count($articles) - $numArticle]; + } // traitements PHP pour l'éditeur require('controller/ckeditor.php'); + // sécurisation du contenu pré-existant inséré dans l'éditeur + $initial = preparationCKeditor($numArticle, $texte); // NB: penser à ajouter au template la fonctionnalité "autosave" // https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/saving-data.html - // récupération des données du modèle - if($numArticle > $nombreDarticles || $numArticle < 0) // erreur nombre trop grand (bug?) - { - header('Location: index.php?page=melaine'); - } - elseif($numArticle == 0) // nouvel article - { - $texte = ''; - $numArticle = $nombreDarticles + 1; - } - else // modification d'un article - { - $texte = $articles[$numArticle - 1]; - } + // if($numArticle > $nombreDarticles || $numArticle < 0) // erreur nombre trop grand (bug?) + // { + // header('Location: index.php?page=melaine'); + // } + // elseif($numArticle == 0) // nouvel article + // { + // $texte = ''; + // $numArticle = $nombreDarticles + 1; + // } + // else // modification d'un article + // { + // $texte = $articles[$numArticle - 1]; + // } + - // traitement du contenu pré-existant - $initial = preparationCKeditor($page_actuelle, $numArticle, $texte); + // if($initial == '') + // { + // $article = "nouveau"; + // } + // else + // { + // $article = "modif"; + // } // variable $editeurHTML, $initial est inséré dedans require('view/template-ckeditor.php'); diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 1d085a7..013d6b5 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php @@ -7,10 +7,9 @@ // il y a aussi un fichier CSS parce que le HTML créé par l'éditeur ne suffit pas à lui-même // avant de placer l'éditeur -function preparationCKeditor($page, $numArticle, $texte) +function preparationCKeditor($numArticle, $texte) { - // $page sert à lire et écrire du contenu dans le bon dossier - // $article sert à placer l'éditeur sur la page et à lire et écrire dans le bon dossier + // $numArticle sert à placer l'éditeur sur la page et à lire et écrire dans le bon dossier // texte initial pour setData() à modifier avec l'éditeur if ($numArticle > 0) @@ -83,10 +82,23 @@ function submitCKeditor($page, $article, $contenuPOST) // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo ''; // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... + // echo($page); + // echo($article); + // echo($contenu); + // die(); + // enregistrement require('model/melaine-write.php'); - nouvelArticle($page, $article, $contenu); - + if($article == 0) + { + nouvelArticle($page, $contenu); + } + else + { + // $article est le nom du fichier + modifArticle($page, $article, $contenu); + } + // debuggage //exit(); } \ No newline at end of file diff --git a/controller/visitor.php b/controller/visitor.php index 98d7a45..9bd3461 100644 --- a/controller/visitor.php +++ b/controller/visitor.php @@ -32,8 +32,10 @@ function melaineVisitor() $page_actuelle = "melaine"; $title = "Mais qui est Melaine Favennec?"; - // variables $nombreDarticles et tableau $articles + // tableau $articles require('model/melaine-read.php'); + $croissant = False; + $articles = lireArticles($page_actuelle, $croissant); // vérification pour protéger les visiteurs // normalement déjà faite dans submit.php, diff --git a/index.php b/index.php index 72791fd..81d5faf 100644 --- a/index.php +++ b/index.php @@ -128,12 +128,12 @@ if(isset($_GET['page'])) // modification if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0) { - melaineAdmin($_GET['article']); + melaineEdit($_GET['article']); } // nouvel article else { - melaineAdmin(0); + melaineEdit(0); } } else diff --git a/model/Article.php b/model/Article.php new file mode 100644 index 0000000..cee594f --- /dev/null +++ b/model/Article.php @@ -0,0 +1,84 @@ +page == '') + { + die("debug: la méthode setPage() doit être appelée avant toute autre."); + } + + $this->files = glob('data/' . $this->page . '/html/*.html'); + + if($croissant == False) + { + $files = array_reverse($files); + } + + $this->nbArticles = count($this->files); + } + + public function getNb() + { + return $this->nbArticles; + } + + public function getAll($croissant) + { + $this->croissant = $croissant; + + getFiles(); + + $i = 0; + foreach ($this->files as $file) + { + $articles[$i] = file_get_contents($file); + $i++; + } + + return $articles; + } + + public function getOne() + {} + + public function getDate($fileNumber) + { + // le 2è paramètre exclut le suffixe .html + $timestamp = basename($this->files[$fileNumber], '.html'); + return getdate($timestamp); + } + + public function new($content) + { + if($this->page == '') + { + die("debug: la méthode setPage() doit être appelée avant toute autre."); + } + + $nom_fichier = time() . '.html'; + $fichier = fopen('data/' . $this->page . '/html/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu + fputs($fichier, $content); + fclose($fichier); + chmod('data/' . $this->page . '/html/' . $nom_fichier, 0666); + } + + public function update() + {} + + public function remove() + {} + + public function setPage($page) + { + $this->page = $page; + } +} \ No newline at end of file diff --git a/model/melaine-read.php b/model/melaine-read.php index 7e51b2c..801cd3c 100644 --- a/model/melaine-read.php +++ b/model/melaine-read.php @@ -3,21 +3,42 @@ // // accès en lecture seule -// créer un tableau avec le nom des fichiers html -$files = glob('data/' . $page_actuelle . '/html/*.html'); -// nombre de fichiers (= taille du tableau $files) -$nombreDarticles = count($files); - -// tableau contenant tous les articles au format html -$articles = [$nombreDarticles]; -for ($i = 0 ; $i < $nombreDarticles ; $i++) -{ - // les noms de fichiers commencent par 1 - // les articles dans le tableau[] commencent par 0 - $numero = $i + 1; - $articles[$i] = file_get_contents('data/' . $page_actuelle . '/html/article' . $numero . '.html'); -} +function lireArticles($page_actuelle, $croissant) +{ + // créer un tableau avec le nom des fichiers html + $files = glob('data/' . $page_actuelle . '/html/*.html'); + + // nombre de fichiers (= taille du tableau $files) + //$nombreDarticles = count($files); + + // tableau contenant tous les articles au format html + //$articles = [$nombreDarticles]; + + // inverse l'ordre du tableau retourné + if($croissant == False) + { + $files = array_reverse($files); + } + // for ($i = 0 ; $i < $nombreDarticles ; $i++) + // { + // // les noms de fichiers commencent par 1 + // // les articles dans le tableau[] commencent par 0 + // $numero = $i + 1; + // $articles[$i] = file_get_contents('data/' . $page_actuelle . '/html/article' . $numero . '.html'); + // } + $i = 0; + foreach ($files as $files) + { + $articles[$i] = file_get_contents($files); + $i++; + } + + //print_r($articles); + //var_dump($articles); + + return($articles); +} // note: les pros font de l'hydration // le code du modèle est orienté objet et "refactorisé" d'une manière précise: diff --git a/model/melaine-write.php b/model/melaine-write.php index 4f5b441..642bf05 100644 --- a/model/melaine-write.php +++ b/model/melaine-write.php @@ -3,15 +3,22 @@ // // accès en écriture pour créer ou modifier des articles -function nouvelArticle($page, $article, $contenuHTML) +function nouvelArticle($page, $contenuHTML) { - // debuggage - //exit(); - // manipulation du fichier - $nom_fichier = 'article' . $article . '.html'; + //$nom_fichier = 'article' . $article . '.html'; + $nom_fichier = time() . '.html'; $fichier = fopen('data/' . $page . '/html/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu fputs($fichier, $contenuHTML); fclose($fichier); chmod('data/' . $page . '/html/' . $nom_fichier, 0666); } + +function modifArticle($page, $nom_fichier, $contenuHTML) +{ + // manipulation du fichier + $fichier = fopen('data/' . $page . '/html/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu + fputs($fichier, $contenuHTML); + fclose($fichier); + chmod('data/' . $page . '/html/' . $nom_fichier, 0666); +} \ No newline at end of file diff --git a/view/melaine.php b/view/melaine.php index 9fb8482..acf4962 100644 --- a/view/melaine.php +++ b/view/melaine.php @@ -67,9 +67,13 @@ if($_SESSION['admin'] == 1) // on pourrait paginer avec des onglets contenant 5 ou 10 articles chacun // tableau articles[] du dernier au premier (1 case = 1 article) -for ($i=$nombreDarticles - 1; $i >= 0 ; $i--) +//for ($i=$nombreDarticles - 1; $i >= 0 ; $i--) + +//$j = 0; +$j = count($articles); +foreach ($articles as $article) { - $j = $i + 1; + //$j = $i + 1; // la div invisible sert à la compensation des liens d'ancre # ?> @@ -91,7 +95,7 @@ if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edit else { // c'était pas compliqué - echo($articles[$i] . "\n"); + echo($article . "\n"); // bouton if($_SESSION['admin'] == 1) @@ -109,5 +113,6 @@ else ?> // https://oembed.com/ // qui nécessite un traitement (en JS ou côté serveur) en utilisant le lien à l'intérieur @@ -130,7 +129,7 @@ ob_start(); // permettent d'afficher un aperçu (preview): une image avec un bouton lecture dessus // cette image est envoyée imédiatement par le serveur, et le contenu après un clic dessus // - }, + //}, // images // https://ckeditor.com/docs/ckeditor5/latest/features/image-upload/simple-upload-adapter.html @@ -144,7 +143,6 @@ ob_start(); // - à télécharger l'image avant de la placer dans l'éditeur // - écrire le HTML qu'on enregistrera ensuite // en effet, le fichier est téléchargé sur le serveur avant de revenir dans l'éditeur comme un téléchargement classique - simpleUpload: { uploadUrl: 'imageAJAX.php?page=', // noter qu'il est possible (parce que souhaitable je ne pense pas) d'envoyer une requête AJAX @@ -158,7 +156,7 @@ ob_start(); } }, // formats acceptés par défaut: jpeg, png, gif, bmp, webp, tiff - // le svg n'est pas dans la liste, pour raison de sécurité il me semble, apparemment on peut mettre du javascript à l'intérieur + // le svg n'est pas dans la liste, pour raison de sécurité apparemment, il parait qu'on peut mettre du javascript à l'intérieur // ce plugin a l'intérêt de ne pas imposer l'utilisation de l'extension GD de PHP, // Reste qu'il sera quand même intéressant de l'ajouter pour le redimensionnement des images trop lourdes, -- cgit v1.2.3