[resolu] retour à la ligne et ajax/CKEditor

retour à la ligne et ajax/CKEditor [resolu] - PHP - Programmation

Marsh Posté le 28-11-2014 à 11:46:11    

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
Reply

Marsh Posté le 28-11-2014 à 11:46:11   

Reply

Marsh Posté le 28-11-2014 à 14:12:01    

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?

Reply

Marsh Posté le 28-11-2014 à 16:36:13    

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
Reply

Marsh Posté le 28-11-2014 à 16:51:40    

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
Reply

Marsh Posté le 02-12-2014 à 10:35:19    

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 !

Reply

Marsh Posté le 02-12-2014 à 10:59:07    

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

Reply

Marsh Posté le 02-12-2014 à 11:30:33    

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

Reply

Marsh Posté le 02-12-2014 à 22:48:12    

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.

Reply

Marsh Posté le 02-12-2014 à 22:51:40    

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.
Reply

Marsh Posté le 03-12-2014 à 14:10:12    

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 !!

Reply

Marsh Posté le 03-12-2014 à 14:10:12   

Reply

Marsh Posté le 03-12-2014 à 23:40:22    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed