Javascript 如何将CakePHP json转换为与JS JIT SpaceTree一起使用?

Javascript 如何将CakePHP json转换为与JS JIT SpaceTree一起使用?,javascript,json,cakephp,Javascript,Json,Cakephp,我使用CakePHP查询数据库表“Task”,其中包括项目id、id、父项目id、标题和描述。我的控制器代码处理查询的方式如下: $query= $this->Task->find('threaded', array( 'conditions' => array( 'Task.project_id' => 83, ), 'fields

我使用CakePHP查询数据库表“Task”,其中包括项目id、id、父项目id、标题和描述。我的控制器代码处理查询的方式如下:

$query= $this->Task->find('threaded', array(
                'conditions' => array(
                    'Task.project_id'  => 83,
                ), 
                'fields' => array(
                    'Task.id',
                    'Task.title',
                    'Task.parent_id',

                )
        ));
//Pass the result to the view
$this->set('query', $query);
在我看来,如果我用以下代码解码json:

<?php echo json_encode($simple); ?>
]

(我用在美化它,输出当然是一个连续的字符串)

但是JS JIT SpaceTree需要以下结构:

[
{
    "Task": {
        "id": "475",
        "title": "Have a Picnic",
        "parent_id": "0"
    },
    "children": [
        {
            "Task": {
                "id": "476",
                "title": "Drive/Hike to Moutains",
                "parent_id": "475"
            },
            "children": []
        }
    ]
}
    {
  "id": "aUniqueIdentifier",
  "name": "usually a nodes name",
  "data": [
      {key:"some key",       value: "some value"},
    {key:"some other key", value: "some other value"}
  ],
  children: [/* other nodes or empty */]
}

我不知道如何调整输出,或者更改查询以返回正确的结构。此外,我还尝试了“threaded”和“list”find()类型,得到了相同的结构。非常感谢您的帮助

只需迭代结果并将数据映射到所需的结构中,这是一项非常基本的任务。您可以在控制器中、视图中(可能使用辅助对象)甚至使用自定义查找方法在模型中执行此操作

这里有一个简单的例子。我不知道
数据
有什么好处,而且在你的结果中没有更多的字段,所以我留下了那部分

function mapThreaded($source, &$target)
{
    foreach($source as $item)
    {
        $node = array
        (
            'id' => $item['Task']['id'],
            'name' => $item['Task']['title'],
            'children' => array()
        );

        if(count($item['children']))
        {
            mapThreaded($item['children'], $node['children']);
        }

        $target[] = $node;
    }
}

$tasks = $this->Task->find('threaded', array(...));

$tree = array();
mapThreaded($tasks, $tree);

pr($tree);
pr(json_encode($tree, JSON_PRETTY_PRINT)); // pretty print requires PHP >= 5.4.0
它将产生如下JSON结构:

[
    {
        "id": "475",
        "name": "Have a Picnic",
        "children": [
            {
                "id": "476",
                "name": "Drive/Hike to Moutains",
                "children": [

                ]
            }
        ]
    }
]

如果Spacetree只支持一个根元素,只需使用
current($tree)
或在JavaScript中将第一个数组项传递给Spacetree。

谢谢ndm!你刚刚结束了几个小时的混乱和混乱!!唯一需要更改的事情(对于我的设置)是在cotroller中调用此方法需要:$this->mapsthreaded($tasks,$tree);