summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpolo <ordipolo@gmx.fr>2021-07-22 03:49:28 +0200
committerpolo <ordipolo@gmx.fr>2021-07-22 03:49:28 +0200
commit86c2a611e55c9e35384febecf34964e214c0296e (patch)
treee910a2f9a135bfc7059fd28c9af6c00ae46b5fde
parenta23573d5aff91e18d1240a6ac84c2962a8a15f87 (diff)
downloadmelaine-86c2a611e55c9e35384febecf34964e214c0296e.zip
patch modifs
-rw-r--r--controller/admin.php31
-rw-r--r--controller/ckeditor.php12
-rw-r--r--controller/visitor.php4
-rw-r--r--index.php62
-rw-r--r--model/Article.php11
-rw-r--r--model/melaine-read.php46
-rw-r--r--model/melaine-write.php24
-rw-r--r--view/melaine.php56
-rw-r--r--view/template-ckeditor.php2
9 files changed, 133 insertions, 115 deletions
diff --git a/controller/admin.php b/controller/admin.php
index 77ab34e..a35f28a 100644
--- a/controller/admin.php
+++ b/controller/admin.php
@@ -9,7 +9,6 @@ function melaineEdit($numArticle)
9 $page_actuelle = "melaine"; 9 $page_actuelle = "melaine";
10 10
11 // tableau $articles[] 11 // tableau $articles[]
12 require('model/melaine-read.php');
13 $croissant = False; 12 $croissant = False;
14 $articles = lireArticles($page_actuelle, $croissant); 13 $articles = lireArticles($page_actuelle, $croissant);
15 14
@@ -17,46 +16,20 @@ function melaineEdit($numArticle)
17 { 16 {
18 $title = "Ajouter un article"; 17 $title = "Ajouter un article";
19 $texte = ''; 18 $texte = '';
20 //$numArticle = count($articles) + 1;
21 } 19 }
22 else 20 else
23 { 21 {
24 $title = "Modifier un article"; 22 $title = "Modifier un article";
25 // faire correspondre le numéro de l'article du GET et le tableau des articles qui est inversé 23 $texte = lireUnArticle($_SESSION['nomFichier']);
26 $texte = $articles[count($articles) - $numArticle];
27 } 24 }
28 25
29 // traitements PHP pour l'éditeur 26 // traitements PHP pour l'éditeur
30 require('controller/ckeditor.php'); 27 require('controller/ckeditor.php');
31 // sécurisation du contenu pré-existant inséré dans l'éditeur 28 // sécurisation du contenu pré-existant inséré dans l'éditeur
32 $initial = preparationCKeditor($numArticle, $texte); 29 $texte = preparationCKeditor($numArticle, $texte);
33 30
34 // NB: penser à ajouter au template la fonctionnalité "autosave" 31 // NB: penser à ajouter au template la fonctionnalité "autosave"
35 // https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/saving-data.html 32 // https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/saving-data.html
36
37 // if($numArticle > $nombreDarticles || $numArticle < 0) // erreur nombre trop grand (bug?)
38 // {
39 // header('Location: index.php?page=melaine');
40 // }
41 // elseif($numArticle == 0) // nouvel article
42 // {
43 // $texte = '';
44 // $numArticle = $nombreDarticles + 1;
45 // }
46 // else // modification d'un article
47 // {
48 // $texte = $articles[$numArticle - 1];
49 // }
50
51
52 // if($initial == '')
53 // {
54 // $article = "nouveau";
55 // }
56 // else
57 // {
58 // $article = "modif";
59 // }
60 33
61 // variable $editeurHTML, $initial est inséré dedans 34 // variable $editeurHTML, $initial est inséré dedans
62 require('view/template-ckeditor.php'); 35 require('view/template-ckeditor.php');
diff --git a/controller/ckeditor.php b/controller/ckeditor.php
index 013d6b5..ea90726 100644
--- a/controller/ckeditor.php
+++ b/controller/ckeditor.php
@@ -33,7 +33,8 @@ function preparationCKeditor($numArticle, $texte)
33} 33}
34 34
35// réception du HTML créé par l'éditeur 35// réception du HTML créé par l'éditeur
36function submitCKeditor($page, $article, $contenuPOST) 36// le nom du fichier est celui dans $_SESSION['nomFichier']
37function submitCKeditor($page, $nomFichier, $contenu)
37{ 38{
38 // déjà fait mais on ne sait jamais 39 // déjà fait mais on ne sait jamais
39 if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) 40 if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1)
@@ -44,14 +45,12 @@ function submitCKeditor($page, $article, $contenuPOST)
44 { 45 {
45 // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur) 46 // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur)
46 // on évitera de perdre un article existant par erreur !! 47 // on évitera de perdre un article existant par erreur !!
47 if($contenuPOST == '') 48 if($contenu == '')
48 { 49 {
49 header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); 50 header('Location: index.php?page=' . $page . '&erreur=contenu_vide');
50 } 51 }
51 else 52 else
52 { 53 {
53 $contenu = $_POST["contenu"];
54
55 // récupérer les liens multimedia 54 // récupérer les liens multimedia
56 //require("media.php"); 55 //require("media.php");
57 //$contenu = mediaSubmit($contenu); 56 //$contenu = mediaSubmit($contenu);
@@ -89,14 +88,13 @@ function submitCKeditor($page, $article, $contenuPOST)
89 88
90 // enregistrement 89 // enregistrement
91 require('model/melaine-write.php'); 90 require('model/melaine-write.php');
92 if($article == 0) 91 if($_GET['article'] == 0)
93 { 92 {
94 nouvelArticle($page, $contenu); 93 nouvelArticle($page, $contenu);
95 } 94 }
96 else 95 else
97 { 96 {
98 // $article est le nom du fichier 97 modifArticle($page, $nomFichier, $contenu);
99 modifArticle($page, $article, $contenu);
100 } 98 }
101 99
102 // debuggage 100 // debuggage
diff --git a/controller/visitor.php b/controller/visitor.php
index 9bd3461..a08ea95 100644
--- a/controller/visitor.php
+++ b/controller/visitor.php
@@ -33,13 +33,11 @@ function melaineVisitor()
33 $title = "Mais qui est Melaine Favennec?"; 33 $title = "Mais qui est Melaine Favennec?";
34 34
35 // tableau $articles 35 // tableau $articles
36 require('model/melaine-read.php');
37 $croissant = False; 36 $croissant = False;
38 $articles = lireArticles($page_actuelle, $croissant); 37 $articles = lireArticles($page_actuelle, $croissant);
39 38
40 // vérification pour protéger les visiteurs 39 // vérification pour protéger les visiteurs
41 // normalement déjà faite dans submit.php, 40 // normalement déjà faite dans submit.php, au cas où la base a été trafiquée
42 // c'est au cas où les données aient été trafiquées
43 //$article = htmLawed($article); 41 //$article = htmLawed($article);
44 42
45 // variables $css, $js et $content 43 // variables $css, $js et $content
diff --git a/index.php b/index.php
index 2d3bcd6..ccce82a 100644
--- a/index.php
+++ b/index.php
@@ -51,9 +51,9 @@ installation();
51 51
52// à propos des sessions, penser aux attaques CSRF (cross-site request forgery): 52// à propos des sessions, penser aux attaques CSRF (cross-site request forgery):
53// ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable 53// ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable
54// - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST nécessite d'injecter du javascript 54// - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript
55// - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant 55// - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant
56// - la méthode des jetons, "nonces" et horodatage 56// - il y a la méthode des jetons, "nonces" et horodatage
57// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête 57// - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête
58// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery 58// infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery
59session_start(); 59session_start();
@@ -62,20 +62,27 @@ session_start();
62require('lib/htmlawed/htmLawed.php'); 62require('lib/htmlawed/htmLawed.php');
63 63
64// traitement des POST du ckeditor 64// traitement des POST du ckeditor
65// NOTER que le fichier "habituel" controller/admin.php n'est pas utilisé 65// la fonction submitCKeditor n'affiche rien (controller/admin.php n'est pas utilisé) puis redirige sans GET
66// la fonction submitCKeditor n'affiche rien puis redirige sans GET
67if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 66if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1
68 && isset($_GET['action']) && $_GET['action'] == 'submit' 67 && isset($_GET['action']) && $_GET['action'] == 'submit'
69 && isset($_POST['contenu'])) 68 && isset($_POST['contenu']) && $_POST['contenu'] != '')
70{ 69{
71 require('controller/ckeditor.php'); 70 require('controller/ckeditor.php');
72 submitCKeditor($_GET['page'], $_GET['article'], $_POST['contenu']); 71 // modification
73 72 if(isset($_SESSION['nomFichier']))
74 // nettoyage (je ne sais pas si ça sert à quelque chose, mais c'est pas grave) 73 {
75 unlink($_GET['action']); 74 submitCKeditor($_GET['page'], $_SESSION['nomFichier'], $_POST['contenu']);
76 unlink($_POST['contenu']); 75 }
76 // nouvel article
77 else
78 {
79 submitCKeditor($_GET['page'], '', $_POST['contenu']);
80 }
77 81
78 // rechargement "nettoyage" à la fin du traitement 82 // nettoyage
83 unset($_SESSION['nomFichier']);
84 unset($_GET['action']);
85 unset($_POST['contenu']);
79 header('Location: index.php?page=' . $_GET['page']); 86 header('Location: index.php?page=' . $_GET['page']);
80} 87}
81 88
@@ -90,13 +97,20 @@ if(isset($_GET['action']))
90} 97}
91 98
92// le site comporte deux modes: 99// le site comporte deux modes:
93// le mode normal en "lecture seule" utilisant le contrôleur visitor.php 100// le mode visiteur en "lecture seule" utilisant le contrôleur visitor.php
94// le mode admin avec droits en "écriture" utilisant le contrôleur admin.php 101// le mode admin avec droits en "écriture" utilisant le contrôleur admin.php
95 102
96// appelé tout le temps parce que certaines pages (accueil, menu) n'ont pas de version "admin" 103// contrôleur des pages en mode visiteur
97// une optimisation serait bienvenue 104// appe tout le temps parce que certaines pages (accueil, menu) n'ont pas de version "admin" => à améliorer
98require('controller/visitor.php'); 105require('controller/visitor.php');
99 106
107// utile pour presque toutes les pages
108if(isset($_GET['page']) && $_GET['page'] != 'menu')
109{
110 require('model/melaine-read.php');
111}
112
113// contrôleur des pages en mode admin
100if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) 114if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1)
101{ 115{
102 require('controller/admin.php'); 116 require('controller/admin.php');
@@ -122,17 +136,35 @@ if(isset($_GET['page']))
122 // page melaine 136 // page melaine
123 elseif($_GET['page'] == 'melaine') 137 elseif($_GET['page'] == 'melaine')
124 { 138 {
125 // ouverture de l'éditeur 139 // ouverture de l'éditeur pour modification
140 // le lien utilisé pour ouvrir l'éditeur contient un GET avec le numéro de l'article, mais pas le nom du fichier que le visiteur ne doit pas voir
141 // GET, POST, cookies => navigation (utiles au visiteur)
142 // sessions => action
143 // c'est ici qu'on passe des GET aux sessions
144 // on associe maintenant le numéro de l'article et le nom du fichier, l'article déjà existant inséré dans l'éditeur DOIT être celui qui sera modifié
145 //
126 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor') 146 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor')
127 { 147 {
128 // modification 148 // modification
149 // A MODIFIER! on a aussi besoin du nom du fichier,
150 // infos à mettre dans la session!
151
129 if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0) 152 if(isset($_GET['article']) && is_numeric($_GET['article']) && $_GET['article'] > 0)
130 { 153 {
154 // obtenir le nom du fichier à l'aide du modèle
155 $_SESSION['nomFichier'] = getFileName($_GET['page'], $_GET['article']);
156
131 melaineEdit($_GET['article']); 157 melaineEdit($_GET['article']);
132 } 158 }
133 // nouvel article 159 // nouvel article
134 else 160 else
135 { 161 {
162 // prévenir une hypothétique perte de donnée
163 if(isset($_SESSION['nomFichier']))
164 {
165 unset($_SESSION['nomFichier']);
166 }
167
136 melaineEdit(0); 168 melaineEdit(0);
137 } 169 }
138 } 170 }
diff --git a/model/Article.php b/model/Article.php
index afcb1ca..aee4f5d 100644
--- a/model/Article.php
+++ b/model/Article.php
@@ -6,8 +6,9 @@ class Article
6 private $page = ''; // page et donc dossier concerné 6 private $page = ''; // page et donc dossier concerné
7 private $croissant = True; // ordre des éléments du tableau $files 7 private $croissant = True; // ordre des éléments du tableau $files
8 private $files; // noms des fichiers d'un dossier 8 private $files; // noms des fichiers d'un dossier
9 private $nbArticles; // peut servir 9 private $oneFile; // correspond à $_SESSION['nomFichier']
10 private $articles; // contenu de ces mêmes fichiers 10 private $nbArticles; // un fichier = un article
11 private $articles; // contenu des fichiers
11 12
12 private function getFiles() 13 private function getFiles()
13 { 14 {
@@ -45,7 +46,7 @@ class Article
45 } 46 }
46 47
47 // read 48 // read
48 public function getNb() 49 public function getNumber()
49 { 50 {
50 return $this->nbArticles; 51 return $this->nbArticles;
51 } 52 }
@@ -55,11 +56,11 @@ class Article
55 56
56 public function getAll($croissant) 57 public function getAll($croissant)
57 { 58 {
58 $this->croissant = $croissant; 59 $this->croissant = $croissant; // inversion de $files?
59
60 getFiles(); 60 getFiles();
61 61
62 $i = 0; 62 $i = 0;
63 $articles = array();
63 foreach ($this->files as $file) 64 foreach ($this->files as $file)
64 { 65 {
65 $articles[$i] = file_get_contents($file); 66 $articles[$i] = file_get_contents($file);
diff --git a/model/melaine-read.php b/model/melaine-read.php
index 801cd3c..7105acd 100644
--- a/model/melaine-read.php
+++ b/model/melaine-read.php
@@ -3,16 +3,33 @@
3// 3//
4// accès en lecture seule 4// accès en lecture seule
5 5
6function lireArticles($page_actuelle, $croissant) 6// obtenir le nom du fichier de l'article qu'on modifie
7function getFileName($page, $numArticle)
8{
9 $files = lireNomsFichiers($page);
10 $fileName = $files[$numArticle - 1];
11
12 return($fileName);
13}
14
15function lireNomsFichiers($page)
7{ 16{
8 // créer un tableau avec le nom des fichiers html 17 // créer un tableau avec le nom des fichiers html
9 $files = glob('data/' . $page_actuelle . '/html/*.html'); 18 $files = glob('data/' . $page . '/html/*.html');
10 19
11 // nombre de fichiers (= taille du tableau $files) 20 return $files;
12 //$nombreDarticles = count($files); 21}
13 22
14 // tableau contenant tous les articles au format html 23function lireUnArticle($nomFichier)
15 //$articles = [$nombreDarticles]; 24// ce nom est le chemin complet, donc la page y figure
25{
26 return(file_get_contents($nomFichier));
27}
28
29function lireArticles($page, $croissant)
30{
31 // créer un tableau avec le nom des fichiers html
32 $files = lireNomsFichiers($page);
16 33
17 // inverse l'ordre du tableau retourné 34 // inverse l'ordre du tableau retourné
18 if($croissant == False) 35 if($croissant == False)
@@ -20,23 +37,18 @@ function lireArticles($page_actuelle, $croissant)
20 $files = array_reverse($files); 37 $files = array_reverse($files);
21 } 38 }
22 39
23 // for ($i = 0 ; $i < $nombreDarticles ; $i++)
24 // {
25 // // les noms de fichiers commencent par 1
26 // // les articles dans le tableau[] commencent par 0
27 // $numero = $i + 1;
28 // $articles[$i] = file_get_contents('data/' . $page_actuelle . '/html/article' . $numero . '.html');
29 // }
30 $i = 0; 40 $i = 0;
31 foreach ($files as $files) 41 $articles = array();
42 foreach ($files as $oneFile)
32 { 43 {
33 $articles[$i] = file_get_contents($files); 44 $articles[$i] = file_get_contents($oneFile);
34 $i++; 45 $i++;
35 } 46 }
47 // nombre de fichiers (= taille du tableau $files)
48 //$nombreDarticles = count($files);
36 49
37 //print_r($articles); 50 //print_r($articles);
38 //var_dump($articles); 51
39
40 return($articles); 52 return($articles);
41} 53}
42 54
diff --git a/model/melaine-write.php b/model/melaine-write.php
index 642bf05..462d59e 100644
--- a/model/melaine-write.php
+++ b/model/melaine-write.php
@@ -3,22 +3,30 @@
3// 3//
4// accès en écriture pour créer ou modifier des articles 4// accès en écriture pour créer ou modifier des articles
5 5
6
7
6function nouvelArticle($page, $contenuHTML) 8function nouvelArticle($page, $contenuHTML)
7{ 9{
8 // manipulation du fichier 10 // nommer les fichiers avec le timestamp
9 //$nom_fichier = 'article' . $article . '.html'; 11 // pour les trier par ordre chronologique
10 $nom_fichier = time() . '.html'; 12 // rendre impossible d'avoir deux fois le même nom (à la condition de gérer la "concurrence")
11 $fichier = fopen('data/' . $page . '/html/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu 13 $nom_fichier = 'data/' . $_GET['page'] . '/html/' . time() . '.html';
14
15 $fichier = fopen($nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
12 fputs($fichier, $contenuHTML); 16 fputs($fichier, $contenuHTML);
13 fclose($fichier); 17 fclose($fichier);
14 chmod('data/' . $page . '/html/' . $nom_fichier, 0666); 18 chmod($nom_fichier, 0666);
15} 19}
16 20
17function modifArticle($page, $nom_fichier, $contenuHTML) 21function modifArticle($page, $nomFichier, $contenuHTML)
18{ 22{
19 // manipulation du fichier 23 // manipulation du fichier
20 $fichier = fopen('data/' . $page . '/html/' . $nom_fichier, 'w'); // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu 24 //$fichier = fopen('data/' . $page . '/html/' . $nom_fichier, 'w');
25 $fichier = fopen($nomFichier, 'w');
26 // w peut créer un fichier, si il existe déjà, il est effacé par le nouveau contenu
21 fputs($fichier, $contenuHTML); 27 fputs($fichier, $contenuHTML);
22 fclose($fichier); 28 fclose($fichier);
23 chmod('data/' . $page . '/html/' . $nom_fichier, 0666); 29 //chmod('data/' . $page . '/html/' . $nom_fichier, 0666);
30 chown($nomFichier, 'http');
31 chmod($nomFichier, 0666);
24} \ No newline at end of file 32} \ No newline at end of file
diff --git a/view/melaine.php b/view/melaine.php
index acf4962..debd4e3 100644
--- a/view/melaine.php
+++ b/view/melaine.php
@@ -67,48 +67,44 @@ if($_SESSION['admin'] == 1)
67// on pourrait paginer avec des onglets contenant 5 ou 10 articles chacun 67// on pourrait paginer avec des onglets contenant 5 ou 10 articles chacun
68 68
69// tableau articles[] du dernier au premier (1 case = 1 article) 69// tableau articles[] du dernier au premier (1 case = 1 article)
70//for ($i=$nombreDarticles - 1; $i >= 0 ; $i--)
71
72//$j = 0;
73$j = count($articles); 70$j = count($articles);
74foreach ($articles as $article) 71foreach ($articles as $article)
75{ 72{
76 //$j = $i + 1;
77
78 // la div invisible sert à la compensation des liens d'ancre # 73 // la div invisible sert à la compensation des liens d'ancre #
79?> 74?>
80 <div class="zoneVideNav" ></div> 75 <div class="zoneVideNav" ></div>
81 <article id="article<?= $j ?>" > 76 <article id="article<?= $j ?>" >
82<?php 77<?php
83 78
84// remplacer un article par l'éditeur 79 // remplacer un article par l'éditeur
85if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['article']) && $_GET['article'] == $j) 80 if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['article']) && $_GET['article'] == $j)
86{ 81 {
87 echo("\n<p>Modifier l'article " . $j . "</p>"); 82 // on pourrait utiliser le timedate, ou encore le nom de l'article
88 //echo("<p>Modification d'un article</p>"); 83 echo("\n<p>Modifier l'article " . $j . "</p>");
89 echo "\n"; 84 //echo("<p>Modification d'un article</p>");
90 85 echo "\n";
91 echo($editeurHTML); // injection de template-editor.php
92}
93 86
94// placer un article 87 echo($editeurHTML); // injection de template-editor.php
95else 88 }
96{
97 // c'était pas compliqué
98 echo($article . "\n");
99 89
100 // bouton 90 // placer un article
101 if($_SESSION['admin'] == 1) 91 else
102 { 92 {
103 ?> 93 // c'était pas compliqué
104 <p class="boutonArticle" > 94 echo($article . "\n");
105 <a href="index.php?page=melaine&action=editor&article=<?= $j ?>#article<?= $j ?>" > 95
106 Modifier cet article 96 // bouton
107 </a> 97 if($_SESSION['admin'] == 1)
108 </p> 98 {
109 <?php 99 ?>
100 <p class="boutonArticle" >
101 <a href="index.php?page=melaine&action=editor&article=<?= $j ?>#article<?= $j ?>" >
102 Modifier cet article
103 </a>
104 </p>
105 <?php
106 }
110 } 107 }
111}
112 108
113?> 109?>
114 </article> 110 </article>
diff --git a/view/template-ckeditor.php b/view/template-ckeditor.php
index f95344a..12e1430 100644
--- a/view/template-ckeditor.php
+++ b/view/template-ckeditor.php
@@ -174,7 +174,7 @@ ob_start();
174 // obtenir la liste des plugins disponibles: 174 // obtenir la liste des plugins disponibles:
175 //alert(ClassicEditor.builtinPlugins.map( plugin => plugin.pluginName )); 175 //alert(ClassicEditor.builtinPlugins.map( plugin => plugin.pluginName ));
176 176
177 var initial = '<?= $initial ?>'; 177 var initial = '<?= $texte ?>';
178 editor.setData(initial); 178 editor.setData(initial);
179 } ) 179 } )
180 .catch( error => { 180 .catch( error => {