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
|
<?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($numArticle, $texte)
{
// ici $numArticle sert uniquement à savoir si on crée ou modifie un article
// texte initial inséré avec setData() dans l'éditeur,
// on recherche ici les causes expliquant qu'il n'apparaisse pas à l'ouverture de l'éditeur,
// les données précédentes sont écrasées à la validation du nouveau texte
if ($numArticle > 0)
{
if(empty($texte))
{
header('Location: index.php?erreur=empty_input');
}
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
$texte = trim($texte);
// supprimer les sauts de ligne
$sautsDeLigne = array("\n", "\r", "\r\n");
$texte = str_replace($sautsDeLigne, '', $texte);
// échapper tous les ', ", \ et caractère NULL
$texte = addslashes($texte);
}
else
{
$texte = ''; // nouveau contenu
}
return($texte);
}
// réception du HTML créé par l'éditeur
// le nom du fichier est celui dans $_SESSION['nomFichier']
function submitCKeditor($nomFichier)
{
$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();
}
// sécurité faille XSS avec htmLawed
$configHtmLawed = array(
'safe'=>1, // protection contre les élements et attributs dangereux
'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées
'deny_attribute'=>'id', // gêner le JS hostile
// on garde 'class' et 'style' utilisés par le ckediteur
);
$specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
// de l'éditeur
if(isset($_POST['contenu'])) // optionnel pour discographie
{
$contenu = $_POST['contenu'];
// récupérer les liens multimedia
//require("media.php");
//$contenu = mediaSubmit($contenu);
$contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur)
$contenu = trim($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();
}
}
if($page == 'discographie')
{
$titre = $_POST['titre'];
$annee = $_POST['annee'];
$pochette = $_POST['pochette']; // une image
// des formulaires simples
$titre = htmLawed($titre, $configHtmLawed, $specHtmLawed);
$titre = trim($titre);
$annee = htmLawed($annee, $configHtmLawed, $specHtmLawed);
$annee = trim($annee);
// pochette
// Album->imageUpload();
// test formats jpg, jpeg, png, gif, tiff
// enregistrement du fichier
}
// lien sans http://
// un clic sur un lien dans l'éditeur affiche une infobulle montrant l'adresse cible du lien si celle-ci a déjà été précisée
// il est possible de cliquer sur ce lien, ce qui ouvre un onglet avec le site demandé
// toutefois si cette adresse est de type "domaine.fr" (sans http:// devant), le navigateur ne va pas rechercher un site mais un fichier comme si mon adresse était de type file:///fichier
// tomber ainsi sur une page d'erreur est déroutant:
// "ai-je perdu le texte que j'étais en train de taper?""
// solution 1 (mauvaise): activer la redirection en cas d'erreur 404 dans le .htaccess
// solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>';
// pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert...
// enregistrement
// var_dump($titre, $annee, $pochette, $contenu);
// die();
// modèle
if($page == 'discographie')
{
// on instancie avec l'enfant de OneArticle
$Album = new Album($page);
//var_dump($_GET['article']);
//var_dump($_POST);
//exit();
// enregistrement
if($_GET['article'] == 0)
{
// page disco
$Album->createVignette($titre, $annee, $pochette);
// page détail de l'album
if(!empty($_POST['contenu']))
{
$Album->create($contenu);
}
}
else
{
// page disco
$Album->updateVignette($titre, $annee, $pochette);
// page détail de l'album
if(isset($_POST['contenu']))
{
$Album->update($content);
}
}
}
// autres pages
else
{
$Article = new OneArticle($page);
if($_GET['article'] == 0)
{
$Article->create($contenu);
}
else
{
$Article->setFileName($nomFichier);
$Article->update($contenu);
}
}
}
function cleanHTML($contenu)
{}
|