From 5b455dbf1474a3c7c839cd129fd470f1fdae6b0c Mon Sep 17 00:00:00 2001 From: polo Date: Sun, 27 Oct 2024 13:34:13 +0100 Subject: =?UTF-8?q?v2=20avec=20NPM=20et=20composer,=20customizable=20et=20?= =?UTF-8?q?plus=20facile=20=C3=A0=20int=C3=A9grer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.php | 19 ++++ data/page/html/article.html | 1 + data/page/images/chirurgien jaune.jpg | Bin 0 -> 137915 bytes index.php | 50 +++++++++ installation dans une application PHP.txt | 95 +++++++++++++++++ lib/ckeditor5/article_hors_editeur.css | 38 +++++++ lib/ckeditor5/clean_html.php | 46 ++++++++ lib/ckeditor5/create.php | 16 +++ lib/ckeditor5/image_upload.php | 64 +++++++++++ lib/ckeditor5/view.php | 171 ++++++++++++++++++++++++++++++ src/templates/page.php | 15 +++ 11 files changed, 515 insertions(+) create mode 100644 config.php create mode 100644 data/page/html/article.html create mode 100644 data/page/images/chirurgien jaune.jpg create mode 100644 index.php create mode 100644 installation dans une application PHP.txt create mode 100644 lib/ckeditor5/article_hors_editeur.css create mode 100644 lib/ckeditor5/clean_html.php create mode 100644 lib/ckeditor5/create.php create mode 100644 lib/ckeditor5/image_upload.php create mode 100644 lib/ckeditor5/view.php create mode 100644 src/templates/page.php diff --git a/config.php b/config.php new file mode 100644 index 0000000..9cd5ff2 --- /dev/null +++ b/config.php @@ -0,0 +1,19 @@ +image
image

hello

okah ouibon

c'est pas

grave

on verra

plus tard

salut

goodbye

\ No newline at end of file diff --git a/data/page/images/chirurgien jaune.jpg b/data/page/images/chirurgien jaune.jpg new file mode 100644 index 0000000..295bce2 Binary files /dev/null and b/data/page/images/chirurgien jaune.jpg differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..d3e2d1e --- /dev/null +++ b/index.php @@ -0,0 +1,50 @@ + requête AJAX +{ + require 'lib/ckeditor5/image_upload.php'; +} +elseif(isset($_GET['action']) && $_GET['action'] === 'submit') // HTML envoyé par l'éditeur +{ + require 'lib/ckeditor5/clean_html.php'; + $html_from_editor = getAndCleanEditorOutput(); // manipule $_POST['contenu']; + + // enregistrement des données + //var_dump($html_from_editor); + echo "enregistrer les données et supprimer cette ligne dans index.php"; die; + + header('Location: ' . $previous_page); + die; +} +elseif(isset($_GET['page']) && $_GET['page'] === 'editor') // ouvrir l'éditeur +{ + require 'lib/ckeditor5/create.php'; +} +else // $previous_page, affichage sans l'article +{ + // contrôleur + + // modèle + if($storage === 'database') + {} + elseif($storage === 'files') + { + $texte = file_get_contents('data/' . $page . '/html/' . $nom_article . '.html'); + $texte = trim(addcslashes($texte, "'")); // échappe seulement les simples quotes + } + + // vue + $css_editeur = ''; + $contenu = '
' . $texte . '
+

ouvrir l\'éditeur

'; +} + +// vue +require 'src/templates/page.php'; + +// fin du script diff --git a/installation dans une application PHP.txt b/installation dans une application PHP.txt new file mode 100644 index 0000000..210902c --- /dev/null +++ b/installation dans une application PHP.txt @@ -0,0 +1,95 @@ +1/ installation + +cd "mon projet" +git clone git@ordipolo.fr:ckeditor5 +copier tout son contenu (sauf le .git) dans le dossier racine, attention quand un index.php existe déjà +rm -r ckeditor5 --interactive=never + +npm install ckeditor5 +composer require htmlawed/htmlawed + +les 11 fichiers récupérés par le git clone: +lib/ckeditor5/create.php +lib/ckeditor5/clean_html.php +lib/ckeditor5/view.php +lib/ckeditor5/image_upload.php +lib/ckeditor5/articles_hors_editeur.css +config.php +installation dans une application PHP.txt +index.php (appel des contrôleurs) +src/templates/page.php (HTML principal de la page web) +data/page/html/articles.html +data/page/images/chirurgien jaune.jpg + + +2/ à vérifier: +créer un lien symbolique comme ceci (commande pour debian): +ln -s /var/www/ckeditor5/node_modules/ckeditor5/dist/translations /var/www/ckeditor5/node_modules/ckeditor5/dist/browser/ + +ça régle un problème de chemin rencontré à la ligne: import coreTranslations from 'ckeditor5/translations/fr.js'; dans lib/ckeditor5/template.php +gràce à un lien symbolique, le programme s'attend à trouver un dossier "translations" dans "browser" + + +3/ essai +les paramètres dans config.php et les fichiers dans data permettent normalement +- d'ouvrir l'éditeur +- de lire des données dans des fichiers et de les insérer dans l'éditeur pour modification + +la sortie au "submit" est nettoyée puis se retrouve dans $html_from_editor + + +3/ intégration à un projet + +a) index.php et src/templates/page.php sont à remplacer en fonction de notre application +regarder à l'intérieur et adapter son propre code + +b) config.php est à personnaliser et/ou à copier ailleurs, +du moment que les variables à l'intérieur restent disponibles + +c) le dossier data et ses sous-dossiers ont besoin de droits en écriture + +a) adapter le routeur dans index.php + +b) adapter ce qui suit "// modèle" dans index.php et lib/ckeditor5/create.php pour obtenir les données souhaitées (BDD, fichiers) + +c) adapter le fichier config.php (vérifier les chemins) + +d) ajouter dans le +ajouter aussi dans le pour afficher l'éditeur ou du HTML créé par l'éditeur + +e) insérer dans chaque page affichant des données créées avec l'éditeur: + +l'éditeur ne génère pas de CSS mais seulement du HTML basique, ce CSS imite le rendu à l'intérieur de l'éditeur + +normalement c'est bon fini, ce qui suit est de l'information utile si on souhaite partir de zéro avec NPM et la doc + + + + + +5/ explication et choix des plugins +tout ça est déjà fait, mais vous pouvez toujours personnaliser l'éditeur en choisissant des plugins différents + +voici ce que j'ai fait dans: lib/ckeditor5/template.php + +a) créer une importmap avec les chemins des fichiers + + +b) charger une liste de plugins façon python +import { "liste de plugins" } from "ckeditor5"; + +c) rechoisir les plugins dans ClassicEditor.create(): +plugins: [ "liste de plugins" ] ... + +d) choisir les élément de la toolbar +toolbar; { items: [ "éléments" ], ... + +e) autres éléments: +toolbar des images et des tables, sécurité des envois AJAX diff --git a/lib/ckeditor5/article_hors_editeur.css b/lib/ckeditor5/article_hors_editeur.css new file mode 100644 index 0000000..a38b384 --- /dev/null +++ b/lib/ckeditor5/article_hors_editeur.css @@ -0,0 +1,38 @@ +.conteneur_article{width: 630px;} +.conteneur_article:after{content: ""; display: block; clear: both;} + +img{vertical-align: bottom;} +@media screen and (max-width: 1000px) +{img{max-width: 900px;}} + +.text-tiny{font-size: x-small;} +.text-small{font-size: small;} +.text-big{font-size: large;} +.text-huge{font-size: x-large;} + +blockquote{border-left: 5px #cccccc solid; margin: 14px 0px; padding: 2px 25px; font-style: italic;} + +.marker-yellow{background-color: #fdfd77;} +.marker-green{background-color: #62f962;} +.marker-pink{background-color: #fc7899;} +.marker-blue{background-color: #72ccfd;} +.pen-red{background-color: white; color: red;} +.pen-green{background-color: white; color: green;} + +ul{padding-left: 10px;} +.todo-list>li{list-style-type : none;} +input[type=checkbox]{-webkit-appearance: none;-moz-appearance: none;-ms-appearance: none; +height: 16px; width: 16px; border: 1px solid black; border-radius: 2px; position: relative; top: 5px; margin-right: 10px;} +input[type="checkbox"]:checked{border: none; background: #26ab33;} + +.table>table{border-collapse: collapse;} +.table td{border: 1px grey solid; padding: 7px; min-width: 30px;} +td p{margin: 0px;} + +.image{margin: 0px; text-align: center; display: inline-block;} +.image-style-side{float: right;} +.image img{max-width: 630px;} +.image-style-side img{max-width: 315px;} +.image>figcaption{margin: 0px 10px; padding: 7px; text-align: center; font-size: small; background-color: #f7f7f7;} + +iframe{min-width: 400px; min-height: 300px; max-width: 1200px; max-height: 900px;} diff --git a/lib/ckeditor5/clean_html.php b/lib/ckeditor5/clean_html.php new file mode 100644 index 0000000..5d00532 --- /dev/null +++ b/lib/ckeditor5/clean_html.php @@ -0,0 +1,46 @@ +1, // protection contre les élements et attributs dangereux + + // balises autorisées + 'elements'=>'h2, h3, h4, p, span, i, strong, u, s, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', + // note: change en + + // attributs interdits + 'deny_attribute'=>'id', // 'class' et 'style' sont conservés pour le ckeditor + ); + $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs + $html = htmLawed($html, $configHtmLawed, $specHtmLawed); + + + //~ $nom_fichier = "après.html"; + //~ $fichier = fopen('data/' . $page . '/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu + //~ fputs($fichier, $html); + //~ fclose($fichier); + //~ chmod('data/' . $page . '/' . $nom_fichier, 0666); + + + return $html; +} + + + diff --git a/lib/ckeditor5/create.php b/lib/ckeditor5/create.php new file mode 100644 index 0000000..d62f893 --- /dev/null +++ b/lib/ckeditor5/create.php @@ -0,0 +1,16 @@ + + +// pour voir cette réponse, les messages d'erreur ou tout affichage avec echo ou var_dump: +// outils de développement (F12) => réseau => trouver la requête (xhr) => cliquer dessus puis sur réponse + +// rappel: le téléchargement de fichier avec PHP nécessite un dossier temporaire et que le serveur y soit autorisé en écriture + + +$erreur = ''; +if(isset($_FILES['upload']) AND $_FILES['upload']['error'] == 0) // 0 signifie ok +{ + if($_FILES['upload']['size'] <= $php_ini_max_size ) + { + $infos = pathinfo ($_FILES['upload']['name']); + $extension = $infos['extension']; + $extautorisées = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff']; + // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur) + if(in_array($extension, $extautorisées)) + { + move_uploaded_file ($_FILES['upload']['tmp_name'], 'data/' . $page . '/images/' . $_FILES['upload']['name']); + chmod('data/' . $page . '/images/' . $_FILES['upload']['name'], 0666); + } + else + { + $erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff
le format svg n\'est pas supporté'; + } + } + else + { + $erreur = 'fichier trop lourd'; + } +} +else +{ + $erreur = $_FILES['upload']['error']; +} +/* les erreurs retournées avec $_FILES['upload']['error']: +0 pas d'erreur +1 taille du fichier supérieure à la valeur de upload_max_filesize dans le fichier php.ini (par défaut = 2 MO) +2 taille du fichier supérieure à la valeur de MAX_FILE_SIZE dans le formulaire HTML +3 fichier partiellement téléchargé +4 pas de fichier du tout +6 pas de dossier temporaire pour mettre le fichier +7 echec de l'écriture sur le DD +8 envoi arrêté par une extension de PHP mais on ne nous dit pas pourquoi => diagnostic avec la fonction phpinfo() */ + +if(empty($erreur)) +{ + $chemin = '{"url": "data/' . $page . '/images/' . $_FILES['upload']['name'] . '"}'; + echo $chemin; +} +else +{ + echo $erreur; +} +die; diff --git a/lib/ckeditor5/view.php b/lib/ckeditor5/view.php new file mode 100644 index 0000000..6d6c961 --- /dev/null +++ b/lib/ckeditor5/view.php @@ -0,0 +1,171 @@ +'; // version normale aérée et commentée +$css_editeur = ''; // version "minifiée" + +ob_start(); +?> +
+
+ + + + + + +
+
+ + + + + + + + + + +
+ +
+ + -- cgit v1.2.3