Опубликовать HTML-код на PHP с помощью jQuery - PullRequest
3 голосов
/ 29 ноября 2010

Я разрешаю пользователям редактировать веб-страницы с помощью CKEditor, а затем сохранять их измененные фрагменты HTML-кода на сервере, чтобы я мог показывать их на последующих страницах.

Я использую этот код для отправки HTML-кода и нескольких идентификаторов на сервер:

var datatosend = JSON.stringify( { page: 1, block: 22, content: editor1.getData() } );

$.ajax({
  url: "/ajax/fragment/",
  type: "POST",
  dataType: 'json',                     
  data: "data=" + datatosend,
  success: function (html) {  },
  error: function (xhr, status, msg) { 
     alert( status + " " + msg );
  }
});      

И на стороне сервера я использую PHP и делаю это:

    $json = stripslashes( $_POST[ "data" ] );
    $values = json_decode( $json, true );       

Это часто работает при отправке фрагментов, отличных от HTML, но не работает, когда в содержимом отправляется что-то подобное:

<img alt="" src="http://one.localbiz.net/uploads/1/Dido-3_2.JPG" style="width: 173px; height: 130px;" />

Я действительно не уверен, что я должен делать с точки зрения кодирования данных на стороне клиента, а затем декодирования на стороне сервера? Также не уверен, что dataType: 'json' лучше всего использовать здесь?

Ответы [ 3 ]

3 голосов
/ 29 ноября 2010

Атрибут dataType - это ожидаемый тип возвращаемых данных из серверного скрипта. Поскольку вы используете вызов JSON.stringify, я предполагаю использование сценария json2.js или аналогичного, который позволяет сериализовать объекты JSON на стороне клиента.

Возможно, вы захотите использовать функцию escape () JavaScript при вызове editor1.getData (), чтобы она правильно экранировала символы проблемы.

Я использовал следующее в качестве теста, и программа PHP вернула точную копию строкового литерала, переданного функции escape.

so.html *

<!DOCTYPE html>
<html><head><title>SO Example</title>
<script 
  type="text/javascript" 
  src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.js">
</script>  
</head>
<body>

<script type="text/javascript">
  var $data = 'd=' + escape(
    '<img alt="" src="http://one.localbiz.net/uploads/1/Dido-3_2.JPG" style="width: 173px; height: 130px;" />'
  );

  $.ajax({
    url:"/so.php",
    type:"post",
    dataType:"html",
    data:$data,
    success:function(obj){
      alert(obj);
    }
  });
</script>
</body>
</html>

so.php *

<?php
  echo $_POST['d'];
2 голосов
/ 29 ноября 2010

Я бы посоветовал отбросить PHP-вызов в stripslashes (). Тебе это не нужно. Было бы полезно, если бы вы могли объяснить, что ломается с элементом img.

Что касается "не уверен, что dataType: 'json' - это лучшее, что можно использовать здесь", я бы сказал, что все должно быть в порядке. Он будет правильно обрабатывать сериализацию и позволит вам публиковать только одно значение.

1 голос
/ 29 октября 2012

У меня есть тот же точный сценарий, но я использую YAHOO.lang.JSON.stringify (html) из http://developer.yahoo.com/yui/json/, и PHP json_decode (json) и на стороне сервера, иУ меня может быть html с любым специальным символом (например,! @ # $% ^ & * () + {}: "<>?), И он правильно хранится в базе данных и извлекает из базы данных, просто обращая последовательность для хранения htmlЯ не знаю, является ли это силой YUI stringify или как, но это работает ... Я также не уверен, есть ли какой-то особый набор HTML, с которым он не будет работать, но я непока не сталкивался.

...