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
|
<?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)
{
// $numArticle sert à placer l'éditeur sur la page et à lire et écrire dans le bon dossier
// texte initial pour setData() à modifier avec l'éditeur
if ($numArticle > 0)
{
// 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($page, $nomFichier, $contenu)
{
// déjà fait mais on ne sait jamais
if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1)
{
header('Location: index.php?page=' . $page . '&erreur=connexion');
}
else
{
// ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur)
// on évitera de perdre un article existant par erreur !!
if($contenu == '')
{
header('Location: index.php?page=' . $page . '&erreur=contenu_vide');
}
else
{
// récupérer les liens multimedia
//require("media.php");
//$contenu = mediaSubmit($contenu);
// sécurité faille XSS
$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
// 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 l'ckediteur
);
$specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs
$contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed);
// supprimer espaces, tabulations et sauts de ligne en début et fin de chaine
$contenu = trim($contenu);
}
}
// 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...
// echo($page);
// echo($article);
// echo($contenu);
// die();
// enregistrement
require('model/melaine-write.php');
if($_GET['article'] == 0)
{
nouvelArticle($page, $contenu);
}
else
{
modifArticle($page, $nomFichier, $contenu);
}
// debuggage
//exit();
}
|