2011-02-03 21 views
2

データベースにコンテンツページがあり(ネストされたセットを使用)、jQuery jsTreeプラグインで表示する必要があります。このようなデータをJSONを返す必要があります:ネストされたセット(perl、sql、jquery)からJSONを生成

[ 
    { 
     data: 'node1Title', 
     children: [ 
      { 
       data: 'subNode1Title', 
       children: [...] 
      }, 
      { 
       data: 'subNode2Title', 
       children: [...] 
      } 
     ] 
    }, 
    { 
     data: 'node2Title', 
     children: [...] 
    } 
] 

私はそれを行うために必要なもの?

ハッシュの配列をJSONに変換できますが、配列の生成方法はわかりません。

サンプルデータ:

**'pages'table** 
id parent_id level lkey rkey name 
1 0  1 1 14 index 
2 1  2 2 7 info 
3 1  2 8 13 test 
4 2  3 3 4 about 
5 2  3 5 6 help 
6 3  3 9 10 test1 
7 3  3 11 12 test2 

私が取得する必要があります:

[ 
    { 
     data: 'index', 
     children: [ 
      { 
       data: 'info', 
       children: [ 
        { 
         data: 'about' 
        }, 
        { 
         data: 'help', 
        } 
       ] 
      }, 
      { 
       data: 'test', 
       children: [ 
        { 
         data: 'test1' 
        }, 
        { 
         data: 'test2' 
        } 
       ] 
      } 
     ] 
    } 
] 
+0

あなたの質問を明確にしてください。 PerlからJSONを生成する必要がありますか?あなたが持っているデータのサンプルを、あなたがすでに提供している出力とともに投稿できますか? –

答えて

2

私は正確に同じ問題を抱えていたし、ここで私はJSONオブジェクトに私の入れ子集合のツリーを変換するために、Perlで書いたものですjsTreeプラグイン用(私はDBIx :: Tree :: NestedSetを使ってMySQLデータベースツリーにアクセスしています)。私のコードはPerlの観点からは醜いが、それは私のために働く。

sub get_json_tree { 
    my $json = '['; 
    my $first = 1; 
    my $last_level = 1; 
    my $level = 1; 
    my $tree = DBIx::Tree::NestedSet->new(dbh => $dbh); 
    my $ancestors = $tree->get_self_and_children_flat(id => $tree->get_root); 
    foreach (@{$ancestors}) { 
     my $name = $_->{'name'}; 
     $last_level = $level; 
     $level = $_->{'level'}; 
     if ($level > $last_level) { 
      $json .= ',' if ($json =~ /}$/); 
     } elsif ($level < $last_level) { 
      $json .= ']}'; 
      for (my $i = 0; $i < $last_level - $level; $i++) { 
       $json .= ']}'; 
      } 
      $json .= ','; 
     } elsif ($level == $last_level && !$first) { 
      $json .= ']},'; 
     } 
     $json .= '{"attr":{"id":'.$_->{'id'}.',"rel":"folder"},"data":"'.$name.'","children":['; 
     $first = 0; 
    } 
    $json .= ']}'; 
    for (my $i = 1; $i < $level; $i++) { 
     $json .= ']}'; 
    }  
    $json .= ']'; 
    return $json; 
} 
1

私はそれを探しています。おそらく、DataTableプラグインの例が解決策を提供します。私は、プラグインディレクトリ/examples/server_side/scripts/ssp.class.phpを見ています。あなたはdownload it hereです。

this documentationの「サーバー側スクリプト」ラベルで使用する最も簡単な方法をご覧ください。

1

これは非常に簡単です。あなたは再帰関数を書く必要があります。私はPerlで書いた。 $ list - これは 'left_key'でソートされた配列です。

sub make_tree { 
    my $list = shift; 
    my @nodes; 

    while (my $node = shift @$list) { 
     if (@$list and $node->{level} < $list->[0]{level}) { 
      $node->{data} = make_tree($list); 
      push @nodes, $node; 
     } 
     last if @$list and $node->{level} > $list->[0]{level}; 
    } 

    return \@nodes; 
} 

my $hash = make_tree($list); 
0

最近、私は同様の解決策を探していました。私は自分の質問を投稿するまでこれを見つけませんでした。私が質問に投稿した最終的なコードはあなたの質問にうまく答えると思います。

私はDBIx::Tree::NestedSetの変更バージョンで次のコードを使用しています。このコードを使用して、ネストされたセットツリーのJSON出力を作成します。

Convert a flat datastructure into a tree

sub get_jsonTree { 
    my ($array_of_hashes_ref) = @_; 

    my $roots; 
    my %recs_by_name; 
    my %children_by_parent_name; 
    my %count; 
    for my $row (@$array_of_hashes_ref) { 
     my $name  = $row->{position_id}; 
     my $parent_name = $row->{placement_id}; 

     my $rec = { 
      name => $name, 
     }; 

     ## Added to loop through all key,value pairs and add them to $rec 
     while (my ($key, $value) = each(%$row)) { 
      $rec->{$key} = $value; 
     } 

     ##Added To Count Child Nodes 
     $count{$parent_name} = 0 if (!$count{$parent_name});   
     $rec->{'child_count'} = $count{$parent_name}; 
     $count{$parent_name}++; 

     push @{ $children_by_parent_name{$parent_name // 'root'} }, $rec; 
     $recs_by_name{$name} = $rec; 
    } 

    $roots = delete($children_by_parent_name{root}) || []; 

    for my $name (keys(%children_by_parent_name)) { 
     my $children = $children_by_parent_name{$name}; 
     if (my $rec = $recs_by_name{$name}) { 
      $rec->{children} = $children; 
     } else { 
      $util{'test'} .= "Parent $name doesn't exist.\n<BR>"; 
      push @$roots, @$children; 
     } 
    } 

    use JSON; 
    my $json_str = encode_json(@{$roots}[0]); 

    return $json_str; 
} 

my $array_of_hashes_ref = [ 
    { position_id => 123, placement_id => undef }, 
    { position_id => 456, placement_id => 123 }, 
    { position_id => 789, placement_id => 123 }, 
    # ... 
]; 

my $json_str = &get_jsonTree($array_of_hashes_ref); 
関連する問題