0

私は CakePHP を使用して、project_id、id、parent_id、title、description を含むデータベース テーブル 'Task' をクエリしています。私のコントローラーコードは次のようにクエリを処理します:

$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); ?>

次のjson構造を取得します。

[
{
    "Task": {
        "id": "475",
        "title": "Have a Picnic",
        "parent_id": "0"
    },
    "children": [
        {
            "Task": {
                "id": "476",
                "title": "Drive/Hike to Moutains",
                "parent_id": "475"
            },
            "children": []
        }
    ]
}

]

(私はこのツールを使用して美化しました。出力はもちろん連続した文字列です)

ただし、JS JIT SpaceTree には次の構造が必要です。

    {
  "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 */]
}

そして、出力を調整する方法、またはクエリを変更して正しい構造を返す方法がわかりません。また、「スレッド」と「リスト」の両方の find() タイプを試してみましたが、同じ構造が得られました。どんな助けでも大歓迎です!

4

1 に答える 1

0

結果を反復処理し、データを目的の構造にマップするだけです。これは非常に基本的なタスクです。これは、コントローラー、ビュー (おそらくヘルパーを使用)、またはカスタムの find メソッドを使用するモデルで行うことができます。

簡単な例を次に示します。何が良いのかわかりませんdata。また、結果にそれ以上のフィールドがないため、その部分を残しました。

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 が 1 つのルート要素のみをサポートする場合はcurrent($tree)、JavaScript を使用するか、最初の配列エントリを Spacetree に渡すだけです。

于 2013-09-11T15:11:26.997 に答える