Cytat(dr_bonzo @ 2006-02-17 13:33:53)
szukaj: "drzewka sql", jest topic na forum (chyba przez rzseattle)
Dzieki - pomoglo

Jak sie okazuje temat bardzo ciekawy
Jako, że może się to komuś przydać to przedstawie rozwiązanie jakie zastosowalem...
Ponieważ generuję tylko menu (a więc relatywnie małą ilość danych) postanowiłem wykorzystać rekurencję.
Na początek baza danych:
CREATE TABLE `menu` (
`id` tinyint(3) NOT NULL AUTO_INCREMENT,
`parent_id` tinyint(3) NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=11 ;
INSERT
INTO `menu`
VALUES (1, 0, 'main_menu');
INSERT
INTO `menu`
VALUES (2, 1, 'O firmie');
INSERT
INTO `menu`
VALUES (3, 2, 'Nasza historia');
INSERT
INTO `menu`
VALUES (4, 2, 'Nasze plany');
INSERT
INTO `menu`
VALUES (5, 1, 'Produkty');
INSERT
INTO `menu`
VALUES (6, 1, 'Download');
INSERT
INTO `menu`
VALUES (7, 4, 'Pozniejsze plany');
INSERT
INTO `menu`
VALUES (8, 7, 'A w odleglej przyszlosci...');
INSERT
INTO `menu`
VALUES (9, 8, 'W odleglej galaktyce...');
INSERT
INTO `menu`
VALUES (10, 3, 'podmenu :)');
Jak widać wykorzystałem pole parent_id do określenia rodzica dla danej pozycji.
Oto funkcja rekurencyjna generująca menu:
<?php
function generate_menu($parentid)
{
$rs = db_query("SELECT * FROM menu WHERE parent_id = ".$parentid." ");
$count = db_num_rows ($rs);
if ( $count > 0 )
{
while ( $row = db_fetch_assoc($rs) )
{
$menu .= '<li><a href="#">'.$row['name'].'</a>';
$rs1 = db_query("SELECT * FROM menu WHERE parent_id = ".$row['id']." ");
$count1 = db_num_rows ($rs1);
if ( $count1 > 0 )
{
$menu .= "<ul>";
$menu .= generate_menu($row['id']);
$menu .= "</ul>";
}
$menu .= '</li>';
}
}
return( $menu );
}
?>
Kod jest specyficzny, bo muszę wygenerować specyficzny układ tagów <ul> i <li>, który to jest potem interpretowany przez skrypt JS wyświetlający menu.
Oto wywołanie generujące menu:
<?php
$menu='<ul id="udm" class="udm">'.generate_menu(1).'</ul>';
?>
Jak widać można wygenerować jedno lub kilka menu - w zależności który parent_id podamy jako argument funkcji... Poziom root dla danego menu tworzy element z parent_id = 0.
Oto wygenerowany kod:
Kod
<ul id="udm" class="udm">
<li><a href="#">O firmie</a>
<ul>
<li><a href="#">Nasza historia</a>
<ul>
<li><a href="#">podmenu :)</a></li>
</ul>
</li>
<li><a href="#">Nasze plany</a>
<ul>
<li><a href="#">Pozniejsze plany</a>
<ul>
<li><a href="#">A w odleglej przyszlosci...</a>
<ul>
<li><a href="#">W odleglej galaktyce...</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#">Produkty</a></li>
<li><a href="#">Download</a></li>
</ul>
Wiem, moze to wyglądać dziwnie ale jest dobrze - tak ma właśnie być

Jeśli ktoś potrzebuje podobne rozwiązanie to moje łatwo przerobić do własnych potrzeb...
Bardzo też proszę zainteresowanych o wskazówki i uwagi co można w tym rozwiązaniu ulepszyć...