Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2582 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [resolu] retour à la ligne et ajax/CKEditor

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[resolu] retour à la ligne et ajax/CKEditor

n°2244302
naeco
Buddy Rich Big Band
Posté le 28-11-2014 à 11:46:11  profilanswer
 

Bonjour,
Je désire enregistrer le contenu d'un textarea géré en jquery avec CKeditor en ajax dans un script PHP de l'autre coté.
 
Le code coté jquery est le suivant : (ce qui est commenté est des essais infructueux)

Code :
  1. //var articleSansCaractereInterdit = $('#redaction').serialize();
  2.   //var articleSansCaractereInterdit = encodeURIComponent($('#redaction').serialize());
  3.   //var articleSansCaractereInterdit = encodeURIComponent($('#redaction').val());
  4.   //var articleSansCaractereInterdit = $('#redaction').val().replace('"', "%22" );  
  5.   var articleSansCaractereInterdit = $('#redaction').val().replace('\n', "
" );
  6.   //var articleSansCaractereInterdit = articleSansCaractereInterdit.serialize();
  7.   //TODOWROU on peut se passer du #redaction ?  CKEDITOR.instances[instance].updateElement(); ??
  8.   // http://stackoverflow.com/questions [...] m-ckeditor
  9.   var jsonValue = '{';
  10.   jsonValue = jsonValue + '"idVersionEdition" : "<?php echo $idVersionEdition; ?>",';
  11.   jsonValue = jsonValue + '"idArticle" : "<?php echo $idArticle; ?>",';
  12.   jsonValue = jsonValue + '"article" : "' + articleSansCaractereInterdit + '",';
  13.   jsonValue = jsonValue + '"cssjs" : "' + $('#css_js_article').serialize() + '"';
  14.   jsonValue = jsonValue + '}';
  15.   //jsonValue = jsonValueArray.serializeArray();
  16.   $.ajax({
  17.    dataType: "json",
  18.    type: "POST",
  19.    async: false,
  20.    cache: false,
  21.    url: "article_save_auto.ajax.php",
  22.    data: "jsonValue=" + jsonValue,
  23.    success: function(){
  24.     //writeInConsole( "Data Saved: " + dateSauvegarde );
  25.    }
  26.   });


 
Coté php, c'est ce code : (ce qui est commenté sont des essais infructueux)

Code :
  1. $jsonValue = $_POST['jsonValue'];
  2. if(get_magic_quotes_gpc()) {
  3.    $jsonValue = stripslashes($_POST['jsonValue']);
  4. }
  5. //$jsonValue =  $jsonValue.replace(/\n/g, "\\\\n" ).replace(/\r/g, "\\\\r" ).replace(/\t/g, "\\\\t" );
  6. //$jsonValue = str_replace(chr(10), "\n", $jsonValue);
  7. //$jsonValue = str_replace(chr(13), "\r", $jsonValue);
  8. /*
  9. $jsonValue = str_replace("\n", "\\n", $jsonValue);
  10. $jsonValue = str_replace("\r", "\\r", $jsonValue);
  11. $jsonValue = str_replace("\t", "\\t", $jsonValue);
  12. */
  13. //$jsonValue=str_replace("\r\n","\\n",htmlspecialchars(addslashes($jsonValue),ENT_QUOTES));  
  14. echo  $jsonValue;
  15. //echo "fff".$jsonValue;
  16. $arrayValue = json_decode($jsonValue, true);
  17. //Lorsque ce paramètre vaut TRUE, l'objet retourné sera converti en un tableau associatif.  
  18. print_r($arrayValue);
  19. if (count($arrayValue) == 0) {
  20. echo "<br/>exception : JSON est vide !! contactez l'administrateur.";
  21. exit;
  22. }


 
Le problème est double :

  • quand le code contient des retour ligne, json_decode part dans les choux et retourne un tableau vide.
  • sur le CKeditor, il y a du code HTML qui est généré, avec éventuellement des attribut, donc les guillemets ne sont pas échappés. Mais d'autre guillemet qui font partie de la réaction sont échappé. Je ne peux donc pas échapper les guillemets restant sous peine de ne plus savoir qui fait partie de la rédaction et qui fait parti du code. Ces guillemets foutent le $£^¨ pour que json_decode s'en sorte.


J'ai testé différente chose avec serialize, replace etc, mais il y a toujours un truc qui ne marche pas. D'autre part, je suis sûr qu'en 2014, il y a une solution propre sans bidouille. Par exemple, j'ai trouvé aussi ça sans être convaincu :  
http://stackoverflow.com/questions [...] javascript
 
Je vous remercie de votre retour !


Message édité par naeco le 03-12-2014 à 14:11:03
mood
Publicité
Posté le 28-11-2014 à 11:46:11  profilanswer
 

n°2244317
MaybeEijOr​Not
but someone at least
Posté le 28-11-2014 à 14:12:01  profilanswer
 

Côté js tu gardes le replace mais utilise le flag g pour remplacer toutes tes occurrences.
 
Côté php tu échappes juste les guillemets avant d'insérer dans une requête le contenu.
 
 
Et ça devrait suffire non?

n°2244332
naeco
Buddy Rich Big Band
Posté le 28-11-2014 à 16:36:13  profilanswer
 

Merci de ta réponse.
 
Coté js, non, ce n'était pas suffisant, mais la solution aurait pu être :

Code :
  1. var articleSansCaractereInterdit = $('<div/>').text($('#redaction').val()).html();
  2.   var articleSansCaractereInterdit = articleSansCaractereInterdit.replace('/"/gi', "&quot;" );


Car comme ça, les caractères qu'il ne faut pas encoder car c'est du HTML auraient été encodé une fois, et les autres deux fois (le &acute; en &amp;acute; par exemple), et j'aurai pu retrouver la différence entre les caractères encodés et ceux qu'il faut garder car c'est du HTML avec un coup de html_entity_decode() coté php
 
MAIS !
 
Ca ne marche pas, ça ne remplace pas les quotes.
Je cherche pourquoi...
 
Edit  
 

Code :
  1. var articleSansCaractereInterdit = articleSansCaractereInterdit.replace('/"/gi', '\"');


Ne marche pas non plus...
mais si je met n'importe quoi d'autre, ça marche... il y aurait une restriction pour .replace() de javascript ?


Message édité par naeco le 28-11-2014 à 16:51:03
n°2244335
MaybeEijOr​Not
but someone at least
Posté le 28-11-2014 à 16:51:40  profilanswer
 

Ah oui les quotes sont aussi problématiques pour json apparemment mais côté js ceci fonctionne :
 

Code :
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.   <title>Page d'essai</title>
  5.   <style type="text/css">
  6.   </style>
  7.   <script type="text/javascript">
  8.    function go() {
  9.     var str = document.getElementById('test').value;
  10.     var regexpa = /\n/g;
  11.     var regexpb = /'/g;
  12.     var regexpc = /"/g;
  13.     var str = str.replace(regexpa, "&#015;" ).replace(regexpb, "&#039;" ).replace(regexpc, "&#034;" );
  14.     var str = '{ "article" : "' + str + '" }';
  15.     alert(str);
  16.     var str = JSON.parse(str);
  17.     alert(str.article);
  18.     var regexpd = /&#015;/g;
  19.     var regexpe = /&#039;/g;
  20.     var regexpf = /&#034;/g;
  21.     document.getElementById('content').innerHTML = "<pre>" + str.article.replace(regexpd, "\n" ).replace(regexpe, "'" ).replace(regexpf, '"') + "</pre>";
  22.    }
  23.   </script>
  24. </head>
  25. <body>
  26.   <textarea rows="5" cols="50" id="test"></textarea>
  27.   <input type="submit" onClick="go();"></input>
  28.   <div id="content"></div>
  29. </body>
  30. </html>


 
 
EDIT : de souvenir pour les regexp il vaut mieux les passer dans des variables quand tu utilises un flag car il me semble qu'autrement chrome n'aime pas trop.


Message édité par MaybeEijOrNot le 28-11-2014 à 16:52:41
n°2244612
naeco
Buddy Rich Big Band
Posté le 02-12-2014 à 10:35:19  profilanswer
 

Bonjour,
Ah oui, contre toute attente, même si je suis sous firefox, passer les regexs dans des variables fonctionne alors que les mettre directement dans le replace ne fonctionne pas.
Mais  cela ne fonctionne toujours pas complètement.
Étant donné que je voudrais tout encoder pour passer de :
 

Code :
  1. <p><span style="color:#FF8C00;">aaa &eacute;&eacute;&eacute;</span></p>


 
à  
 

Code :
  1. <p>&lt;p&gt;&lt;span style=&quot;color:#FF8C00;&quot;&gt;aaa &amp;eacute;&amp;eacute;&amp;eacute;&lt;/span&gt;&lt;/p&gt;</p>


(remarquer que le & du &eacute est réencoché en &amp;eacute)
 
Ce qui me permet d'appliquer tout desencoder coté PHP avec html_entity_decode(), et et pouvoir retrouver mon string où certains caractères sont encodés et ceux qui représentent du HTML pas.
 
Etant donné ça donc, j'utilise le code suivant :

Code :
  1. var articleSansCaractereInterdit = $('<div/>').text($('#redaction').val()).html();
  2. //n'encode pas les quotes ni les retours à la ligne
  3. var regexpa = /\n/g;
  4. var regexpc = /"/g;
  5. articleSansCaractereInterdit = articleSansCaractereInterdit.replace(regexpa, "&#015;" ).replace(regexpc, "&#034;" );
  6. ...
  7. var jsonValue = '{';
  8.   jsonValue = jsonValue + '"idVersionEdition" : "<?php echo $idVersionEdition; ?>",';
  9.   jsonValue = jsonValue + '"idArticle" : "<?php echo $idArticle; ?>",';
  10.   jsonValue = jsonValue + '"article" : "' + articleSansCaractereInterdit + '",';
  11.   jsonValue = jsonValue + '"cssjs" : "' + $('#css_js_article').val() + '"';
  12.   jsonValue = jsonValue + '}';
  13. $.ajax({
  14.    dataType: "json",
  15.    type: "POST",
  16.    async: false,
  17.    cache: false,
  18.    url: "article_save_auto.ajax.php",
  19.    data: "jsonValue=" + jsonValue,
  20.    success: function(){
  21.     //writeInConsole( "Data Saved: " + dateSauvegarde );
  22.    }
  23.   });


 
coté javascript, et puis ensuite, coté PHP :
 

Code :
  1. $jsonValue = $_POST['jsonValue'];
  2. if(get_magic_quotes_gpc()) {
  3.    $jsonValue = stripslashes($jsonValue);
  4. }
  5. $arrayValue = json_decode($jsonValue, true);
  6. $article_decode = html_entity_decode($arrayValue["article"]);
  7. ...


 
Et malheureusement, quand je regarde dans firebug le JSON généré semble correct, mais le retour de l'appel AJAX montre que la valeur de "article" est vide.
 
Je continue à chercher !

n°2244614
naeco
Buddy Rich Big Band
Posté le 02-12-2014 à 10:59:07  profilanswer
 

Je progresse :
En en fait, tout ce qui est après le premier & est coupé.
 
si je mets artificiellement  
 

Code :
  1. articleSansCaractereInterdit = "aaaa&zzzzzz";


 
Alors je retrouve de l'autre coté que "aaaa".
 
Je suis étonné, je n'ai jamais eu de problème avec la methode POST avant :o

n°2244617
naeco
Buddy Rich Big Band
Posté le 02-12-2014 à 11:30:33  profilanswer
 

On n'était pas loin, ce code envoie un truc exploitable coté PHP :
 

Code :
  1. var articleSansCaractereInterdit = $('<div/>').text($('#redaction').val()).html();
  2.   var regexpa = /\n/g;
  3.   var regexpc = /"/g;
  4.   articleSansCaractereInterdit = articleSansCaractereInterdit.replace(regexpa, "&#015;" ).replace(regexpc, "&#034;" );
  5.   articleSansCaractereInterdit = encodeURIComponent(articleSansCaractereInterdit);


 
Si je trouve un truc mieux je reviendrai le noter :o

n°2244705
MaybeEijOr​Not
but someone at least
Posté le 02-12-2014 à 22:48:12  profilanswer
 

Je n'ai pas trop cherché car faudrait que je réinstalle un serveur php. :o  
 
Mais faudrait déjà éliminer la couche Jquery pour y voir plus clair je pense.

n°2244706
par l'anne​au de l'ia
word master
Posté le 02-12-2014 à 22:51:40  profilanswer
 

MaybeEijOrNot a écrit :

Je n'ai pas trop cherché car faudrait que je réinstalle un serveur php. :o  
 
Mais faudrait déjà éliminer la couche Jquery pour y voir plus clair je pense.


 
Penses- tu qu'il faille éliminé la couche Jquery pour y voir plus clair ?


---------------
Toute expression prend un sens spirituel qui nous influence dans notre quête de l'Homme.
n°2244757
naeco
Buddy Rich Big Band
Posté le 03-12-2014 à 14:10:12  profilanswer
 

Merci les gars,
 
alors, la version définitive (j'espère) qui marche  :bounce: :
 

Code :
  1. var articleSansCaractereInterdit = $('<div/>').text($('#redaction').val()).html();
  2. var regexpa = /\n/g;
  3. var regexpb = /'/g;
  4. var regexpc = /"/g;
  5. var regexpd = / /g;//tabulation
  6. var regexpe = /\\/g;
  7. articleSansCaractereInterdit = articleSansCaractereInterdit.replace(regexpa, "&#13;&#10;" ).replace(regexpc, "&#034;" ).replace(regexpd, "&#009;" ).replace(regexpb, "&#39;" ).replace(regexpe, "&#92;" );
  8. articleSansCaractereInterdit = encodeURIComponent(articleSansCaractereInterdit);
  9. var jsonValue = '{';
  10.   jsonValue = jsonValue + '"idVersionEdition" : "<?php echo $idVersionEdition; ?>",';
  11.   jsonValue = jsonValue + '"idArticle" : "<?php echo $idArticle; ?>",';
  12.   jsonValue = jsonValue + '"article" : "' + articleSansCaractereInterdit + '",';
  13.   jsonValue = jsonValue + '"cssjs" : "' + cssjsSansCaractereInterdit + '"';
  14.   jsonValue = jsonValue + '}';
  15.   //writeInConsole( jsonValue );
  16.   $.ajax({
  17.    dataType: "json",
  18.    type: "POST",
  19.    async: false,
  20.    cache: false,
  21.    url: "article_save_auto.ajax.php",
  22.    data: "jsonValue=" + jsonValue,
  23.    success: function(){
  24.     //writeInConsole( "Data Saved: " + dateSauvegarde );
  25.    }
  26.   });


 
Et coté PHP :
 

Code :
  1. $jsonValue = $_POST['jsonValue'];
  2. if(get_magic_quotes_gpc()) {
  3.    $jsonValue = stripslashes($jsonValue);
  4. }
  5. $arrayValue = json_decode($jsonValue, true);
  6. $article_decode = html_entity_decode($arrayValue["article"]);
  7. $article = mysqli_real_escape_string($db_link, $article_decode);
  8. ... etc


 
Avec ça, je peux enregistrer en AJAX via du JSON le contenu d'un CKEditor, y compris si celui ci contient du code copier collé d'un éditeur comme notepad++ entre balise <pre>
 
Résolu !!

mood
Publicité
Posté le 03-12-2014 à 14:10:12  profilanswer
 

n°2244806
MaybeEijOr​Not
but someone at least
Posté le 03-12-2014 à 23:40:22  profilanswer
 

par l'anneau de l'ia a écrit :

Penses- tu qu'il faille éliminé la couche Jquery pour y voir plus clair ?


 
Pas facile de recopier une phrase sans faire de faute. :o


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [resolu] retour à la ligne et ajax/CKEditor

 

Sujets relatifs
Insérer une ligne en dessous d'un contenu précisInstaller un formulaire en ligne sans connaissance
HELP please : supprimer ligne excel si cellule = 2, 3,4 ou 5[powershell] se positionner sur un ligne precise dans fichier
Sélectionner une plage jusqu'à la dernière ligne[Excel 2007] Problème pour trouver le nombre de ligne d'une feuille
infinite ajax scroll et gifplayerRemplir un agenda google via un google form pour prise de rdv en ligne
C++ : Ajouter une ligne à un fichier txtAfficher la ligne d'une table après avoir choisi son ID dans une liste
Plus de sujets relatifs à : [resolu] retour à la ligne et ajax/CKEditor


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR