0

StofのDoctrineExtensionバンドルを使用してツリーを取得しています。次に、そのツリーを配列に変換します(その後、jsonに変換されます)。

NestedTreeRepository-> childrenHierarchy()の形式は正しい形式ではありませんが、出力を変更して、ノードの「title」プロパティと「id」プロパティのみが返されるようにし、すべての子を「children」サブ配列に配置します。 。この形式(JSON)に準拠:

{
        label: 'node1',
        children: [
            { label: 'child1' },
            { label: 'child2' }
        ]
    },
    {
        label: 'node2',
        children: [
            { label: 'child3' }
        ]
    }
}

私は次のコードを試しましたが、これはchildrenHierarchy()と同じものを返しますが、クエリを変更することができます。

    $query = $em
            ->createQueryBuilder()
            ->select('node')
            ->from('MyBundle:Page', 'node')
            ->orderBy('node.root, node.lft', 'ASC')
            ->getQuery()
    ;
    $nodes = $query->getArrayResult();

    [Do magic here]

    $tree = $pagerepo->buildTree($nodes);

次のプロパティのみを含むはるかに単純なオブジェクトにすべてのノードを型キャストすることは可能ですか?

  • id
  • タイトル
  • ポジショニングに使用される他のいくつかのint

次に、それをjson_encode()で実行すると、必要なものが正確に得られます。

もちろん、他の解決策も歓迎します。

4

3 に答える 3

0

Stofs リポジトリ関数を使用して、ノードを階層配列で取得します。

$repo = $em->getRepository('MyBundle:Page');
$arrayTree = $repo->childrenHierarchy();

そして、その配列を手動で変更する以外に解決策はないと思います。不要なプロパティをいくつか削除したら、配列を json_encode して返すことができます。

于 2012-08-28T12:08:29.803 に答える
0

この目的のための私のコード (数時間前にこれを作成したばかりです) stof の buildTreeArray 関数のリメイクです

コントローラーで (これは symfony2 用に書いています):

function gettreeAction {
    $query = .... // do your query
    $tree = $this->buildTree($query->getArrayResult());
    $response = new Response(json_encode($tree));
    return $response;
}

private function buildTree($nodes) 
{
    $nestedTree = array();
    $l = 0;

    if (count($nodes) > 0) {
        // Node Stack. Used to help building the hierarchy
        $stack = array();
        foreach ($nodes as $child) {
            $item = array();
            $item['name'] = $child['title'];
            $item['id'] = 'page_'.$child['id'];
            $item['level'] = $child['level'];
            $item['children'] = array();
            // Number of stack items
            $l = count($stack);
            // Check if we're dealing with different levels
            while($l > 0 && $stack[$l - 1]['level'] >= $item['level']) {
                array_pop($stack);
                $l--;
            }
            // Stack is empty (we are inspecting the root)
            if ($l == 0) {
                // Assigning the root child
                $i = count($nestedTree);
                $nestedTree[$i] = $item;
                $stack[] = &$nestedTree[$i];
            } else {
                // Add child to parent
                $i = count($stack[$l - 1]['children']);
                $stack[$l - 1]['children'][$i] = $item;
                $stack[] = &$stack[$l - 1]['children'][$i];
            }
        }
    }
    return $nestedTree;
}

jqTreeで完全に動作します...

于 2012-08-28T13:01:15.830 に答える
0

私は次のようにそれを解決しました:

public function getPageTreeAction() {

    $pagerepo = $this->getDoctrine()->getRepository('MyBundle:Page');
    $em = $this->getDoctrine()->getEntityManager();
    $query = $em
            ->createQueryBuilder()
            ->select('node')
            ->from('MyCorpBundle:Page', 'node')
            ->orderBy('node.root, node.lft', 'ASC')
            ->getQuery();

    $flatnodearray = $query->getArrayResult();
    $flatsimplenodearray = array();

    foreach ($flatnodearray as $currentNode) {
        $currentSimpleNode = array();

        $currentSimpleNode['id'] = $currentNode['id'];
        $currentSimpleNode['lft'] =$currentNode['lft'];
        $currentSimpleNode['rgt'] = $currentNode['rgt'];
        $currentSimpleNode['lvl'] = $currentNode['lvl'];
        $currentSimpleNode['title'] = $currentNode['title'];

        $flatsimplenodearray[] = $currentSimpleNode;
    }

    $tree = $pagerepo->buildTree($flatsimplenodearray);
    $response = new Response(json_encode($tree));
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}
于 2012-08-28T18:56:32.997 に答える