Javascript 如何将CakePHP json转换为与JS JIT SpaceTree一起使用?
我使用CakePHP查询数据库表“Task”,其中包括项目id、id、父项目id、标题和描述。我的控制器代码处理查询的方式如下: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
$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);