diff options
| author | polo <ordipolo@gmx.fr> | 2021-04-20 21:46:33 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2021-04-20 21:46:33 +0200 |
| commit | 87798e5554eb0330cd2de255e5034f0472d410a4 (patch) | |
| tree | acd9e26a7d912c7575cb6dd1c7b42cc3e9f52993 /view | |
| download | melaine-87798e5554eb0330cd2de255e5034f0472d410a4.tar.gz melaine-87798e5554eb0330cd2de255e5034f0472d410a4.tar.bz2 melaine-87798e5554eb0330cd2de255e5034f0472d410a4.zip | |
mot de passe
Diffstat (limited to 'view')
| -rw-r--r-- | view/accueil.php | 24 | ||||
| -rw-r--r-- | view/connexion.php | 62 | ||||
| -rw-r--r-- | view/courriel.php | 10 | ||||
| -rw-r--r-- | view/melaine.php | 113 | ||||
| -rw-r--r-- | view/menu.php | 74 | ||||
| -rw-r--r-- | view/nav.php | 13 | ||||
| -rw-r--r-- | view/template-ckeditor.php | 189 | ||||
| -rw-r--r-- | view/template.php | 90 |
8 files changed, 575 insertions, 0 deletions
diff --git a/view/accueil.php b/view/accueil.php new file mode 100644 index 0000000..3d852d7 --- /dev/null +++ b/view/accueil.php | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | <?php | ||
| 2 | // view/accueil.php | ||
| 3 | |||
| 4 | // variable $js | ||
| 5 | ob_start(); | ||
| 6 | ?> | ||
| 7 | <script type="text/javascript" src="public/main.js" ></script> | ||
| 8 | <script type="text/javascript" >accueil_vers_menu();</script> | ||
| 9 | <?php | ||
| 10 | $js = ob_get_clean(); | ||
| 11 | |||
| 12 | // variable $header | ||
| 13 | ob_start(); | ||
| 14 | echo "\n\n"; | ||
| 15 | ?> | ||
| 16 | <header> | ||
| 17 | <a class="no_underline" href="index.php?page=menu" > | ||
| 18 | <div id="bienvenue" > | ||
| 19 | <span class="police_titre" >Bienvenue sur le site de</span> | ||
| 20 | </div> | ||
| 21 | </a> | ||
| 22 | </header> | ||
| 23 | <?php | ||
| 24 | $header = ob_get_clean(); \ No newline at end of file | ||
diff --git a/view/connexion.php b/view/connexion.php new file mode 100644 index 0000000..2187ecf --- /dev/null +++ b/view/connexion.php | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | <?php | ||
| 2 | // view/connexion.php | ||
| 3 | // | ||
| 4 | // ce fichier contient le HTML de deux pages du site: | ||
| 5 | // - connexion au mode admin | ||
| 6 | // - changement de mot de passe | ||
| 7 | |||
| 8 | // formulaire connexion | ||
| 9 | ob_start(); | ||
| 10 | ?> | ||
| 11 | <form class="connexionFormulaire" method="post" action="index.php?page=connexion&from=<?= $_GET['from'] ?>" > | ||
| 12 | <label for="motdepasse" >Mot de passe:</label> | ||
| 13 | <input type="password" name="motdepasse" autofocus required > | ||
| 14 | <input type="submit" value="Valider" > | ||
| 15 | </form> | ||
| 16 | <?php | ||
| 17 | $formulaireConnexion = ob_get_clean(); | ||
| 18 | |||
| 19 | // formulaire changement de mot de passe | ||
| 20 | // vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle | ||
| 21 | ob_start(); | ||
| 22 | ?> | ||
| 23 | |||
| 24 | <?php | ||
| 25 | $formulaireNouveauMDP = ob_get_clean(); | ||
| 26 | |||
| 27 | // en-tête | ||
| 28 | ob_start(); | ||
| 29 | ?> | ||
| 30 | <!DOCTYPE html> | ||
| 31 | |||
| 32 | <html lang="fr" > | ||
| 33 | <head> | ||
| 34 | <meta charset="utf-8" /> | ||
| 35 | <title><?= $title ?></title> | ||
| 36 | |||
| 37 | <!-- <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> --> | ||
| 38 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > | ||
| 39 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> | ||
| 40 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> | ||
| 41 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
| 42 | </head> | ||
| 43 | |||
| 44 | <body> | ||
| 45 | <div id="bloc_page" > | ||
| 46 | <h2 class="connexionTitre" ><?= $title ?></h2> | ||
| 47 | <p class="connexionTitre" ><?= $subHeading ?></p> | ||
| 48 | <?php | ||
| 49 | $header = ob_get_clean(); | ||
| 50 | |||
| 51 | // pied de page | ||
| 52 | ob_start(); | ||
| 53 | ?> | ||
| 54 | <p class="connexionFooter" > | ||
| 55 | <i>N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.</i><br /> | ||
| 56 | <a href="index.php?page=<?= $_GET['from'] ?>" >Retour à la page précédente</a> | ||
| 57 | </p> | ||
| 58 | </div> | ||
| 59 | </body> | ||
| 60 | </html> | ||
| 61 | <?php | ||
| 62 | $footer = ob_get_clean(); \ No newline at end of file | ||
diff --git a/view/courriel.php b/view/courriel.php new file mode 100644 index 0000000..ed5fe79 --- /dev/null +++ b/view/courriel.php | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | <div id="courriel" > | ||
| 2 | <div> | ||
| 3 | <img src="public/timbre.png" alt="" ><br />Envoyez-moi un courriel à: <img src="public/courriel.png" > | ||
| 4 | </div> | ||
| 5 | |||
| 6 | <div id="courrielJS" > | ||
| 7 | <button onclick="clientCourriel();" >Avec mon logiciel<br />de messagerie</button> | ||
| 8 | <button onclick="copierAdresse();" >Copier l'adresse dans<br />le presse-papier</button> | ||
| 9 | </div> | ||
| 10 | </div> \ No newline at end of file | ||
diff --git a/view/melaine.php b/view/melaine.php new file mode 100644 index 0000000..9fb8482 --- /dev/null +++ b/view/melaine.php | |||
| @@ -0,0 +1,113 @@ | |||
| 1 | <?php | ||
| 2 | // view/melaine.php | ||
| 3 | // | ||
| 4 | // variable $css | ||
| 5 | ob_start(); | ||
| 6 | ?> | ||
| 7 | <link rel="stylesheet" type="text/css" href="public/<?= $page_actuelle ?>.css" /> | ||
| 8 | <link rel="stylesheet" type="text/css" href="public/donnees_hors_editeur.css" /> | ||
| 9 | <?php | ||
| 10 | $css = ob_get_clean(); | ||
| 11 | |||
| 12 | |||
| 13 | //variable $js | ||
| 14 | ob_start(); | ||
| 15 | ?> | ||
| 16 | <script type="text/javascript" src="public/main.js" ></script> | ||
| 17 | <?php | ||
| 18 | if(isset($_GET['action']) && $_GET['action'] == 'editor') | ||
| 19 | { | ||
| 20 | |||
| 21 | // bibliothèques JS ckeditor et ckfinder | ||
| 22 | ?> | ||
| 23 | <script src="lib/ckeditor5/build/ckeditor.js"></script> | ||
| 24 | <?php | ||
| 25 | } | ||
| 26 | $js = ob_get_clean(); | ||
| 27 | |||
| 28 | |||
| 29 | // variable $header | ||
| 30 | ob_start(); | ||
| 31 | echo "\n"; | ||
| 32 | ?> | ||
| 33 | <header> | ||
| 34 | <div id="titre" > | ||
| 35 | <span class="police_titre" >Melaine Favennec</span> | ||
| 36 | </div> | ||
| 37 | <div id="photo" ></div> | ||
| 38 | </header> | ||
| 39 | <?php | ||
| 40 | $header = ob_get_clean(); | ||
| 41 | |||
| 42 | |||
| 43 | // variable $content | ||
| 44 | ob_start(); | ||
| 45 | if($_SESSION['admin'] == 1) | ||
| 46 | { | ||
| 47 | // éditeur | ||
| 48 | if(isset($_GET['action']) && $_GET['action'] == 'editor' && !isset($_GET['article'])) | ||
| 49 | { | ||
| 50 | echo("<p>Rédiger un nouvel article</p>"); | ||
| 51 | echo($editeurHTML); // injection de template-editor.php | ||
| 52 | } | ||
| 53 | |||
| 54 | // bouton | ||
| 55 | else | ||
| 56 | { | ||
| 57 | ?> | ||
| 58 | <p class="boutonArticle" > | ||
| 59 | <a href="index.php?page=melaine&action=editor" > | ||
| 60 | Nouvel article | ||
| 61 | </a> | ||
| 62 | </p> | ||
| 63 | <?php | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | // on pourrait paginer avec des onglets contenant 5 ou 10 articles chacun | ||
| 68 | |||
| 69 | // tableau articles[] du dernier au premier (1 case = 1 article) | ||
| 70 | for ($i=$nombreDarticles - 1; $i >= 0 ; $i--) | ||
| 71 | { | ||
| 72 | $j = $i + 1; | ||
| 73 | |||
| 74 | // la div invisible sert à la compensation des liens d'ancre # | ||
| 75 | ?> | ||
| 76 | <div class="zoneVideNav" ></div> | ||
| 77 | <article id="article<?= $j ?>" > | ||
| 78 | <?php | ||
| 79 | |||
| 80 | // remplacer un article par l'éditeur | ||
| 81 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['article']) && $_GET['article'] == $j) | ||
| 82 | { | ||
| 83 | echo("\n<p>Modifier l'article " . $j . "</p>"); | ||
| 84 | //echo("<p>Modification d'un article</p>"); | ||
| 85 | echo "\n"; | ||
| 86 | |||
| 87 | echo($editeurHTML); // injection de template-editor.php | ||
| 88 | } | ||
| 89 | |||
| 90 | // placer un article | ||
| 91 | else | ||
| 92 | { | ||
| 93 | // c'était pas compliqué | ||
| 94 | echo($articles[$i] . "\n"); | ||
| 95 | |||
| 96 | // bouton | ||
| 97 | if($_SESSION['admin'] == 1) | ||
| 98 | { | ||
| 99 | ?> | ||
| 100 | <p class="boutonArticle" > | ||
| 101 | <a href="index.php?page=melaine&action=editor&article=<?= $j ?>#article<?= $j ?>" > | ||
| 102 | Modifier cet article | ||
| 103 | </a> | ||
| 104 | </p> | ||
| 105 | <?php | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 109 | ?> | ||
| 110 | </article> | ||
| 111 | <?php | ||
| 112 | } | ||
| 113 | $content = ob_get_clean(); | ||
diff --git a/view/menu.php b/view/menu.php new file mode 100644 index 0000000..51476b4 --- /dev/null +++ b/view/menu.php | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | <?php | ||
| 2 | // view/menu.php | ||
| 3 | |||
| 4 | // variable $css | ||
| 5 | ob_start(); | ||
| 6 | ?> | ||
| 7 | <link rel="stylesheet" type="text/css" href="public/<?= $page_actuelle ?>.css" /> | ||
| 8 | <?php | ||
| 9 | $css = ob_get_clean(); | ||
| 10 | |||
| 11 | //variable $js | ||
| 12 | ob_start(); | ||
| 13 | ?> | ||
| 14 | <script type="text/javascript" src="public/main.js" ></script> | ||
| 15 | <?php | ||
| 16 | $js = ob_get_clean(); | ||
| 17 | |||
| 18 | // variable $header | ||
| 19 | ob_start(); | ||
| 20 | echo "\n\n"; | ||
| 21 | ?> | ||
| 22 | <header> | ||
| 23 | <div id="titre" > | ||
| 24 | <span class="police_titre" >Choisissez une rubrique</span> | ||
| 25 | </div> | ||
| 26 | </header> | ||
| 27 | <?php | ||
| 28 | $header = ob_get_clean(); | ||
| 29 | |||
| 30 | // variable $content | ||
| 31 | ob_start(); | ||
| 32 | echo "\n"; | ||
| 33 | ?> | ||
| 34 | <div id="contenu" > | ||
| 35 | <div id="colonne1" > | ||
| 36 | <a href="index.php?page=liens" > | ||
| 37 | <div id="canoe" ></div> | ||
| 38 | </a> | ||
| 39 | |||
| 40 | <a href="index.php?page=presse" > | ||
| 41 | <div id="fille_qui_tombe" ></div> | ||
| 42 | </a> | ||
| 43 | |||
| 44 | <a href="index.php?page=melaine" > | ||
| 45 | <div id="pochette" ></div> | ||
| 46 | </a> | ||
| 47 | |||
| 48 | <a href="index.php?page=ateliers" > | ||
| 49 | <div id="cavalier" ></div> | ||
| 50 | </a> | ||
| 51 | |||
| 52 | <a href="index.php" > | ||
| 53 | <div id="pommes" ></div> | ||
| 54 | </a> | ||
| 55 | </div> | ||
| 56 | |||
| 57 | <div id="colonne2" > | ||
| 58 | <a href="index.php?page=concerts" > | ||
| 59 | <div id="sirene" ></div> | ||
| 60 | </a> | ||
| 61 | |||
| 62 | <a href="index.php?page=peinture" > | ||
| 63 | <div id="mouette_ocean" ></div> | ||
| 64 | </a> | ||
| 65 | |||
| 66 | <a href="index.php?page=archives" > | ||
| 67 | <div id="blonde"></div> | ||
| 68 | </a> | ||
| 69 | |||
| 70 | <a id="hey_ho" href="index.php?page=discographie" ></a> | ||
| 71 | </div> | ||
| 72 | </div> | ||
| 73 | <?php | ||
| 74 | $content = ob_get_clean(); \ No newline at end of file | ||
diff --git a/view/nav.php b/view/nav.php new file mode 100644 index 0000000..f7cb299 --- /dev/null +++ b/view/nav.php | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | <nav> | ||
| 2 | <ul> | ||
| 3 | <li><a href="index.php?page=menu" <?php if($page_actuelle == "menu") {echo('id="actuelle" ');} ?>>Menu</a></li> | ||
| 4 | <li><a href="index.php?page=melaine" <?php if($page_actuelle == "melaine") {echo('id="actuelle" ');} ?>>Melaine</a></li> | ||
| 5 | <li><a href="index.php?page=discographie" <?php if($page_actuelle == "discographie") {echo('id="actuelle" ');} ?>>Discographie</a></li> | ||
| 6 | <li><a href="index.php?page=concerts" <?php if($page_actuelle == "concerts") {echo('id="actuelle" ');} ?>>Concerts</a></li> | ||
| 7 | <li><a href="index.php?page=presse" <?php if($page_actuelle == "presse") {echo('id="actuelle" ');} ?>>La Presse</a></li> | ||
| 8 | <li><a href="index.php?page=ateliers" <?php if($page_actuelle == "ateliers ") {echo('id="actuelle" ');} ?>>Ateliers</a></li> | ||
| 9 | <li><a href="index.php?page=liens" <?php if($page_actuelle == "liens") {echo('id="actuelle" ');} ?>>Liens</a></li> | ||
| 10 | <li><a href="index.php?page=peinture" <?php if($page_actuelle == "peinture") {echo('id="actuelle" ');} ?>>Peinture</a></li> | ||
| 11 | <li><a href="index.php?page=archives" <?php if($page_actuelle == "archives") {echo('id="actuelle" ');} ?>>Archives</a></li> | ||
| 12 | </ul> | ||
| 13 | </nav> \ No newline at end of file | ||
diff --git a/view/template-ckeditor.php b/view/template-ckeditor.php new file mode 100644 index 0000000..48b673a --- /dev/null +++ b/view/template-ckeditor.php | |||
| @@ -0,0 +1,189 @@ | |||
| 1 | <?php | ||
| 2 | // view/template-ckeditor.php | ||
| 3 | |||
| 4 | // voici la partie HTML et javascript du ckeditor, | ||
| 5 | // elle permette d'insérer l'éditeur dans la page avec un formulaire qui comporte 4 éléments: | ||
| 6 | // barre d'outils, zone de saisie, formulaire caché, bouton "valider" | ||
| 7 | |||
| 8 | // le formulaire est presque classique, en effet on utilise le ckeditor 5 dans sa version "Document" (ou DecoupledEditor): | ||
| 9 | // - avantage: plus de possibilité dans la barre d'outils (se rapproche d'un traitement de texte) | ||
| 10 | // - inconvénient: on ne peut utiliser la balise <textarea> qu'on remplace par une <div> | ||
| 11 | |||
| 12 | // pour pouvoir envoyer le contenu dans le POST, on a deux possibilité: | ||
| 13 | // - savoir coder en javascript ! et donc faire de l'AJAX, dans ce cas on n'a même plus besoin de formulaire, le contenu est envoyé au serveur au fur et à mesure! ce sera l'objet d'une future amélioration | ||
| 14 | // - utiliser l'astuce du formulaire caché ! | ||
| 15 | |||
| 16 | // le javascript place les données dans le formulaire caché | ||
| 17 | // avec la fonction envoiDonnees(), les données se retrouvent dans une <input> et sont donc envoyées avec par la POST (haha) | ||
| 18 | |||
| 19 | // l'envoi d'image en revanche utilise nécessairement de l'AJAX et | ||
| 20 | // la bibliothèque "ckfinder" (en JS + PHP) me permet de ne pas coder moi-même un "upload adapter", ce sera l'objet d'une autre amélioration, et en plus certaines fonctionnalités sont payantes | ||
| 21 | // https://ckeditor.com/docs/ckeditor5/latest/framework/guides/deep-dive/upload-adapter.html | ||
| 22 | // le ckfinder communique avec le serveur au moyen de requêtes AJAX, | ||
| 23 | // le fichier est ainsi téléchargé sur le serveur avant même d'apparaître dans l'éditeur | ||
| 24 | // attention, le ckfinder nécessite php7.3, les extensions GD et FileInfo et le support du type MIME JSON sur le serveur (retenir php7.3 et GD) | ||
| 25 | // https://ckeditor.com/ckfinder/download/ | ||
| 26 | |||
| 27 | // variable $editeurHTML | ||
| 28 | ob_start(); | ||
| 29 | ?> | ||
| 30 | |||
| 31 | <div class="conteneur_article" > | ||
| 32 | <form action="index.php?page=<?= $page_actuelle ?>&article=<?= $numArticle ?>&action=submit" method="post" > | ||
| 33 | <textarea id="editor" name="contenu" ></textarea> | ||
| 34 | |||
| 35 | <?php | ||
| 36 | // falsification de requête inter-site | ||
| 37 | // on ajoute un formulaire caché avec une valeur aléatoire cryptée utilisable une seule fois (=jeton) | ||
| 38 | |||
| 39 | // "Vous pouvez rendre chaque jeton utilisable une seule fois et ainsi éviter de rejouer plusieurs fois la même requête. | ||
| 40 | // Les jetons sont stockés dans le back-office. | ||
| 41 | // Une rotation des jetons est effectuée quand le nombre maximum a été atteint, les plus vieux en premier. | ||
| 42 | // Chaque jeton peut être lié à une URL spécifique. | ||
| 43 | // Si un jeton est intercepté, il ne peut pas être utilisé dans un autre contexte. | ||
| 44 | // Si besoin, les jetons peuvent être attachés à une adresse IP spécifique. | ||
| 45 | // Depuis la version v2.1, les jetons peuvent être réutilisés (par exemple pour les requêtes AJAX). | ||
| 46 | // Si vous n’utilisez pas un framework qui gère la protection CSRF pour vous, jetez un oeil à Anti-CSRF." | ||
| 47 | |||
| 48 | // une bibli qui fait ça: https://github.com/paragonie/anti-csrf | ||
| 49 | ?> | ||
| 50 | |||
| 51 | <input class="boutonSubmitEditeur" type="submit" value="Valider" onclick="envoiDonnees();" /> | ||
| 52 | |||
| 53 | <script> | ||
| 54 | let editor; // variable utilisable depuis une fonction | ||
| 55 | |||
| 56 | // code exécuté à la validation du formulaire | ||
| 57 | function envoiDonnees() | ||
| 58 | { | ||
| 59 | // supprimer le positionnement absolu de l'iframe | ||
| 60 | //~ let balisesIframe = document.getElementsByTagName("iframe"); | ||
| 61 | //~ for(var i = 0; i < balisesIframe.length; i++) | ||
| 62 | //~ { | ||
| 63 | //~ alert(balisesIframe[i].getAttribute("style")); // affiche le CSS | ||
| 64 | //~ balisesIframe[i].removeAttribute("style"); | ||
| 65 | //~ alert(balisesIframe[i].getAttribute("style")); // affiche null | ||
| 66 | //~ } | ||
| 67 | } | ||
| 68 | |||
| 69 | // ATTENTION: si l'éditeur ne fonctionne pas, empêcher qu'on puisse cliquer sur Valider! | ||
| 70 | // Il y a aussi des paramètres dans le fichier de config: ckeditor/webpack.config.js | ||
| 71 | ClassicEditor | ||
| 72 | .create( document.querySelector( '#editor' ),{ | ||
| 73 | language: 'fr', | ||
| 74 | |||
| 75 | // barre d'outils à adapter au build | ||
| 76 | toolbar: { | ||
| 77 | items: [ 'undo', 'redo', 'selectAll', '|', 'heading', '|', 'alignment', 'bulletedList', 'numberedList', 'todoList', 'blockQuote', 'horizontalLine', '-', 'bold', 'italic', 'underline', | ||
| 78 | //'strikethrough', | ||
| 79 | '|', | ||
| 80 | //'fontFamily', | ||
| 81 | 'fontColor', 'fontSize', 'highlight', '|', 'imageInsert', 'link', | ||
| 82 | //'htmlEmbed', | ||
| 83 | //'mediaEmbed', | ||
| 84 | 'insertTable' | ||
| 85 | //'|', 'textPartLanguage' | ||
| 86 | ], | ||
| 87 | // multiligne automatique (le '-' dans la liste permet de choisir l'endroit où couper) | ||
| 88 | shouldNotGroupWhenFull: true | ||
| 89 | |||
| 90 | // noter que 'fontFamily' ne comporte que des polices microsoft => problèmes de droits? | ||
| 91 | // de plus, il faut que le navigateur connaisse toutes les polices | ||
| 92 | }, | ||
| 93 | |||
| 94 | // barre d'outils dans une image | ||
| 95 | image: { | ||
| 96 | toolbar: [ | ||
| 97 | 'imageTextAlternative', | ||
| 98 | 'imageStyle:full', | ||
| 99 | 'imageStyle:side', | ||
| 100 | 'linkImage' | ||
| 101 | ] | ||
| 102 | }, | ||
| 103 | |||
| 104 | // barre d'outils dans un tableau | ||
| 105 | table: { | ||
| 106 | contentToolbar: [ | ||
| 107 | 'tableColumn', | ||
| 108 | 'tableRow', | ||
| 109 | 'mergeTableCells', | ||
| 110 | //'tableCellProperties', | ||
| 111 | 'tableProperties' | ||
| 112 | ] | ||
| 113 | }, | ||
| 114 | |||
| 115 | // plugin code HTML | ||
| 116 | // pour coller le code HTML "embed" proposé par certains sites | ||
| 117 | // | ||
| 118 | |||
| 119 | // media embarqué (audio, vidéo, carte) | ||
| 120 | mediaEmbed: { | ||
| 121 | //previewsInData: true, | ||
| 122 | // vaut "false" par defaut, on crée la balise non standard <oembed url="" > // https://oembed.com/ | ||
| 123 | // qui nécessite un traitement (en JS ou côté serveur) en utilisant le lien à l'intérieur | ||
| 124 | // avec "true", on crée la balise <iframe> qui sert à insérer une page HTML dans une autre, | ||
| 125 | // notre "embarquement de média" devrit donc réussir quelque soit le site | ||
| 126 | // c'est plus simple, il ne reste plus qu'à ajuster le contenu avec du CSS (important) | ||
| 127 | // on doit supprimer le positionnement absolu qui fait que l'iframe se place par dessus le reste et adapter la taille de l'élément | ||
| 128 | |||
| 129 | // en outre, le plugin mediaEmbed (dans l'éditeur), tout comme la balise "iframe" (hors éditeur), | ||
| 130 | // permettent d'afficher un aperçu (preview): une image avec un bouton lecture dessus | ||
| 131 | // cette image est envoyée imédiatement par le serveur, et le contenu après un clic dessus | ||
| 132 | // | ||
| 133 | }, | ||
| 134 | |||
| 135 | // images | ||
| 136 | // https://ckeditor.com/docs/ckeditor5/latest/features/image-upload/simple-upload-adapter.html | ||
| 137 | // le plugin "image upload" s'occupe est la partie graphique, il crée un objet "createLoader", | ||
| 138 | // le plugin "simple upload adapter" est la classe qui communique avec le serveur au moyen de requêtes AJAX | ||
| 139 | // il attend du serveur une réponse au format .json contenant l'adresse où est stockée l'image: | ||
| 140 | //{ | ||
| 141 | // "url": "https://example.com/images/foo.jpg" | ||
| 142 | //} | ||
| 143 | // cette url sert à deux choses: | ||
| 144 | // - à télécharger l'image avant de la placer dans l'éditeur | ||
| 145 | // - écrire le HTML qu'on enregistrera ensuite | ||
| 146 | // en effet, le fichier est téléchargé sur le serveur avant de revenir dans l'éditeur comme un téléchargement classique | ||
| 147 | |||
| 148 | simpleUpload: { | ||
| 149 | uploadUrl: 'imageAJAX.php?page=<?= $page_actuelle ?>', | ||
| 150 | // noter qu'il est possible (parce que souhaitable je ne pense pas) d'envoyer une requête AJAX | ||
| 151 | // en indiquant une adresse "statique" du type: fichier.txt ou .xml, jpg, png, etc | ||
| 152 | |||
| 153 | // Headers supplémentaires envoyés avec la requête | ||
| 154 | // c'est ici qu'on installe les mécanismes de sécurités comme l'authentification et la protection au CSRF | ||
| 155 | headers: { | ||
| 156 | 'X-CSRF-TOKEN': 'CSRF-Token', | ||
| 157 | Authorization: 'Bearer <JSON Web Token>' | ||
| 158 | } | ||
| 159 | }, | ||
| 160 | // formats acceptés par défaut: jpeg, png, gif, bmp, webp, tiff | ||
| 161 | // 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 | ||
| 162 | |||
| 163 | // ce plugin a l'intérêt de ne pas imposer l'utilisation de l'extension GD de PHP, | ||
| 164 | // Reste qu'il sera quand même intéressant de l'ajouter pour le redimensionnement des images trop lourdes, | ||
| 165 | // quoi que le système d'onglets (limiter l'affichge à 5 ou 10 articles par page) règle aussi le problème d'une autre manière | ||
| 166 | |||
| 167 | |||
| 168 | // plugin autosave | ||
| 169 | } ) | ||
| 170 | |||
| 171 | .then( newEditor => { | ||
| 172 | editor = newEditor; | ||
| 173 | |||
| 174 | // obtenir la liste des éléments disponibles pour la barre d'outils | ||
| 175 | //alert(Array.from( editor.ui.componentFactory.names() )); | ||
| 176 | // obtenir la liste des plugins disponibles: | ||
| 177 | //alert(ClassicEditor.builtinPlugins.map( plugin => plugin.pluginName )); | ||
| 178 | |||
| 179 | var initial = '<?= $initial ?>'; | ||
| 180 | editor.setData(initial); | ||
| 181 | } ) | ||
| 182 | .catch( error => { | ||
| 183 | console.error( error ); | ||
| 184 | } ); | ||
| 185 | </script> | ||
| 186 | </form> | ||
| 187 | </div> | ||
| 188 | <?php | ||
| 189 | $editeurHTML = ob_get_clean(); \ No newline at end of file | ||
diff --git a/view/template.php b/view/template.php new file mode 100644 index 0000000..772b0b1 --- /dev/null +++ b/view/template.php | |||
| @@ -0,0 +1,90 @@ | |||
| 1 | <!DOCTYPE html> | ||
| 2 | |||
| 3 | <html lang="fr" > | ||
| 4 | <head> | ||
| 5 | <meta charset="utf-8" /> | ||
| 6 | <title><?= $title ?></title> | ||
| 7 | |||
| 8 | <!-- partie que Melaine doit écrire --> | ||
| 9 | <meta name="description" content="" /> | ||
| 10 | |||
| 11 | <!-- <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> --> | ||
| 12 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > | ||
| 13 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> | ||
| 14 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> | ||
| 15 | <?php | ||
| 16 | if(isset($css)) // fichiers CSS supplémentaires | ||
| 17 | { | ||
| 18 | echo($css); | ||
| 19 | } | ||
| 20 | |||
| 21 | if(isset($js)) // fonctions dans main.js puis appel des fonctions | ||
| 22 | { | ||
| 23 | echo($js); | ||
| 24 | } | ||
| 25 | ?> | ||
| 26 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||
| 27 | </head> | ||
| 28 | |||
| 29 | <body> | ||
| 30 | <div id="bloc_page" > | ||
| 31 | <?php | ||
| 32 | echo "\n"; | ||
| 33 | require("view/nav.php"); | ||
| 34 | echo "\n"; | ||
| 35 | |||
| 36 | // variables obtenues avec le buffer | ||
| 37 | echo($header); | ||
| 38 | ?> | ||
| 39 | |||
| 40 | <div id="contenu" > | ||
| 41 | <?php | ||
| 42 | echo($content); | ||
| 43 | ?> | ||
| 44 | </div> | ||
| 45 | <?php | ||
| 46 | |||
| 47 | // section courriel sur toutes les pages sauf accueil | ||
| 48 | if($page_actuelle != "accueil") | ||
| 49 | { | ||
| 50 | echo "\n"; | ||
| 51 | require("view/courriel.php"); | ||
| 52 | echo "\n\n"; | ||
| 53 | } | ||
| 54 | |||
| 55 | // lien vers le mode admin | ||
| 56 | if($_SESSION['admin'] == 0) | ||
| 57 | { | ||
| 58 | ?> | ||
| 59 | <div id="lienModeAdmin" > | ||
| 60 | <p><a href="index.php?page=connexion&from=<?= $page_actuelle ?>" >Mode Administrateur</a></p> | ||
| 61 | </div> | ||
| 62 | <?php | ||
| 63 | } | ||
| 64 | |||
| 65 | // actions en mode admin | ||
| 66 | if($_SESSION['admin'] == 1) | ||
| 67 | { | ||
| 68 | ?> | ||
| 69 | <!-- zone superposée par les commande du mode admin --> | ||
| 70 | <div class="zoneVideAdmin" ></div> | ||
| 71 | |||
| 72 | <div id="modeAdmin" > | ||
| 73 | <p>Vous êtes en mode administrateur. | ||
| 74 | <a href="index.php?action=deconnexion" >Déconnexion</a></p> | ||
| 75 | <div> | ||
| 76 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=nouveau_mdp" > | ||
| 77 | Changer le mot de passe de connexion.</a></p> | ||
| 78 | <p><a href="melainePHP.zip" > | ||
| 79 | Télécharger le code PHP pour migration.</a></p> | ||
| 80 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=extraction" > | ||
| 81 | Extraire les données de tout le site.</a></p> | ||
| 82 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=insertion" >Restauration des données avec une sauvegarde.</a></p> | ||
| 83 | </div> | ||
| 84 | </div> | ||
| 85 | <?php | ||
| 86 | } | ||
| 87 | ?> | ||
| 88 | </div> | ||
| 89 | </body> | ||
| 90 | </html> \ No newline at end of file | ||
