1

这是我的第一篇文章,所以如果我遗漏了什么,请耐心等待:)。

我使用来自GoJS的 go-debug.js 库在浏览器上制作一些图表,但我运行保存选项的问题。此图生成一个 JavaScript 对象,您可以将其转换为 Json 并通过此命令myDiagram.model.toJson()将其传递给数据库。当我按下保存按钮时,我希望使用Ajax方法将图表保存到PhP,然后保存到mySQL数据库中。

谢谢您的帮助!

这是我的保存脚本,但我不知道为什么它不起作用。

  window.onload = function(){


jQuery(document).ready(function(){
    $.ajax({
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    url: 'savemodel.php',
    data: {json: JSON.stringify(modelJson)},
    dataType: 'json'
})

.done( function( data ) {
    console.log('done');
    console.log(data);
})
.fail( function( data ) {
    console.log('fail');
    console.log(data);
})
});

    //return modelJson;



  }
  function load() {
    myDiagram.model = go.Model.fromJson(document.getElementById("mySavedModel").value);
    // loadDiagramProperties gets called later, upon the "InitialLayoutCompleted" DiagramEvent
  }


  function loadDiagramProperties(e) {
    var pos = myDiagram.model.modelData.position;
    if (pos) myDiagram.position = go.Point.parse(pos);
  }



  }

我的php代码是:

      <?php 

header('Content-Type: application/json');
include 'config.php';
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);

$session_id=$_SESSION['sess_user_id']; // User session id

$modelJson = $_POST['json'];




$sql = "INSERT INTO c_map 
       (ref_num, members_id, title, description, ingredients) 
        VALUES (NULL, '$session_id', 'title', 'description',
        '".mysql_real_escape_string($modelJson)."');";


mysqli_query($connection, $sql);





?>

例如。命令 myDiagram.model.toJson() 的产生;这是一个有 2 个孩子的树形图,如下所示:

{ "class": "go.GraphLinksModel",
  "modelData": {"position":"-545.114064532096 -44.69966023522102"},
  "nodeDataArray": [ 
{"key":"Alpha"},
{"key":"N"},
{"key":"N2"}
 ],
  "linkDataArray": [ 
{"from":"Alpha", "to":"N"},
{"from":"Alpha", "to":"N2"}
 ]}

我引用了 GoJs 网站上的模型保存文档:

GoJS 不要求您以任何特定的介质或格式保存模型。但是因为这是 JavaScript 并且 JSON 是最流行的数据交换格式,所以我们确实可以轻松地将模型作为 JSON 格式的文本编写和读取。

只需调用 Model.toJson 即可生成代表您的模型的字符串。给定由 Model.toJson 生成的字符串,调用静态方法 Model.fromJson 来构造和初始化模型。许多示例都证明了这一点——搜索名为“save”和“load”的 JavaScript 函数。大多数这些函数在页面本身上写入和读取 TextArea,以便您可以查看和修改 JSON 文本,然后加载它以获取新图表。但编辑时请谨慎,因为 JSON 语法非常严格,任何语法错误都会导致那些“加载”功能失败。

JSON 格式的文本对您可以在没有额外假设的情况下表示的数据类型有严格的限制。要保存和加载您在节点数据(或链接数据)上设置的任何数据属性,它们需要满足以下要求:

该属性是可枚举的,并且它的名称不以下划线开头(您可以使用以下划线开头的属性名称,但它们不会被保存)属性值不是未定义的并且不是函数(JSON 不能忠实地保存函数)模型知道如何将属性值转换为 JSON 格式(数字、字符串、JavaScript 数组或纯 JavaScript 对象)作为对象或数组的属性值形成树结构——没有共享或循环引用 Model.toJson 和 Model .fromJson 还将处理 Point、Size、Rect、Spot、Margin、Geometry 和非图案画笔的实例。但是,我们建议您使用这些类的 parse 和 stringify 静态函数将这些对象存储在它们的字符串表示形式中。

因为您使用的是 JavaScript,所以将数据属性添加到节点数据是微不足道的。这允许您将所需的任何信息与每个节点相关联。但是,如果您需要将一些信息与模型相关联,即使根本没有节点数据也会存在,您可以向 Model.modelData 对象添加属性。该对象的属性将由 Model.toJson 写入并由 Model.fromJson 读取,就像节点数据对象被写入和读取一样。

4

1 回答 1

2

你不需要json_decode这个 JSON,因为它正在变成一个对象。
删除这部分:

$directions = json_decode($_POST['json']);
var_dump(directions); // here's an error btw

并将其更改为:

$directions = $_POST['json'];

然后将其保存为文本模式。
不要忘记逃避它:

$sql = "INSERT INTO c_map 
       (ref_num, members_id, title, description, ingredients) 
        VALUES (NULL, '$session_id', 'title', 'description',
        '".mysql_real_escape_string($directions)."');";
于 2015-01-19T14:30:32.650 回答