diff options
author | polo <ordipolo@gmx.fr> | 2022-02-17 18:13:00 +0100 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2022-02-17 18:13:00 +0100 |
commit | 787d03e48471ba62cd830379428f04d996f0b74b (patch) | |
tree | e9f98c7b9288c4530b50985688dd82622106ba2d /view | |
parent | 29df6f1362745eabf4fbcaedf309eb63795152fa (diff) | |
download | melaine-787d03e48471ba62cd830379428f04d996f0b74b.zip |
model update
Diffstat (limited to 'view')
-rw-r--r-- | view/accueil.php | 46 | ||||
-rw-r--r-- | view/album.php | 9 | ||||
-rw-r--r-- | view/courriel.php | 18 | ||||
-rw-r--r-- | view/discographie.php | 103 | ||||
-rw-r--r-- | view/melaine.php | 255 | ||||
-rw-r--r-- | view/menu.php | 146 | ||||
-rw-r--r-- | view/nav.php | 24 | ||||
-rw-r--r-- | view/password.php | 212 | ||||
-rw-r--r-- | view/template-formulaires.php | 375 | ||||
-rw-r--r-- | view/template.php | 182 |
10 files changed, 699 insertions, 671 deletions
diff --git a/view/accueil.php b/view/accueil.php index a7b6b71..10e107f 100644 --- a/view/accueil.php +++ b/view/accueil.php | |||
@@ -1,24 +1,24 @@ | |||
1 | <?php | 1 | <?php |
2 | // view/accueil.php | 2 | // view/accueil.php |
3 | 3 | ||
4 | // variable $js | 4 | // variable $js |
5 | ob_start(); | 5 | ob_start(); |
6 | ?> | 6 | ?> |
7 | <script type="text/javascript" src="public/main.js" ></script> | 7 | <script type="text/javascript" src="public/main.js" ></script> |
8 | <script type="text/javascript" >versMenu();</script> | 8 | <script type="text/javascript" >versMenu();</script> |
9 | <?php | 9 | <?php |
10 | $js = ob_get_clean(); | 10 | $js = ob_get_clean(); |
11 | 11 | ||
12 | // variable $header | 12 | // variable $header |
13 | ob_start(); | 13 | ob_start(); |
14 | echo "\n\n"; | 14 | echo "\n\n"; |
15 | ?> | 15 | ?> |
16 | <header> | 16 | <header> |
17 | <a class="no_underline" href="index.php?page=menu" > | 17 | <a class="no_underline" href="index.php?page=menu" > |
18 | <div id="bienvenue" > | 18 | <div id="bienvenue" > |
19 | <span class="police_titre" >Bienvenue sur le site de</span> | 19 | <span class="police_titre" >Bienvenue sur le site de</span> |
20 | </div> | 20 | </div> |
21 | </a> | 21 | </a> |
22 | </header> | 22 | </header> |
23 | <?php | 23 | <?php |
24 | $header = ob_get_clean(); \ No newline at end of file | 24 | $header = ob_get_clean(); \ No newline at end of file |
diff --git a/view/album.php b/view/album.php index 921efaf..783cfab 100644 --- a/view/album.php +++ b/view/album.php | |||
@@ -2,7 +2,7 @@ | |||
2 | // view/album.php | 2 | // view/album.php |
3 | 3 | ||
4 | // variable $css | 4 | // variable $css |
5 | // avec discographie.css | 5 | // utilise discographie.css |
6 | ob_start(); | 6 | ob_start(); |
7 | ?> | 7 | ?> |
8 | <link rel="stylesheet" type="text/css" href="public/discographie.css" /> | 8 | <link rel="stylesheet" type="text/css" href="public/discographie.css" /> |
@@ -10,6 +10,13 @@ ob_start(); | |||
10 | <?php | 10 | <?php |
11 | $css = ob_get_clean(); | 11 | $css = ob_get_clean(); |
12 | 12 | ||
13 | // variable $js | ||
14 | ob_start(); | ||
15 | ?> | ||
16 | <script type="text/javascript" src="public/main.js" ></script> | ||
17 | <?php | ||
18 | $js = ob_get_clean(); | ||
19 | |||
13 | // variable $header | 20 | // variable $header |
14 | ob_start(); | 21 | ob_start(); |
15 | echo "\n"; | 22 | echo "\n"; |
diff --git a/view/courriel.php b/view/courriel.php index ed5fe79..be3b1d7 100644 --- a/view/courriel.php +++ b/view/courriel.php | |||
@@ -1,10 +1,10 @@ | |||
1 | <div id="courriel" > | 1 | <div id="courriel" > |
2 | <div> | 2 | <div> |
3 | <img src="public/timbre.png" alt="" ><br />Envoyez-moi un courriel à: <img src="public/courriel.png" > | 3 | <img src="public/timbre.png" alt="" ><br />Envoyez-moi un courriel à: <img src="public/courriel.png" > |
4 | </div> | 4 | </div> |
5 | 5 | ||
6 | <div id="courrielJS" > | 6 | <div id="courrielJS" > |
7 | <button onclick="clientCourriel();" >Avec mon logiciel<br />de messagerie</button> | 7 | <button onclick="clientCourriel();" >Avec mon logiciel<br />de messagerie</button> |
8 | <button onclick="copierAdresse();" >Copier l'adresse dans<br />le presse-papier</button> | 8 | <button onclick="copierAdresse();" >Copier l'adresse dans<br />le presse-papier</button> |
9 | </div> | 9 | </div> |
10 | </div> \ No newline at end of file | 10 | </div> \ No newline at end of file |
diff --git a/view/discographie.php b/view/discographie.php index d9bc6be..6d56854 100644 --- a/view/discographie.php +++ b/view/discographie.php | |||
@@ -10,7 +10,7 @@ ob_start(); | |||
10 | $css = ob_get_clean(); | 10 | $css = ob_get_clean(); |
11 | 11 | ||
12 | 12 | ||
13 | //variable $js | 13 | // variable $js |
14 | ob_start(); | 14 | ob_start(); |
15 | ?> | 15 | ?> |
16 | <script type="text/javascript" src="public/main.js" ></script> | 16 | <script type="text/javascript" src="public/main.js" ></script> |
@@ -43,41 +43,45 @@ $header = ob_get_clean(); | |||
43 | // variable $content | 43 | // variable $content |
44 | ob_start(); | 44 | ob_start(); |
45 | ?> | 45 | ?> |
46 | <aside> | 46 | <aside> |
47 | <div> | 47 | <div> |
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 | <?php | 51 | <?php |
52 | for($i = count($albumsJSON) - 1; $i >= 0; $i--) | 52 | //for($i = $Albums->fileListCount - 1; $i >= 0; $i--) |
53 | //for($i = 0; $i < count($albumsJSON); $i++) | 53 | for($i = 0; $i < $Albums->fileListCount; $i++) |
54 | //foreach($albumsJSON as $oneAlbum) | 54 | //foreach($albumsJSON as $oneAlbum) |
55 | { | 55 | { |
56 | // menu dessous la mouette | 56 | // menu dessous la mouette |
57 | // comporte un lien si fichier html existe, sinon une ancre | 57 | // comporte un lien si fichier html existe, sinon une ancre |
58 | ?> | 58 | ?> |
59 | <p><a class="<?= $linkDiscoChrono[$i] ?>" href="index.php?<?= $lienAlbum[$i] ?>" ><?= $albumsJSON[$i][1] ?> - <?= $albumsJSON[$i][0] ?></a></p> | 59 | <p><a class="<?= $linkDiscoChrono[$i] ?>" href="index.php?<?= $lienAlbum[$i] ?>" ><?= $Albums->fileList[$i]['annee'] ?> - <?= $Albums->fileList[$i]['titre'] ?></a></p> |
60 | <?php | 60 | <?php |
61 | } | 61 | } |
62 | ?> | 62 | ?> |
63 | </div> | 63 | </div> |
64 | </div> | 64 | </div> |
65 | </aside> | 65 | </aside> |
66 | <section> | 66 | <section> |
67 | <?php | 67 | <?php |
68 | // éditeur ou bouton "Nouvel album" | 68 | // éditeur ou bouton "Nouvel album" |
69 | if($_SESSION['admin'] == 1) | 69 | if($_SESSION['admin'] == 1) |
70 | { | 70 | { |
71 | if(isset($_GET['action']) && $_GET['action'] == 'edition' && $albumCode == '') | 71 | if(isset($_GET['action']) && $_GET['action'] == 'edition' && $fileCode == '') |
72 | { | 72 | { |
73 | $style = 'class="articleAvecEditeur"'; | ||
73 | ?> | 74 | ?> |
74 | <h3>Ajouter un album</h3> | 75 | <article <?= $style ?>> |
76 | <h3>Ajouter un album</h3> | ||
75 | <?= $editeurHTML ?> | 77 | <?= $editeurHTML ?> |
76 | <?php | 78 | <?php |
77 | } | 79 | } |
78 | else | 80 | else |
79 | { | 81 | { |
82 | $style = ''; | ||
80 | ?> | 83 | ?> |
84 | <article> | ||
81 | <p class="boutonAlbum" > | 85 | <p class="boutonAlbum" > |
82 | <a href="index.php?page=discographie&action=edition" > | 86 | <a href="index.php?page=discographie&action=edition" > |
83 | Nouvel album | 87 | Nouvel album |
@@ -86,15 +90,31 @@ if($_SESSION['admin'] == 1) | |||
86 | <?php | 90 | <?php |
87 | } | 91 | } |
88 | } | 92 | } |
93 | ?> | ||
94 | </article> | ||
95 | <div id="articles"> | ||
96 | <?php | ||
89 | 97 | ||
90 | // tableau des albums | 98 | // tableau des albums |
91 | for($i = count($albumsJSON) - 1; $i >= 0; $i--) | 99 | //for($i = $Albums->fileListCount - 1; $i >= 0; $i--) |
92 | //for($i = 0; $i < count($albumsJSON); $i++) | 100 | for($i = 0; $i < $Albums->fileListCount; $i++) |
93 | { | 101 | { |
102 | // article modifié sur fond coloré | ||
103 | if(isset($fileCode) && $Albums->fileList[$i]['fileCode'] == $fileCode) | ||
104 | { | ||
105 | $style = 'class="articleAvecEditeur"'; | ||
106 | } | ||
107 | else | ||
108 | { | ||
109 | $style = 'class="articleSansEditeur"'; | ||
110 | } | ||
111 | ?> | ||
112 | <article id="<?= $Albums->fileList[$i]['fileCode'] ?>" <?= $style ?>> | ||
113 | <?php | ||
94 | // formulaires et éditeur | 114 | // formulaires et éditeur |
95 | // comparer le GET avec $albumsJSON[3] | 115 | if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 |
96 | if(isset($_GET['action']) && $_GET['action'] == 'edition' | 116 | && isset($_GET['action']) && $_GET['action'] == 'edition' |
97 | && $albumsJSON[$i][3] == $_GET['album_code']) | 117 | && $Albums->fileList[$i]['fileCode'] == $fileCode) |
98 | { | 118 | { |
99 | ?> | 119 | ?> |
100 | <h3>Modifier un album</h3> | 120 | <h3>Modifier un album</h3> |
@@ -104,53 +124,54 @@ for($i = count($albumsJSON) - 1; $i >= 0; $i--) | |||
104 | // affichage normal | 124 | // affichage normal |
105 | else | 125 | else |
106 | { | 126 | { |
107 | ?> | ||
108 | <article id="<?= $albumsJSON[$i][0] ?>" > | ||
109 | <?php | ||
110 | // mettre une adresse lorsqu'un fichier html existe | 127 | // mettre une adresse lorsqu'un fichier html existe |
111 | if($avecLien[$i]) | 128 | if($avecLien[$i]) |
112 | { | 129 | { |
113 | ?> | 130 | ?> |
114 | <a href="index.php?<?= $lienAlbum[$i] ?>" > | 131 | <a href="index.php?<?= $lienAlbum[$i] ?>" > |
115 | <?php | 132 | <?php |
116 | } | 133 | } |
117 | ?> | 134 | ?> |
118 | <figure> | 135 | <figure> |
119 | <img class="vignette" src="data/discographie/images/<?= $albumsJSON[$i][2] ?>" alt="" > | 136 | <img class="vignette" src="data/discographie/images/<?= $Albums->fileList[$i]['pochette'] ?>" alt="" > |
120 | <figcaption><?= $albumsJSON[$i][0] ?><br><?= $albumsJSON[$i][1] ?></figcaption> | 137 | <figcaption><?= $Albums->fileList[$i]['titre'] ?><br><?= $Albums->fileList[$i]['annee'] ?></figcaption> |
121 | </figure> | 138 | </figure> |
122 | <?php | 139 | <?php |
123 | if($avecLien[$i]) | 140 | if($avecLien[$i]) |
124 | { | 141 | { |
125 | ?> | 142 | ?> |
126 | </a> | 143 | </a> |
127 | <?php | 144 | <?php |
128 | } | 145 | } |
129 | // bouton | 146 | // bouton |
130 | if($_SESSION['admin'] == 1) | 147 | if($_SESSION['admin'] == 1) |
131 | { | 148 | { |
132 | ?> | 149 | ?> |
133 | <p> | 150 | <p> |
134 | <a href="index.php?<?= $lienBoutonModif[$i] ?>" > | 151 | <a href="index.php?<?= $lienBoutonModif[$i] ?>" > |
135 | Modifier cet article | 152 | Modifier l'album |
136 | </a> | 153 | </a> |
137 | <!-- un espace --> | 154 | <!-- --><!-- un espace --> |
138 | <a href="index.php?page=discographie&action=suppression&album_code=<?= $albumsJSON[$i][3] ?>" onclick="confirmerSuppression()" > | 155 | <a href="index.php?page=discographie&action=suppression&file_code=<?= $Albums->fileList[$i]['fileCode'] ?>" onclick="confirmerSuppression()" > |
139 | Supprimer cet article | 156 | <img src="public/icone_supprimer.png" > |
140 | </a> | 157 | </a> |
141 | </p> | 158 | </p> |
142 | <?php | 159 | <?php |
143 | } | 160 | } |
144 | ?> | 161 | ?> |
145 | </article> | 162 | <!-- </article> --> |
146 | <?php | 163 | <?php |
147 | 164 | ||
148 | // bouton pour modifier | 165 | // bouton pour modifier |
149 | if($_SESSION['admin'] == 1) | 166 | if($_SESSION['admin'] == 1) |
150 | {} | 167 | {} |
151 | } | 168 | } |
169 | ?> | ||
170 | </article> | ||
171 | <?php | ||
152 | } | 172 | } |
153 | ?> | 173 | ?> |
154 | </section> | 174 | </div> |
175 | </section> | ||
155 | <?php | 176 | <?php |
156 | $content = ob_get_clean(); | 177 | $content = ob_get_clean(); |
diff --git a/view/melaine.php b/view/melaine.php index 216857d..2325f5c 100644 --- a/view/melaine.php +++ b/view/melaine.php | |||
@@ -1,117 +1,138 @@ | |||
1 | <?php | 1 | <?php |
2 | // view/melaine.php | 2 | // view/melaine.php |
3 | 3 | ||
4 | // variable $css | 4 | // variable $css |
5 | ob_start(); | 5 | ob_start(); |
6 | ?> | 6 | ?> |
7 | <link rel="stylesheet" type="text/css" href="public/<?= $page_actuelle ?>.css" /> | 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" /> | 8 | <link rel="stylesheet" type="text/css" href="public/donnees_hors_editeur.css" /> |
9 | <?php | 9 | <?php |
10 | $css = ob_get_clean(); | 10 | $css = ob_get_clean(); |
11 | 11 | ||
12 | 12 | ||
13 | //variable $js | 13 | //variable $js |
14 | ob_start(); | 14 | ob_start(); |
15 | ?> | 15 | ?> |
16 | <script type="text/javascript" src="public/main.js" ></script> | 16 | <script type="text/javascript" src="public/main.js" ></script> |
17 | <?php | 17 | <?php |
18 | if(isset($_GET['action']) && $_GET['action'] == 'editor') | 18 | if(isset($_GET['action']) && $_GET['action'] == 'editor') |
19 | { | 19 | { |
20 | 20 | ||
21 | // bibliothèques JS ckeditor | 21 | // bibliothèques JS ckeditor |
22 | ?> | 22 | ?> |
23 | <script src="lib/ckeditor5/build/ckeditor.js"></script> | 23 | <script src="lib/ckeditor5/build/ckeditor.js"></script> |
24 | <?php | 24 | <?php |
25 | } | 25 | } |
26 | $js = ob_get_clean(); | 26 | $js = ob_get_clean(); |
27 | 27 | ||
28 | 28 | ||
29 | // variable $header | 29 | // variable $header |
30 | ob_start(); | 30 | ob_start(); |
31 | echo "\n"; | 31 | echo "\n"; |
32 | ?> | 32 | ?> |
33 | <header> | 33 | <header> |
34 | <div id="titre" > | 34 | <div id="titre" > |
35 | <span class="police_titre" >Melaine Favennec</span> | 35 | <span class="police_titre" >Melaine Favennec</span> |
36 | </div> | 36 | </div> |
37 | <div id="photo" ></div> | 37 | <div id="photo" ></div> |
38 | </header> | 38 | </header> |
39 | <?php | 39 | <?php |
40 | $header = ob_get_clean(); | 40 | $header = ob_get_clean(); |
41 | 41 | ||
42 | 42 | ||
43 | // variable $content | 43 | // variable $content |
44 | ob_start(); | 44 | ob_start(); |
45 | if($_SESSION['admin'] == 1) | 45 | if($_SESSION['admin'] == 1) |
46 | { | 46 | { |
47 | // à la place du bouton après rechargement | 47 | // à la place du bouton après rechargement |
48 | if(isset($_GET['action']) && $_GET['action'] == 'editor' && !isset($_GET['article'])) | 48 | if(isset($_GET['action']) && $_GET['action'] == 'editor' && !isset($_GET['file_code'])) |
49 | { | 49 | { |
50 | echo("<p>Rédiger un nouvel article</p>"); | 50 | $style = 'class="articleAvecEditeur"'; |
51 | echo($editeurHTML); // injection de template-editor.php | 51 | ?> |
52 | } | 52 | <div <?= $style ?>> |
53 | 53 | <h3>Rédiger un nouvel article</h3> | |
54 | // bouton | 54 | <?php |
55 | else | 55 | |
56 | { | 56 | |
57 | ?> | 57 | echo($editeurHTML); // injection de template-editor.php |
58 | <p class="boutonArticle" > | 58 | } |
59 | <a href="index.php?page=melaine&action=editor" > | 59 | |
60 | Nouvel article | 60 | // bouton |
61 | </a> | 61 | else |
62 | </p> | 62 | { |
63 | <?php | 63 | ?> |
64 | } | 64 | <div> |
65 | } | 65 | <p class="boutonArticle" > |
66 | 66 | <a href="index.php?page=melaine&action=editor" > | |
67 | // on pourrait paginer avec des onglets contenant 5 ou 10 articles chacun | 67 | Nouvel article |
68 | 68 | </a> | |
69 | // tableau articles[] du dernier au premier (1 case = 1 article) | 69 | </p> |
70 | $j = count($articles); | 70 | <?php |
71 | foreach ($articles as $article) | 71 | } |
72 | { | 72 | ?> |
73 | // la div invisible sert à la compensation des liens d'ancre # | 73 | </div> |
74 | ?> | 74 | <?php |
75 | <div class="zoneVideNav" ></div> | 75 | } |
76 | <article id="article<?= $j ?>" > | 76 | |
77 | <?php | 77 | // on pourrait paginer avec des onglets de par exemple 10 articles |
78 | 78 | ||
79 | // remplacer un article par l'éditeur | 79 | // tableau articles[] du plus récent au plus ancien |
80 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['article']) && $_GET['article'] == $j) | 80 | for($i = 0; $i < $Articles->fileListCount; $i++) |
81 | { | 81 | { |
82 | // on pourrait utiliser le timedate, ou encore le nom de l'article | 82 | // la div invisible sert à la compensation des liens d'ancre # |
83 | echo("<p>Modification d'un article</p>"); | 83 | |
84 | echo "\n"; | 84 | // article modifié sur fond coloré |
85 | 85 | if(isset($fileCode) && $Articles->fileList[$i]['fileCode'] == $fileCode) | |
86 | echo($editeurHTML); // injection de template-editor.php | 86 | { |
87 | } | 87 | $style = 'class="articleAvecEditeur"'; |
88 | 88 | } | |
89 | // placer un article | 89 | else |
90 | else | 90 | { |
91 | { | 91 | $style = ''; |
92 | // et voila | 92 | } |
93 | echo($article . "\n"); | 93 | ?> |
94 | 94 | <div class="zoneVideNav" ></div> | |
95 | // bouton | 95 | <article id="<?= $Articles->fileList[$i]['fileCode'] ?>"> |
96 | if($_SESSION['admin'] == 1) | 96 | <div <?= $style ?>> |
97 | { | 97 | <?php |
98 | ?> | 98 | |
99 | <p class="boutonArticle" > | 99 | // remplacer un article par l'éditeur |
100 | <a href="index.php?page=melaine&action=editor&article=<?= $j ?>#article<?= $j ?>" > | 100 | if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['file_code']) |
101 | Modifier cet article | 101 | && $_GET['file_code'] == $Articles->fileList[$i]['fileCode'] |
102 | </a> | 102 | ) |
103 | <!-- un espace --> | 103 | { |
104 | <a href="index.php?page=melaine&action=suppression&article=<?= $j ?>" onclick="confirmerSuppression()" > | 104 | // on pourrait utiliser ici le timedate, ou encore le nom de l'article |
105 | Supprimer cet article | 105 | ?> |
106 | </a> | 106 | <h3>Modification d'un article</h3> |
107 | </p> | 107 | <?php |
108 | <?php | 108 | echo($editeurHTML); // injection de template-editor.php |
109 | } | 109 | } |
110 | } | 110 | |
111 | 111 | // placer un article | |
112 | ?> | 112 | else |
113 | </article> | 113 | { |
114 | <?php | 114 | // et voila |
115 | $j--; | 115 | echo($Articles->fileList[$i]['content'] . "\n"); |
116 | } | 116 | |
117 | $content = ob_get_clean(); | 117 | // bouton |
118 | if($_SESSION['admin'] == 1) | ||
119 | { | ||
120 | ?> | ||
121 | <p class="boutonArticle" > | ||
122 | <a href="index.php?page=melaine&action=editor&file_code=<?= $Articles->fileList[$i]['fileCode'] ?>#<?= $Articles->fileList[$i]['fileCode'] ?>" > | ||
123 | Modifier cet article | ||
124 | </a> | ||
125 | <!-- un espace --> | ||
126 | <a href="index.php?page=melaine&action=suppression&file_code=<?= $Articles->fileList[$i]['fileCode'] ?>" onclick="confirmerSuppression()" > | ||
127 | Supprimer cet article | ||
128 | </a> | ||
129 | </p> | ||
130 | <?php | ||
131 | } | ||
132 | } | ||
133 | ?> | ||
134 | </div> | ||
135 | </article> | ||
136 | <?php | ||
137 | } | ||
138 | $content = ob_get_clean(); | ||
diff --git a/view/menu.php b/view/menu.php index 51476b4..c20acf9 100644 --- a/view/menu.php +++ b/view/menu.php | |||
@@ -1,74 +1,74 @@ | |||
1 | <?php | 1 | <?php |
2 | // view/menu.php | 2 | // view/menu.php |
3 | 3 | ||
4 | // variable $css | 4 | // variable $css |
5 | ob_start(); | 5 | ob_start(); |
6 | ?> | 6 | ?> |
7 | <link rel="stylesheet" type="text/css" href="public/<?= $page_actuelle ?>.css" /> | 7 | <link rel="stylesheet" type="text/css" href="public/<?= $page_actuelle ?>.css" /> |
8 | <?php | 8 | <?php |
9 | $css = ob_get_clean(); | 9 | $css = ob_get_clean(); |
10 | 10 | ||
11 | //variable $js | 11 | //variable $js |
12 | ob_start(); | 12 | ob_start(); |
13 | ?> | 13 | ?> |
14 | <script type="text/javascript" src="public/main.js" ></script> | 14 | <script type="text/javascript" src="public/main.js" ></script> |
15 | <?php | 15 | <?php |
16 | $js = ob_get_clean(); | 16 | $js = ob_get_clean(); |
17 | 17 | ||
18 | // variable $header | 18 | // variable $header |
19 | ob_start(); | 19 | ob_start(); |
20 | echo "\n\n"; | 20 | echo "\n\n"; |
21 | ?> | 21 | ?> |
22 | <header> | 22 | <header> |
23 | <div id="titre" > | 23 | <div id="titre" > |
24 | <span class="police_titre" >Choisissez une rubrique</span> | 24 | <span class="police_titre" >Choisissez une rubrique</span> |
25 | </div> | 25 | </div> |
26 | </header> | 26 | </header> |
27 | <?php | 27 | <?php |
28 | $header = ob_get_clean(); | 28 | $header = ob_get_clean(); |
29 | 29 | ||
30 | // variable $content | 30 | // variable $content |
31 | ob_start(); | 31 | ob_start(); |
32 | echo "\n"; | 32 | echo "\n"; |
33 | ?> | 33 | ?> |
34 | <div id="contenu" > | 34 | <div id="contenu" > |
35 | <div id="colonne1" > | 35 | <div id="colonne1" > |
36 | <a href="index.php?page=liens" > | 36 | <a href="index.php?page=liens" > |
37 | <div id="canoe" ></div> | 37 | <div id="canoe" ></div> |
38 | </a> | 38 | </a> |
39 | 39 | ||
40 | <a href="index.php?page=presse" > | 40 | <a href="index.php?page=presse" > |
41 | <div id="fille_qui_tombe" ></div> | 41 | <div id="fille_qui_tombe" ></div> |
42 | </a> | 42 | </a> |
43 | 43 | ||
44 | <a href="index.php?page=melaine" > | 44 | <a href="index.php?page=melaine" > |
45 | <div id="pochette" ></div> | 45 | <div id="pochette" ></div> |
46 | </a> | 46 | </a> |
47 | 47 | ||
48 | <a href="index.php?page=ateliers" > | 48 | <a href="index.php?page=ateliers" > |
49 | <div id="cavalier" ></div> | 49 | <div id="cavalier" ></div> |
50 | </a> | 50 | </a> |
51 | 51 | ||
52 | <a href="index.php" > | 52 | <a href="index.php" > |
53 | <div id="pommes" ></div> | 53 | <div id="pommes" ></div> |
54 | </a> | 54 | </a> |
55 | </div> | 55 | </div> |
56 | 56 | ||
57 | <div id="colonne2" > | 57 | <div id="colonne2" > |
58 | <a href="index.php?page=concerts" > | 58 | <a href="index.php?page=concerts" > |
59 | <div id="sirene" ></div> | 59 | <div id="sirene" ></div> |
60 | </a> | 60 | </a> |
61 | 61 | ||
62 | <a href="index.php?page=peinture" > | 62 | <a href="index.php?page=peinture" > |
63 | <div id="mouette_ocean" ></div> | 63 | <div id="mouette_ocean" ></div> |
64 | </a> | 64 | </a> |
65 | 65 | ||
66 | <a href="index.php?page=archives" > | 66 | <a href="index.php?page=archives" > |
67 | <div id="blonde"></div> | 67 | <div id="blonde"></div> |
68 | </a> | 68 | </a> |
69 | 69 | ||
70 | <a id="hey_ho" href="index.php?page=discographie" ></a> | 70 | <a id="hey_ho" href="index.php?page=discographie" ></a> |
71 | </div> | 71 | </div> |
72 | </div> | 72 | </div> |
73 | <?php | 73 | <?php |
74 | $content = ob_get_clean(); \ No newline at end of file | 74 | $content = ob_get_clean(); \ No newline at end of file |
diff --git a/view/nav.php b/view/nav.php index 80d73b9..40be1cb 100644 --- a/view/nav.php +++ b/view/nav.php | |||
@@ -1,13 +1,13 @@ | |||
1 | <nav> | 1 | <nav> |
2 | <ul id="ul_menu"> | 2 | <ul id="ul_menu"> |
3 | <li><a href="index.php?page=menu" <?php if($page_actuelle == "menu") {echo('id="actuelle" ');} ?>>Menu</a></li> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 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> | 11 | <li><a href="index.php?page=archives" <?php if($page_actuelle == "archives") {echo('id="actuelle" ');} ?>>Archives</a></li> |
12 | </ul> | 12 | </ul> |
13 | </nav> \ No newline at end of file | 13 | </nav> \ No newline at end of file |
diff --git a/view/password.php b/view/password.php index c315610..2dabcdd 100644 --- a/view/password.php +++ b/view/password.php | |||
@@ -1,107 +1,107 @@ | |||
1 | <?php | 1 | <?php |
2 | // view/password.php | 2 | // view/password.php |
3 | // | 3 | // |
4 | // ce fichier contient le HTML de deux pages du site: | 4 | // ce fichier contient le HTML de deux pages du site: |
5 | // - connexion au mode admin | 5 | // - connexion au mode admin |
6 | // - changement de mot de passe | 6 | // - changement de mot de passe |
7 | 7 | ||
8 | // formulaire création du mot de passe | 8 | // formulaire création du mot de passe |
9 | ob_start(); | 9 | ob_start(); |
10 | ?> | 10 | ?> |
11 | <form class="connexionFormulaire" method="post" action="index.php" > | 11 | <form class="connexionFormulaire" method="post" action="index.php" > |
12 | <label for="motdepasse" >Mot de passe:</label> | 12 | <label for="motdepasse" >Mot de passe:</label> |
13 | <input type="password" name="motdepasse" autofocus required > | 13 | <input type="password" name="motdepasse" autofocus required > |
14 | <input type="submit" value="Valider" > | 14 | <input type="submit" value="Valider" > |
15 | </form> | 15 | </form> |
16 | <?php | 16 | <?php |
17 | $formulaireNouveauMDP = ob_get_clean(); | 17 | $formulaireNouveauMDP = ob_get_clean(); |
18 | 18 | ||
19 | // formulaire connexion | 19 | // formulaire connexion |
20 | ob_start(); | 20 | ob_start(); |
21 | ?> | 21 | ?> |
22 | <form class="connexionFormulaire" method="post" action="index.php?page=connexion&from=<?= $_GET['from'] ?>" > | 22 | <form class="connexionFormulaire" method="post" action="index.php?page=connexion&from=<?= $_GET['from'] ?>" > |
23 | <label for="motdepasse" >Mot de passe:</label> | 23 | <label for="motdepasse" >Mot de passe:</label> |
24 | <input type="password" name="motdepasse" autofocus required > | 24 | <input type="password" name="motdepasse" autofocus required > |
25 | <input type="submit" value="Valider" > | 25 | <input type="submit" value="Valider" > |
26 | </form> | 26 | </form> |
27 | <?php | 27 | <?php |
28 | $formulaireConnexion = ob_get_clean(); | 28 | $formulaireConnexion = ob_get_clean(); |
29 | 29 | ||
30 | // formulaire changement de mot de passe | 30 | // formulaire changement de mot de passe |
31 | // vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle | 31 | // vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle |
32 | ob_start(); | 32 | ob_start(); |
33 | ?> | 33 | ?> |
34 | <form class="connexionFormulaire" method="post" action="index.php?from=<?= $_GET['from'] ?>&action=modif_mdp" > | 34 | <form class="connexionFormulaire" method="post" action="index.php?from=<?= $_GET['from'] ?>&action=modif_mdp" > |
35 | <label for="motdepasse" >Ancien mot de passe:</label> | 35 | <label for="motdepasse" >Ancien mot de passe:</label> |
36 | <input type="password" name="ancienMotdepasse" autofocus required ><br /><br /> | 36 | <input type="password" name="ancienMotdepasse" autofocus required ><br /><br /> |
37 | <label for="motdepasse" >Nouveau mot de passe:</label> | 37 | <label for="motdepasse" >Nouveau mot de passe:</label> |
38 | <input type="password" name="nouveauMotdepasse" required > | 38 | <input type="password" name="nouveauMotdepasse" required > |
39 | <br /><br /> | 39 | <br /><br /> |
40 | <input type="submit" value="Valider" > | 40 | <input type="submit" value="Valider" > |
41 | </form> | 41 | </form> |
42 | <?php | 42 | <?php |
43 | $formulaireModifMDP = ob_get_clean(); | 43 | $formulaireModifMDP = ob_get_clean(); |
44 | 44 | ||
45 | 45 | ||
46 | // en-tête | 46 | // en-tête |
47 | ob_start(); | 47 | ob_start(); |
48 | ?> | 48 | ?> |
49 | <!DOCTYPE html> | 49 | <!DOCTYPE html> |
50 | 50 | ||
51 | <html lang="fr" > | 51 | <html lang="fr" > |
52 | <head> | 52 | <head> |
53 | <meta charset="utf-8" /> | 53 | <meta charset="utf-8" /> |
54 | <title><?= $title ?></title> | 54 | <title><?= $title ?></title> |
55 | 55 | ||
56 | <!-- <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> --> | 56 | <!-- <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> --> |
57 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > | 57 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > |
58 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> | 58 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> |
59 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> | 59 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> |
60 | <script type="text/javascript" src="public/main.js" ></script> | 60 | <script type="text/javascript" src="public/main.js" ></script> |
61 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | 61 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
62 | </head> | 62 | </head> |
63 | 63 | ||
64 | <body> | 64 | <body> |
65 | <div id="bloc_page" > | 65 | <div id="bloc_page" > |
66 | <h2 class="connexionTitre" ><?= $title ?></h2> | 66 | <h2 class="connexionTitre" ><?= $title ?></h2> |
67 | <p class="connexionTitre" ><?= $subHeading ?></p> | 67 | <p class="connexionTitre" ><?= $subHeading ?></p> |
68 | <?php | 68 | <?php |
69 | $header = ob_get_clean(); | 69 | $header = ob_get_clean(); |
70 | 70 | ||
71 | 71 | ||
72 | // message d'erreur | 72 | // message d'erreur |
73 | $erreurMDP = '<p class="avertissement" >Mauvais mot de passe</p>'; | 73 | $erreurMDP = '<p class="avertissement" >Mauvais mot de passe</p>'; |
74 | 74 | ||
75 | 75 | ||
76 | // confirmation modification du mot de passe | 76 | // confirmation modification du mot de passe |
77 | ob_start(); | 77 | ob_start(); |
78 | ?> | 78 | ?> |
79 | <script type="text/javascript" >nouveauMotdepasse('<?= $_GET["from"] ?>');</script> | 79 | <script type="text/javascript" >nouveauMotdepasse('<?= $_GET["from"] ?>');</script> |
80 | <noscript> | 80 | <noscript> |
81 | <p class="avertissement" >Le mot de passe a été modifié<br /> | 81 | <p class="avertissement" >Le mot de passe a été modifié<br /> |
82 | <a href="index.php" >Retour au site.</a><br/></p> | 82 | <a href="index.php" >Retour au site.</a><br/></p> |
83 | </noscript> | 83 | </noscript> |
84 | <?php | 84 | <?php |
85 | $message = ob_get_clean(); | 85 | $message = ob_get_clean(); |
86 | 86 | ||
87 | 87 | ||
88 | // avertissement | 88 | // avertissement |
89 | ob_start(); | 89 | ob_start(); |
90 | ?> | 90 | ?> |
91 | <p class="avertissement" >Rappel de sécurité<br />Vous n'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!</p> | 91 | <p class="avertissement" >Rappel de sécurité<br />Vous n'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!</p> |
92 | <?php | 92 | <?php |
93 | $warning = ob_get_clean(); | 93 | $warning = ob_get_clean(); |
94 | 94 | ||
95 | 95 | ||
96 | // pied de page | 96 | // pied de page |
97 | ob_start(); | 97 | ob_start(); |
98 | ?> | 98 | ?> |
99 | <p class="connexionFooter" > | 99 | <p class="connexionFooter" > |
100 | <i>N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.</i><br /> | 100 | <i>N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.</i><br /> |
101 | <a href="index.php?page=<?= $_GET['from'] ?>" >Retour à la page précédente</a> | 101 | <a href="index.php?page=<?= $_GET['from'] ?>" >Retour à la page précédente</a> |
102 | </p> | 102 | </p> |
103 | </div> | 103 | </div> |
104 | </body> | 104 | </body> |
105 | </html> | 105 | </html> |
106 | <?php | 106 | <?php |
107 | $footer = ob_get_clean(); \ No newline at end of file | 107 | $footer = ob_get_clean(); \ No newline at end of file |
diff --git a/view/template-formulaires.php b/view/template-formulaires.php index e864719..a3dc9cd 100644 --- a/view/template-formulaires.php +++ b/view/template-formulaires.php | |||
@@ -1,199 +1,178 @@ | |||
1 | <?php | 1 | <?php |
2 | // view/template-formulaire.php | 2 | // view/template-formulaire.php |
3 | 3 | ||
4 | // voici la partie HTML et javascript du ckeditor, | 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: | 5 | // on crée un formulaire <form> avec zones de saisie et boutons |
6 | // barre d'outils, zone de saisie, formulaire caché, bouton "valider" | 6 | // l'éditeur est inséré par lib/ckeditor5/build/ckeditor.js |
7 | 7 | // en remplaçant les balises <textarea> | |
8 | // le formulaire est presque classique, en effet on utilise le ckeditor 5 dans sa version "Document" (ou DecoupledEditor): | 8 | |
9 | // - avantage: plus de possibilité dans la barre d'outils (se rapproche d'un traitement de texte) | 9 | // il est en version "Classic" customizée pour pouvoir ressembler à la version "DecoupledEditor", on peut le créer ici: |
10 | // - inconvénient: on ne peut utiliser la balise <textarea> qu'on remplace par une <div> | 10 | // https://ckeditor.com/ckeditor-5/online-builder/ |
11 | 11 | // la version DecoupledEditor ne peut remplacer une <textarea>, il faut une <div>, ce qui interdit la méthode 1) ci-dessous | |
12 | // pour pouvoir envoyer le contenu dans le POST, on a deux possibilité: | 12 | |
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 | 13 | // pour envoyer les données au serveur, on a trois méthodes: |
14 | // - utiliser l'astuce du formulaire caché ! | 14 | // 1) facile: le JS de la bibliothèque remplace la <textarea> par l'éditeur, noter que c'est impossible avec la version DecoupledEditor du ckeditor5, d'ou le choix la "custom" |
15 | 15 | // 2) moins facile; technique du formulaire caché (l'éditeur remplace une <div>), à la validation, du JS (appelé avec onload="") place les données dans l'<input> caché duquel part le POST | |
16 | // le javascript place les données dans le formulaire caché | 16 | // 3) méthode AJAX (compliquée): le formulaire ni le bouton "valider" ne sont plus nécessaires et l'enregistrement des données est immédiat |
17 | // avec la fonction envoiDonnees(), les données se retrouvent dans une <input> et sont donc envoyées avec par la POST (haha) | 17 | |
18 | 18 | ||
19 | 19 | // falsification de requête inter-site - CSRF | |
20 | // variable $inputsAlbum (page discographie uniquement) | 20 | // à faire plus tard |
21 | // note: on ne peut préremplir le champ input texte | 21 | |
22 | // solution: on affiche le nom du fichier, si l'utilisateur en télécharge un autre, on le remplace | 22 | |
23 | ob_start(); | 23 | // variable $inputsAlbum (page discographie uniquement) |
24 | ?> | 24 | // attention: on ne peut préremplir le champ input file |
25 | <p><i>Infos qui seront affichées sur cette page:</i></p> | 25 | // solution: on affiche le nom du fichier, si l'utilisateur en télécharge un autre, on le remplace; |
26 | <label for="titre" >Titre</label> | 26 | // il devient donc impossible de n'avoir aucun fichier |
27 | <input type="text" name="titre" value="<?= $vignette[0] ?>" required ><br /> | 27 | ob_start(); |
28 | <label for="annee" >Année</label> | 28 | ?> |
29 | <input type="text" name="annee" value="<?= $vignette[1] ?>" required ><br /> | 29 | <img class="imageFormulaire" src="<?= $imageFormulaire ?>" > |
30 | <label for="pochette" >Pochette du disque (jpg ou png) : <?= $vignette[2] ?></label><br/> | 30 | <br/> |
31 | <input type="file" name="upload" > | 31 | <p><i>Infos qui seront affichées sur cette page:</i></p> |
32 | <br /><br /> | 32 | <label for="titre" >Titre</label> |
33 | <?php | 33 | <input type="text" name="titre" value="<?= $vignette[0] ?>" required ><br /> |
34 | $inputsAlbum = ob_get_clean(); | 34 | <label for="annee" >Année</label> |
35 | 35 | <input type="text" name="annee" value="<?= $vignette[1] ?>" required ><br /> | |
36 | 36 | <label for="pochette" >Pochette du disque (jpg ou png) : <?= $vignette[2] ?></label><br/> | |
37 | // variable $editeurHTML | 37 | <input type="file" name="upload" ><br /><br /><br /> |
38 | ob_start(); | 38 | <?php |
39 | ?> | 39 | $inputsAlbum = ob_get_clean(); |
40 | 40 | ||
41 | <div class="conteneur_article" > | 41 | |
42 | <form action="index.php?page=<?= $page_actuelle ?>&article=<?= $album_code ?>&action=submit" method="post" enctype="multipart/form-data" > | 42 | // variable $editeurHTML |
43 | <?php | 43 | ob_start(); |
44 | if($page_actuelle == 'discographie') | 44 | ?> |
45 | { | 45 | |
46 | echo($inputsAlbum . "<p><i>Infos qui seront affichées dans la page spécifique à cet album:</i></p>"); | 46 | <div class="conteneur_article" > |
47 | } | 47 | <form action="index.php?page=<?= $page_actuelle ?><?= $fileCodeArgument ?>&action=submit" method="post" enctype="multipart/form-data" > |
48 | ?> | 48 | <?php |
49 | 49 | if($page_actuelle == 'discographie') | |
50 | <textarea id="editor" name="contenu" ></textarea> | 50 | { |
51 | <?php | 51 | echo($inputsAlbum . "<p><i>Infos qui seront affichées dans la page spécifique à cet album:</i></p>"); |
52 | // falsification de requête inter-site | 52 | } |
53 | // on ajoute un formulaire caché avec une valeur aléatoire cryptée utilisable une seule fois (=jeton) | 53 | ?> |
54 | 54 | ||
55 | // "Vous pouvez rendre chaque jeton utilisable une seule fois et ainsi éviter de rejouer plusieurs fois la même requête. | 55 | <textarea id="editor" name="contenu" ></textarea> |
56 | // Les jetons sont stockés dans le back-office. | 56 | <input class="boutonSubmitEditeur" type="submit" value="Valider" /> |
57 | // Une rotation des jetons est effectuée quand le nombre maximum a été atteint, les plus vieux en premier. | 57 | <a class="boutonAnnuler" href="index.php?page=<?= $page_actuelle ?>" > |
58 | // Chaque jeton peut être lié à une URL spécifique. | 58 | <input type="button" value="Annuler" /> |
59 | // Si un jeton est intercepté, il ne peut pas être utilisé dans un autre contexte. | 59 | </a> |
60 | // Si besoin, les jetons peuvent être attachés à une adresse IP spécifique. | 60 | |
61 | // Depuis la version v2.1, les jetons peuvent être réutilisés (par exemple pour les requêtes AJAX). | 61 | <script> |
62 | // Si vous n’utilisez pas un framework qui gère la protection CSRF pour vous, jetez un oeil à Anti-CSRF." | 62 | let editor; // variable utilisable depuis une fonction |
63 | 63 | ||
64 | // une bibli qui fait ça: https://github.com/paragonie/anti-csrf | 64 | // ATTENTION: si l'éditeur ne fonctionne pas, empêcher qu'on puisse cliquer sur Valider! |
65 | ?> | 65 | // Il y a aussi des paramètres dans le fichier de config: ckeditor/webpack.config.js |
66 | 66 | ClassicEditor | |
67 | <input class="boutonSubmitEditeur" type="submit" value="Valider" onclick="envoiDonnees();" /> | 67 | .create( document.querySelector( '#editor' ),{ |
68 | 68 | language: 'fr', | |
69 | <script> | 69 | |
70 | let editor; // variable utilisable depuis une fonction | 70 | // barre d'outils à adapter au "custom build" |
71 | 71 | toolbar: { | |
72 | // code exécuté à la validation du formulaire | 72 | items: [ 'undo', 'redo', 'selectAll', '|', 'heading', '|', 'alignment', 'bulletedList', 'numberedList', 'todoList', 'blockQuote', 'horizontalLine', '-', 'bold', 'italic', 'underline', |
73 | function envoiDonnees() | 73 | //'strikethrough', |
74 | { | 74 | '|', |
75 | // supprimer le positionnement absolu de l'iframe | 75 | //'fontFamily', |
76 | //~ let balisesIframe = document.getElementsByTagName("iframe"); | 76 | 'fontColor', 'fontSize', 'highlight', '|', 'imageInsert', 'link', |
77 | //~ for(var i = 0; i < balisesIframe.length; i++) | 77 | //'htmlEmbed', |
78 | //~ { | 78 | //'mediaEmbed', |
79 | //~ alert(balisesIframe[i].getAttribute("style")); // affiche le CSS | 79 | 'insertTable' |
80 | //~ balisesIframe[i].removeAttribute("style"); | 80 | //'|', 'textPartLanguage' |
81 | //~ alert(balisesIframe[i].getAttribute("style")); // affiche null | 81 | ], |
82 | //~ } | 82 | // multiligne automatique (le '-' dans la liste permet de choisir l'endroit où couper) |
83 | } | 83 | shouldNotGroupWhenFull: true |
84 | 84 | ||
85 | // ATTENTION: si l'éditeur ne fonctionne pas, empêcher qu'on puisse cliquer sur Valider! | 85 | // noter que 'fontFamily' ne comporte que des polices microsoft => problèmes de droits? |
86 | // Il y a aussi des paramètres dans le fichier de config: ckeditor/webpack.config.js | 86 | // de plus, il faut que le navigateur connaisse toutes les polices |
87 | ClassicEditor | 87 | }, |
88 | .create( document.querySelector( '#editor' ),{ | 88 | |
89 | language: 'fr', | 89 | // barre d'outils dans une image |
90 | 90 | image: { | |
91 | // barre d'outils à adapter au build | 91 | toolbar: [ |
92 | toolbar: { | 92 | 'imageTextAlternative', |
93 | items: [ 'undo', 'redo', 'selectAll', '|', 'heading', '|', 'alignment', 'bulletedList', 'numberedList', 'todoList', 'blockQuote', 'horizontalLine', '-', 'bold', 'italic', 'underline', | 93 | 'imageStyle:full', |
94 | //'strikethrough', | 94 | 'imageStyle:side', |
95 | '|', | 95 | 'linkImage' |
96 | //'fontFamily', | 96 | ] |
97 | 'fontColor', 'fontSize', 'highlight', '|', 'imageInsert', 'link', | 97 | }, |
98 | //'htmlEmbed', | 98 | |
99 | //'mediaEmbed', | 99 | // barre d'outils dans un tableau |
100 | 'insertTable' | 100 | table: { |
101 | //'|', 'textPartLanguage' | 101 | contentToolbar: [ |
102 | ], | 102 | 'tableColumn', |
103 | // multiligne automatique (le '-' dans la liste permet de choisir l'endroit où couper) | 103 | 'tableRow', |
104 | shouldNotGroupWhenFull: true | 104 | 'mergeTableCells', |
105 | 105 | //'tableCellProperties', | |
106 | // noter que 'fontFamily' ne comporte que des polices microsoft => problèmes de droits? | 106 | 'tableProperties' |
107 | // de plus, il faut que le navigateur connaisse toutes les polices | 107 | ] |
108 | }, | 108 | }, |
109 | 109 | ||
110 | // barre d'outils dans une image | 110 | // plugin code HTML |
111 | image: { | 111 | // pour coller le code HTML "embed" proposé par certains sites |
112 | toolbar: [ | 112 | |
113 | 'imageTextAlternative', | 113 | // media embarqué (audio, vidéo, carte) |
114 | 'imageStyle:full', | 114 | //mediaEmbed: { |
115 | 'imageStyle:side', | 115 | //previewsInData: true, |
116 | 'linkImage' | 116 | // vaut "false" par defaut, on crée la balise non standard <oembed url="" > // https://oembed.com/ |
117 | ] | 117 | // qui nécessite un traitement (en JS ou côté serveur) en utilisant le lien à l'intérieur |
118 | }, | 118 | // avec "true", on crée la balise <iframe> qui sert à insérer une page HTML dans une autre, |
119 | 119 | // notre "embarquement de média" devrit donc réussir quelque soit le site | |
120 | // barre d'outils dans un tableau | 120 | // c'est plus simple, il ne reste plus qu'à ajuster le contenu avec du CSS (important) |
121 | table: { | 121 | // 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 |
122 | contentToolbar: [ | 122 | |
123 | 'tableColumn', | 123 | // en outre, le plugin mediaEmbed (dans l'éditeur), tout comme la balise "iframe" (hors éditeur), |
124 | 'tableRow', | 124 | // permettent d'afficher un aperçu (preview): une image avec un bouton lecture dessus |
125 | 'mergeTableCells', | 125 | // cette image est envoyée imédiatement par le serveur, et le contenu après un clic dessus |
126 | //'tableCellProperties', | 126 | // |
127 | 'tableProperties' | 127 | //}, |
128 | ] | 128 | |
129 | }, | 129 | // images |
130 | 130 | // https://ckeditor.com/docs/ckeditor5/latest/features/image-upload/simple-upload-adapter.html | |
131 | // plugin code HTML | 131 | // le plugin "image upload" s'occupe est la partie graphique, il crée un objet "createLoader", |
132 | // pour coller le code HTML "embed" proposé par certains sites | 132 | // le plugin "simple upload adapter" est la classe qui communique avec le serveur au moyen de requêtes AJAX |
133 | 133 | // il attend du serveur une réponse au format .json contenant l'adresse où est stockée l'image: | |
134 | // media embarqué (audio, vidéo, carte) | 134 | //{ |
135 | //mediaEmbed: { | 135 | // "url": "https://example.com/images/foo.jpg" |
136 | //previewsInData: true, | 136 | //} |
137 | // vaut "false" par defaut, on crée la balise non standard <oembed url="" > // https://oembed.com/ | 137 | // cette url sert à deux choses: |
138 | // qui nécessite un traitement (en JS ou côté serveur) en utilisant le lien à l'intérieur | 138 | // - à télécharger immédiatement l'image envoyée pour la placer dans l'éditeur |
139 | // avec "true", on crée la balise <iframe> qui sert à insérer une page HTML dans une autre, | 139 | // - à inclure l'adresse de l'image dans le HTML produit par l'éditeur |
140 | // notre "embarquement de média" devrit donc réussir quelque soit le site | 140 | simpleUpload: { |
141 | // c'est plus simple, il ne reste plus qu'à ajuster le contenu avec du CSS (important) | 141 | uploadUrl: 'index.php?action=upload_image&page=<?= $page_actuelle ?>', |
142 | // 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 | 142 | // noter qu'il est possible (parce que souhaitable je ne pense pas) d'envoyer une requête AJAX |
143 | 143 | // en indiquant une adresse "statique" du type: fichier.txt ou .xml, jpg, png, etc, | |
144 | // en outre, le plugin mediaEmbed (dans l'éditeur), tout comme la balise "iframe" (hors éditeur), | 144 | |
145 | // permettent d'afficher un aperçu (preview): une image avec un bouton lecture dessus | 145 | // Headers supplémentaires envoyés avec la requête |
146 | // cette image est envoyée imédiatement par le serveur, et le contenu après un clic dessus | 146 | // c'est ici qu'on installe les mécanismes de sécurités comme l'authentification et la protection au CSRF |
147 | // | 147 | headers: { |
148 | //}, | 148 | 'X-CSRF-TOKEN': 'CSRF-Token', |
149 | 149 | Authorization: 'Bearer <JSON Web Token>' | |
150 | // images | 150 | } |
151 | // https://ckeditor.com/docs/ckeditor5/latest/features/image-upload/simple-upload-adapter.html | 151 | }, |
152 | // le plugin "image upload" s'occupe est la partie graphique, il crée un objet "createLoader", | 152 | // formats acceptés par défaut: jpeg, png, gif, bmp, webp, tiff |
153 | // le plugin "simple upload adapter" est la classe qui communique avec le serveur au moyen de requêtes AJAX | 153 | // 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 |
154 | // il attend du serveur une réponse au format .json contenant l'adresse où est stockée l'image: | 154 | // ce plugin est simple (JS pur) et n'oblige pas le serveur à disposer de l'extension GD |
155 | //{ | 155 | // niveau perfs, on garde le choix d'utiler GD ou imagemagick ou un système d'onglets |
156 | // "url": "https://example.com/images/foo.jpg" | 156 | |
157 | //} | 157 | // plugin autosave |
158 | // cette url sert à deux choses: | 158 | } ) |
159 | // - à télécharger immédiatement l'image envoyée pour la placer dans l'éditeur | 159 | |
160 | // - à inclure l'adresse de l'image dans le HTML produit par l'éditeur | 160 | .then( newEditor => { |
161 | simpleUpload: { | 161 | editor = newEditor; |
162 | uploadUrl: 'index.php?action=upload_image&page=<?= $page_actuelle ?>', | 162 | |
163 | // noter qu'il est possible (parce que souhaitable je ne pense pas) d'envoyer une requête AJAX | 163 | // obtenir la liste des éléments disponibles pour la barre d'outils |
164 | // en indiquant une adresse "statique" du type: fichier.txt ou .xml, jpg, png, etc, | 164 | //alert(Array.from( editor.ui.componentFactory.names() )); |
165 | 165 | // obtenir la liste des plugins disponibles: | |
166 | // Headers supplémentaires envoyés avec la requête | 166 | //alert(ClassicEditor.builtinPlugins.map( plugin => plugin.pluginName )); |
167 | // c'est ici qu'on installe les mécanismes de sécurités comme l'authentification et la protection au CSRF | 167 | |
168 | headers: { | 168 | var initial = '<?= $texte ?>'; |
169 | 'X-CSRF-TOKEN': 'CSRF-Token', | 169 | editor.setData(initial); |
170 | Authorization: 'Bearer <JSON Web Token>' | 170 | } ) |
171 | } | 171 | .catch( error => { |
172 | }, | 172 | console.error( error ); |
173 | // formats acceptés par défaut: jpeg, png, gif, bmp, webp, tiff | 173 | } ); |
174 | // 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 | 174 | </script> |
175 | // ce plugin est simple (JS pur) et n'oblige pas le serveur à disposer de l'extension GD | 175 | </form> |
176 | // niveau perfs, on garde le choix d'utiler GD ou imagemagick ou un système d'onglets | 176 | </div> |
177 | 177 | <?php | |
178 | // plugin autosave | ||
179 | } ) | ||
180 | |||
181 | .then( newEditor => { | ||
182 | editor = newEditor; | ||
183 | |||
184 | // obtenir la liste des éléments disponibles pour la barre d'outils | ||
185 | //alert(Array.from( editor.ui.componentFactory.names() )); | ||
186 | // obtenir la liste des plugins disponibles: | ||
187 | //alert(ClassicEditor.builtinPlugins.map( plugin => plugin.pluginName )); | ||
188 | |||
189 | var initial = '<?= $texte ?>'; | ||
190 | editor.setData(initial); | ||
191 | } ) | ||
192 | .catch( error => { | ||
193 | console.error( error ); | ||
194 | } ); | ||
195 | </script> | ||
196 | </form> | ||
197 | </div> | ||
198 | <?php | ||
199 | $editeurHTML = ob_get_clean(); \ No newline at end of file | 178 | $editeurHTML = ob_get_clean(); \ No newline at end of file |
diff --git a/view/template.php b/view/template.php index a14555d..aeb157a 100644 --- a/view/template.php +++ b/view/template.php | |||
@@ -1,92 +1,92 @@ | |||
1 | <!DOCTYPE html> | 1 | <!DOCTYPE html> |
2 | 2 | ||
3 | <html lang="fr" > | 3 | <html lang="fr" > |
4 | <head> | 4 | <head> |
5 | <meta charset="utf-8" /> | 5 | <meta charset="utf-8" /> |
6 | <title><?= $title ?></title> | 6 | <title><?= $title ?></title> |
7 | 7 | ||
8 | <!-- partie que Melaine doit écrire --> | 8 | <!-- partie que Melaine doit écrire --> |
9 | <meta name="description" content="" /> | 9 | <meta name="description" content="" /> |
10 | 10 | ||
11 | <!-- <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> --> | 11 | <!-- <link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /> --> |
12 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > | 12 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > |
13 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> | 13 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> |
14 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> | 14 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> |
15 | <?php | 15 | <?php |
16 | if(isset($css)) // fichiers CSS supplémentaires | 16 | if(isset($css)) // fichiers CSS supplémentaires |
17 | { | 17 | { |
18 | echo($css); | 18 | echo($css); |
19 | } | 19 | } |
20 | 20 | ||
21 | if(isset($js)) // fonctions dans main.js puis appel des fonctions | 21 | if(isset($js)) // fonctions dans main.js puis appel des fonctions |
22 | { | 22 | { |
23 | echo($js); | 23 | echo($js); |
24 | } | 24 | } |
25 | ?> | 25 | ?> |
26 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | 26 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
27 | </head> | 27 | </head> |
28 | 28 | ||
29 | <body> | 29 | <body> |
30 | <div id="bloc_page" > | 30 | <div id="bloc_page" > |
31 | <?php | 31 | <?php |
32 | echo "\n"; | 32 | echo "\n"; |
33 | require("view/nav.php"); | 33 | require("view/nav.php"); |
34 | echo "\n"; | 34 | echo "\n"; |
35 | 35 | ||
36 | // variables obtenues avec le buffer | 36 | // variables obtenues avec le buffer |
37 | echo($header); | 37 | echo($header); |
38 | ?> | 38 | ?> |
39 | 39 | ||
40 | <div id="contenu" > | 40 | <div id="contenu" > |
41 | <?php | 41 | <?php |
42 | echo($content); | 42 | echo($content); |
43 | ?> | 43 | ?> |
44 | </div> | 44 | </div> |
45 | <?php | 45 | <?php |
46 | 46 | ||
47 | // section courriel sur toutes les pages sauf accueil | 47 | // section courriel sur toutes les pages sauf accueil |
48 | if($page_actuelle != "accueil") | 48 | if($page_actuelle != "accueil") |
49 | { | 49 | { |
50 | echo "\n"; | 50 | echo "\n"; |
51 | require("view/courriel.php"); | 51 | require("view/courriel.php"); |
52 | echo "\n\n"; | 52 | echo "\n\n"; |
53 | } | 53 | } |
54 | 54 | ||
55 | // lien vers le mode admin | 55 | // lien vers le mode admin |
56 | if($_SESSION['admin'] == 0) | 56 | if($_SESSION['admin'] == 0) |
57 | { | 57 | { |
58 | ?> | 58 | ?> |
59 | <div id="lienModeAdmin" > | 59 | <div id="lienModeAdmin" > |
60 | <p><a href="index.php?page=connexion&from=<?= $page_actuelle ?>" >Mode Administrateur</a></p> | 60 | <p><a href="index.php?page=connexion&from=<?= $page_actuelle ?>" >Mode Administrateur</a></p> |
61 | </div> | 61 | </div> |
62 | <?php | 62 | <?php |
63 | } | 63 | } |
64 | 64 | ||
65 | // actions en mode admin | 65 | // actions en mode admin |
66 | if($_SESSION['admin'] == 1) | 66 | if($_SESSION['admin'] == 1) |
67 | { | 67 | { |
68 | ?> | 68 | ?> |
69 | <!-- zone superposée par les commandes du mode admin --> | 69 | <!-- zone superposée par les commandes du mode admin --> |
70 | <div class="zoneVideAdmin" ></div> | 70 | <div class="zoneVideAdmin" ></div> |
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> |
78 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=modif_mdp" > | 78 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=modif_mdp" > |
79 | Changer le mot de passe de connexion.</a></p> | 79 | Changer le mot de passe de connexion.</a></p> |
80 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=sauvegarde" > | 80 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=sauvegarde" > |
81 | Sauvegarder les données de tout le site.</a></p> | 81 | Sauvegarder les données de tout le site.</a></p> |
82 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=restauration" >Restaurer les données avec une sauvegarde.</a></p> | 82 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=restauration" >Restaurer les données avec une sauvegarde.</a></p> |
83 | <p><a href="melainePHP.zip" > | 83 | <p><a href="melainePHP.zip" > |
84 | Télécharger le code PHP pour migration.</a></p> | 84 | Télécharger le code PHP pour migration.</a></p> |
85 | </div> | 85 | </div> |
86 | </div> | 86 | </div> |
87 | <?php | 87 | <?php |
88 | } | 88 | } |
89 | ?> | 89 | ?> |
90 | </div> | 90 | </div> |
91 | </body> | 91 | </body> |
92 | </html> \ No newline at end of file | 92 | </html> \ No newline at end of file |