summaryrefslogtreecommitdiff
path: root/controller/ckeditor.php
blob: 013d6b52994ef929ffc3ef9447a31065ce746e94 (plain)
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
<?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
function submitCKeditor($page, $article, $contenuPOST)
{
    // 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($contenuPOST == '')
        {
            header('Location: index.php?page=' . $page . '&erreur=contenu_vide');
        }
        else
        {
            $contenu = $_POST["contenu"];

            // 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($article == 0)
    {
        nouvelArticle($page, $contenu);
    }
    else
    {
        // $article est le nom du fichier
        modifArticle($page, $article, $contenu);
    }
    
    // debuggage
    //exit();
}