Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) perl+ms sql создание дерево меню из данных sql / 25 сообщений из 25, страница 1 из 1
16.05.2005, 13:47
    #33067090
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
есть база в sql, в ней 7 таблиц которые отвечают за 7 разных меню.
нужно на перле написать запрос \или не запрос\ для вывода меню, но в виде дерева

menu1
|-submenu1
|-submenu2
|--submenu21
....
|-submenuN
...
menu2
|-submenuN
...
|----submenu3

и так далее...
какие таблицы в базе еще создать?
есть:
id - порядковый номер
menu - название меню
url_menu - ссылка на меню
Код: plaintext
1.
2.
$url_menu = $Data{'url_menu'};
$menu = $Data{'menu'};
print "<a href=$url_menu>$menu</a>";
...
Рейтинг: 0 / 0
16.05.2005, 13:50
    #33067098
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
vidoqкакие таблицы в базе еще создать?
есть:
id - порядковый номер
menu - название меню
url_menu - ссылка на менюВариант 1. Добавить поле parent_id (id родителя)
Вариант 2. Nested sets - http://www.getinfo.ru/article610.html + http://www.getinfo.ru/article689.html
...
Рейтинг: 0 / 0
16.05.2005, 13:57
    #33067119
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
про parent_id все понятно! мне сразу так сказали сделать!
просто я понять не могу как это сделать!!!
добавлю я парент ид а дальше что, что в коде писать чтобы деревце появилось такое?!

Nested sets не подходит, там отдельный модуль, такое не преведствуется!!!
...
Рейтинг: 0 / 0
16.05.2005, 14:15
    #33067179
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
vidoqдобавлю я парент ид а дальше что, что в коде писать чтобы деревце появилось такое?!А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.Nested sets не подходит, там отдельный модуль, такое не преведствуется!!!Бред какой.
...
Рейтинг: 0 / 0
16.05.2005, 14:27
    #33067234
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
*А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.
блин про рекурсии я тоже слышал, но что читать то именно?! как устроенно это все?! я вообще можно сказать с таким сталкиваюсь только сейчас, и понять все и сразу пока сложновато...

*Бред какой.
да нет почему бред, все очень даже логично! зачем использовать еще что то. если на перле функций встроенных хватает чтобы этакое написать!!!
...
Рейтинг: 0 / 0
16.05.2005, 14:43
    #33067298
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
vidoq *А дальше выводите дерево. Что такое рекурсивные алгоритмы вам известно? Нет? Читайте материал в интернете.
блин про рекурсии я тоже слышал, но что читать то именно?! как устроенно это все?! я вообще можно сказать с таким сталкиваюсь только сейчас, и понять все и сразу пока сложновато...Начинать надо с простого. Вам похоже вообще программирование пока не знакомо. А вы сразу за такие дела берётесь. *Бред какой.да нет почему бред, все очень даже логично! зачем использовать еще что то. если на перле функций встроенных хватает чтобы этакое написать!!!А там что, не на perl'е примеры? И если есть встроенные - так используйте - сюда то зачем пришли? Носом в мануал - и вперёд, использовать встроенные функции.
...
Рейтинг: 0 / 0
16.05.2005, 14:45
    #33067303
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
И вообще по первой ссылке приведена теория. На чём вы её будете реализовывать (хоть на BC++) - никакого значения не имеет.
...
Рейтинг: 0 / 0
17.05.2005, 15:37
    #33069831
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
добавил поле parent и еще одно level
parent - к кому принадлежит
level - глубина меню

далее хотелось использовать так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select * from menu where parent='$parent' and level='$level' order by parent, level

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

далее я пишу
$x = $parent <=  0 ;
if ($x) {
print "(id)\n(menu\n(parent)<br>)"; #простая таблица выводит порядковый номер, название меню и к кому меню пренадлежит если  0  то меню главное если  1  то подглавное ... итд...

print "($Data{'id'}) \n $Data{'menu'} \n ($Data{'parent'})";
retrun $x;
} else { retrun $x- 1 *$x;

}

в конце концов он мне выводит первую строчку из базы вида
(1)название меню(0)
и все, + в отладке пишет что неможет передовать $x... вроде как я понял!!!

что добавить как доработать?
...
Рейтинг: 0 / 0
18.05.2005, 07:25
    #33070984
BonJorno
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
а лучше зайди в ветку mssql, там этого добра много обсуждается. А perl тут вобщем-то сбоку-припёку. Грамотная процедура выдаст тебе меню в любом виде, а клиент может быть любой.
...
Рейтинг: 0 / 0
18.05.2005, 07:39
    #33070996
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
нет я конечно понимаю, просто с запросом то чего и откуда брать как сортировать у меня все впорядке.
а вот perl то как раз мне больше нужен чем mssql.
запрос то из перла делать, знал бы как делать вопросов бы не было!
...
Рейтинг: 0 / 0
18.05.2005, 07:42
    #33070997
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
у менян тут опечатка в коде
нужно так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select * from menu where parent='$parent' and level='$level' order by parent, level

...

$x = $parent <=  0 ;
if ($x) {
print "(id)\n(menu\n(parent)<br>)"; 
print "($Data{'id'}) \n $Data{'menu'} \n ($Data{'parent'})";
return $x;
} else { return ($x- 1 )*$x;

}

...
Рейтинг: 0 / 0
18.05.2005, 10:42
    #33071338
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#!!!!
# select * from menu order by parent, level
#!!!!
my @top;
my %recs;
while($O->FetchRow()){
        my %Data = $O->DataHash();
        my $dataRef=\%Data;
        my $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
}
foreach my $dataRef (values %recs){
        my $parent=$dataRef->{parent};
        if($recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }

}
#id - уникальный номер
#parent - родитель \верхний = 0  т.к. он без родителя\
#url_menu - ссылка на меню
#menu - название меню
print "<ol>";
for my $menu (@top){
        out_menu($menu);
}
print "</ol>";
sub out_menu{
        my $menu=shift;
        my %hash=%{$menu};
        print "<li> <a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for my $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}


---
"Raffiniert ist der Herr Gott, aber boshaft ist Er nicht." Albert Einstein
...
Рейтинг: 0 / 0
18.05.2005, 12:46
    #33071770
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
интересное кино, скрипт поставил -> спасибо.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
----------------
начало скрипта
----------------
#connecting to sql server -> to database
$DSN = 'SERVER=developer;DRIVER={SQL Server};DATABASE=alb;' ;
if (!($O = new Win32::ODBC($DSN))){
	print "Failure. \n\n";
	print Win32::ODBC::Error();
	exit();
}

$O->Sql("select * from menu where parent='$parent' order by parent, level");
@top;
%recs;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef=\%Data;
        $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
}
foreach $dataRef (values %recs){
        $parent=$dataRef->{parent};
        if($recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }

}
print "<ol>";
for $menu (@top){
        out_menu($menu);
}
print "</ol>";
sub out_menu{
        $menu=shift;
        %hash=%{$menu};
        print "<li> <a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}

но проблема в том что он не отображает меню как надо!

он отображает в виде:
1. Технико-экономическое планирование
2. Технико-экономическое планирование
3. Технико-экономическое планирование
4. Технико-экономическое планирование
5. Технико-экономическое планирование
6. Технико-экономическое планирование
7. Технико-экономическое планирование

причем само "Технико-экономическое планирование" - стоит в id=42 \это самое последнее меню\
а вед до id=42 есть еще меню. Хотя кол-во определенно верно (7).

но и под меню еще не выводятся..(((
...
Рейтинг: 0 / 0
18.05.2005, 12:59
    #33071828
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Небольшой bugfix:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
$O->Sql("select * from menu order by parent, level");
@top;
%recs;
@all_ids;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef=\%Data;
        $id=$dataRef->{id};
        $recs{$id}=\%Data;
        $recs{$id}{children}=[]; #анонимный массив
        push @top, $dataRef unless ($dataRef{parent});
        push @all_ids, $id;
}
foreach $id (@all_ids ){
        $dataRef=$recs{$id}
        $parent=$dataRef->{parent};
        if(defined $recs{$parent}){
                push @{$recs{$parent}->{children}}, $dataRef;
        }
}
...
Рейтинг: 0 / 0
18.05.2005, 13:03
    #33071841
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Ещё bugfix:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef={%Data};
        $id=$dataRef->{id};
        $recs{$id}=$dataRef;
        $recs{$id}{children}=[]; 
        push @top, $dataRef unless ($dataRef{parent});
        push @all_ids, $id;
}
...
Рейтинг: 0 / 0
18.05.2005, 14:52
    #33072308
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
сделал все как ты написал!
только вот проблемка...

когда он выводит меню, то он выводит все id начиная с 1 до 49 \их всего столько\
причем 1-7 меню он выводит нормально, со всеми подменю...
а остальные он начинает новый рекурсивный запрос, и занова проходится по id хотя берет он их уже с parent - вроде.
я думал как бы все это сделать, так и не додумал..(((
...
Рейтинг: 0 / 0
18.05.2005, 19:21
    #33073169
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Ляпни сюда аттачментом архив с полным кодом скрипта + пример вывода.
А то, блин, игра "черный ящик" получается :)
...
Рейтинг: 0 / 0
19.05.2005, 08:35
    #33073595
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
вот держи, описалово внутри!
...
Рейтинг: 0 / 0
19.05.2005, 10:40
    #33073884
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
По поводу глюков сравнения - надо локальные переменные объявлять как my
...
Рейтинг: 0 / 0
19.05.2005, 13:22
    #33074483
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
блин а ты прав)
спасибо.
только вот проблема то та осталась, он все равно выводит мне меню равно всем id из базы!
т.е. меню то отображается все \ну ты видел\
а вот дальше уже идет зацикливание и выводятся все остальные ид...(((
как сделать? смотрели смотрели на скрипт, короче ничегог плохого в нем не увидели. в базе тоже все отлично, левых ссылок и ссылок на самого себя нет.
короче не знаем что и делать.
...
Рейтинг: 0 / 0
19.05.2005, 13:35
    #33074534
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Я протупил. Нужно чуть исправить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
foreach $id (@all_ids ){
        $dataRef=$recs{$id};
        $parent=$dataRef->{parent};
#!!!!!
        if(ref $recs{$parent}){ #!!!! тут я ошибся :(
#!!!!
               push @{$recs{$parent}->{children}}, $dataRef;
        }
}
Приношу извинения за столь глючные решения :(
...
Рейтинг: 0 / 0
19.05.2005, 14:34
    #33074773
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
да не насчет глючных - это пустяки!
а вот то что он все равно не работает .... это да)))
bugfix не помог, может что то другое в нем поменять?
все равно также выводит огромное меню....(((
...
Рейтинг: 0 / 0
19.05.2005, 14:49
    #33074825
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Код: plaintext
       print "<li><a href=test.pl?current=$hash{id}&depth=2>$hash{menu}</a>";
Смысл:
current - какое подменю развернуть
depth - как глубоко - сколько подуровней показывать

P.S. Вот эта строка if(ref $recs{$parent}){ должна была привести к выводу только 7 корневых пунктов.
...
Рейтинг: 0 / 0
19.05.2005, 14:51
    #33074838
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
Ещё fix:
Код: plaintext
push @top, $dataRef unless ($dataRef->{parent});
...
Рейтинг: 0 / 0
19.05.2005, 15:59
    #33075061
vidoq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) perl+ms sql создание дерево меню из данных sql
СУПЕР!!!
все стало нормально работать!!!
СПАСИБО тебе ХМ:)

база - id, parent, url_menu, menu
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
если кому то нужен код общий вот он:
------------------------------------
use Win32::ODBC ;
use CGI ;
$q = new CGI ;

print <<EOF ;   
Content-type: text/html\n\n
<html>
<head>
<title>site map axion.com</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<style type="text/css">
<!--
body {
	margin-left: 0px;
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 0px;
	background-image: url(http://www.axion.com/samples/images/backgrnd.gif);
}
.style5 {font-size: 14px}
.style8 {
	color: # 000000 ;
	font-weight: bold;
}
.style9 {color: # 990000 }
.style10 {font-weight: bold}
.style11 {color: # 990000 ; font-weight: bold; }
.style12 {font-size: 18px; font-weight: bold; }
.style13 {color: # 660000 }
-->
</style></head>
<body>
EOF

#connecting to sql server -> to database----------------------------------------------------------------#
$DSN = 'SERVER=developer;DRIVER={SQL Server};DATABASE=alb;' ;
if (!($O = new Win32::ODBC($DSN))){
	print "Failure. \n\n";
	print Win32::ODBC::Error();
	exit();
}

#creating menu------------------------------------------------------------------------------------------#
$O->Sql("select * from menu order by parent");
@top;
%recs;
@all_ids;
while($O->FetchRow()){
        %Data = $O->DataHash();
        $dataRef={%Data};
        $id=$dataRef->{id};
        $recs{$id}=$dataRef;
        $recs{$id}{children}=[]; 
        push @top, $dataRef unless ($dataRef->{parent});
        push @all_ids, $id;
}

foreach $id (@all_ids ){
        $dataRef=$recs{$id};
        $parent=$dataRef->{parent};
        if(ref $recs{$parent}){
        push @{$recs{$parent}->{children}}, $dataRef;
        }
}

#menu---------------------------------------------------------------------------------------------------#
print "<ol>";
for $menu (@top){
    out_menu($menu);
}
print "</ol>";

sub out_menu{
    my $menu=shift;
    my %hash=%{$menu};

       print "<li><a href=$hash{url_menu}>$hash{menu}</a>";
        if(scalar @{$hash{children}}){
                print "<ol>";
                for my $submenu (@{$hash{children}}){
                        out_menu($submenu);
                }
                print "</ol>";
        }
        print "</li>";
}
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) perl+ms sql создание дерево меню из данных sql / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]