LINUX.ORG.RU

[perl][sql][jstree][nested-sets] Вывод содержимого таблицы в виде дерева

 ,


0

1

Для хранения структуры страниц использую модель nested sets. Данные для примера:

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

Получаю ветку таким запросом (SQL::Abstract, $db->query($sql)->hashes()):

SELECT id, parent_id, level, lkey, rkey, name
FROM   pages
WHERE  lkey > $lkey AND
       rkey < $rkey
ORDER BY rkey

Не могу сообразить, как из полученного хеша получить структуру для jsTree т.е. примерно такую:

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

Второй день туплю с этими деревьями :(

★★

Скопипасть куда-нибудь результат выполнения:

eval {
    use Data::Dumper;
    print \%myhash;
};
где %myhash — имя переменной, в которую ты заносишь выборку после выполнения запроса.

ivano
()

#!/usr/bin/perl

use strict;
use Data::Dumper;

my @hashes = (
    {
        'id'            => 1,
        'parent_id'     => 0,
        'name'          => 'index',
    },
    {
        'id'            => 2,
        'parent_id'     => 1,
        'name'          => 'info'
    },

    {
        'id'            => 3,
        'parent_id'     => 1,
        'name'          => 'test'
    },
    {
        'id'            => 4,
        'parent_id'     => 2,
        'name'          => 'about'
    },
    {
        'id'            => 5,
        'parent_id'     => 2,
        'name'          => 'help'
    },
    {
        'id'            => 6,
        'parent_id'     => 3,
        'name'          => 'test1'
    },
    {
        'id'            => 7,
        'parent_id'     => 3,
        'name'          => 'test2'
    },
);


sub makeTree{
    my $hashes = shift;
    my $tree = shift;
    my $pid = shift || 0;
    foreach my $h(@{$hashes}){
        next if $h->{'parent_id'} != $pid;
        my $ind = push @{$tree}, { 'data' => $h->{'name'}, 'id' => $h->{'id'}, 'pid' => $h->{'parent_id'}, 'children' => [] };
        makeTree( $hashes, $tree->[$ind-1]{'children'}, $h->{'id'} );
    }
    return $tree;
}

my $tree = [];
makeTree(\@hashes, $tree );
$Data::Dumper::Pair = ":";
print Dumper($tree);

Out:

$VAR1 = [
          {
            'pid':0,
            'children':[
                            {
                              'pid':1,
                              'children':[
                                              {
                                                'pid':2,
                                                'children':[],
                                                'id':4,
                                                'data':'about'
                                              },
                                              {
                                                'pid':2,
                                                'children':[],
                                                'id':5,
                                                'data':'help'
                                              }
                                            ],
                              'id':2,
                              'data':'info'
                            },
                            {
                              'pid':1,
                              'children':[
                                              {
                                                'pid':3,
                                                'children':[],
                                                'id':6,
                                                'data':'test1'
                                              },
                                              {
                                                'pid':3,
                                                'children':[],
                                                'id':7,
                                                'data':'test2'
                                              }
                                            ],
                              'id':3,
                              'data':'test'
                            }
                          ],
            'id':1,
            'data':'index'
          }
        ];

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.