1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
<?php
// controller/ckeditor.php
//
// c'est la partie PHP du ckeditor
// l'autre partie est le fichier view/template-ckeditor.php
// qui est inséré par la vue de la page correspondante
// il y a aussi un fichier CSS parce que le HTML créé par l'éditeur ne suffit pas à lui-même
// avant de placer l'éditeur
function preparationCKeditor($html)
{
// texte initial inséré avec setData() dans l'éditeur
// danger!
// setData() n'insère pas le texte si il ne respecte pas certains critères, l'utilisateur risque de perdre des données en validant un nouveau contenu sans avoir pu modifier l'ancien
if(empty($html))
{
header('Location: index.php?erreur=empty_input');
}
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
$html = trim($html);
// supprimer les sauts de ligne
$sautsDeLigne = array("\n", "\r", "\r\n");
$html = str_replace($sautsDeLigne, '', $html);
// échapper tous les ', ", \ et caractère NULL
$html = addslashes($html);
return($html);
}
// réception du HTML créé par l'éditeur
function submitCKeditor()
{
$page = $_GET['page'];
// déjà fait mais on ne sait jamais
if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1)
{
header('Location: index.php?page=' . $page . '&erreur=connexion');
exit();
}
// POST de l'éditeur
if(isset($_POST['contenu'])) // optionnel pour discographie
{
$contenu = Security::secureString($_POST['contenu']);
// liens sans http:// devant
$contenu = fixLinks($contenu);
// récupérer les liens multimedia
//require("media.php");
//$contenu = mediaSubmit($contenu);
// ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !!
if($page != 'discographie' && $contenu == '')
{
header('Location: index.php?page=' . $page . '&erreur=contenu_vide');
exit();
}
}
// pages avec des articles simples (melaine...)
if($page != 'discographie')
{
$Article = new Article($page);
if(!isset($_SESSION['target']) || $_SESSION['target'] == '')
{
$Article->create($contenu);
}
else
{
$Article->fileCode = $_SESSION['target']; // erreur ici?
$Article->update($contenu);
}
}
// page discographie
else if($page == 'discographie')
{
$Album = new Album($page);
// on retrouve les données si nécessaire
if(isset($_SESSION['target']) && $_SESSION['target'] != '')
{
$Album->fileCode = $_SESSION['target'];
$Album->readOne();
}
$nouveauTitre = Security::secureString($_POST['titre']);
$nouvelleAnnee = Security::secureString($_POST['annee']);
if(!empty($_FILES['upload']['name']))
{
$nouvellePochette = $_FILES['upload']['name'];
$nouvellePochetteMini = pathinfo($_FILES['upload']['name'], PATHINFO_FILENAME) . '-mini.' . pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION);
}
else
{
$nouvellePochette = '';
$nouvellePochetteMini = '';
}
//var_dump($nouvellePochetteMini); die();
// enregistrement nouvel album
if(!isset($_SESSION['target']) || $_SESSION['target'] == '')
{
// page disco
$Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini);
// page de l'album
if(!empty($_POST['contenu']))
{
$Album->format = 'html';
$Album->create($contenu);
}
}
// modification
else
{
$Album->albumCode = $_SESSION['target'];
// page disco
$Album->format = 'json';
$Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini);
// page de l'album
// si $contenu est vide, le fichier est supprimé
$Album->format = 'html';
$Album->update($contenu);
}
}
// nettoyage
unset($_SESSION['target']);
unset($_GET['action']);
unset($_POST['contenu']);
header('Location: index.php?page=' . $_GET['page']);
exit();
}
// lien sans http://
// si une adresse est de type "domaine.fr" sans le http:// devant, le comportement des navigateurs est de rechercher un fichier comme si mon adresse commençait par file://
// tomber ainsi sur une page d'erreur est parfaitement déroutant
// une erreur 404 est détectée et le visiteur redirigé, mais ça ne règle pas le problème
// 2ème problème, en train d'écrire un article, l'utilisateur clique sur ce lien qu'il vient de créer et qui apparaît dans l'infobulle, un nouvelle onglet apparaît
// solution: fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>';
// le .htaccess doit pour ça détecter que l'erreur 404 est particulière
function fixLinks($data)
{
// regex pour détecter les balises <a>, analyser les liens à l'interieur et les modifier si nécessaire
$pattern = '#<a href=".*">.*</a>#';
if(preg_match($pattern, $data))
{}
//$remplacement = 'http://$0';
//$data = preg_replace($pattern, $remplacement, $data);
// contrairement à ce qui dit la doc
// https://www.php.net/manual/fr/filter.filters.validate.php
// une adresse du type "domaine.fr" ne passe pas le filtre
// il renvoie false, ce qui nous arrange ici!
//var_dump(filter_var($link, FILTER_VALIDATE_URL));
return($data);
}
|