Autor | Zpráva | ||
---|---|---|---|
Demoniak Profil |
Dobrý den,
používám na drobečkovou navigaci traverzování kolem stromu. Můj dotaz zní: dá se nějak pomocí toho vytvořit rozbalovací menu? Případně poprosím nakopnout jak. Samotné menu jako celek z DB vypsat umím, jen mě nenapadá jak z toho vytvořit rozbalovací. U traverzování kolem stromu jsem čerpal z http://php.vrana.cz/traverzovani-kolem-stromu-prakticky.php |
||
Oison Profil |
#2 · Zasláno: 26. 2. 2013, 20:13:20
Zdravííím.
http://interval.cz/clanky/metody-ukladani-stromovych-dat-v-relacnich-databazich/ Koukni na obrázek u titulku "Traverzování kolem stromu". Zásadní jsou hodnoty RGT a LGT, které jsou tam naznačeny. Pokud to z toho nepochopíš, tak pod tím jsou nějaké dotazy, které ten strom vypisují. Není to zrovna jednoduché, ale když pochopíš princip, tak nemáš problém. V podstatě se ptáš na tenhle dotaz: SELECT NAME, LFT, RGT FROM TREE WHERE LFT BETWEEN '.$row['LFT'].' AND '.$row['RGT'].' ORDER BY lft ASC'); Ale bez kontextu ti je docela k ničemu. Doporučuju si přečíst ten článek celej. |
||
Časová prodleva: 7 dní
|
|||
Demoniak Profil |
#3 · Zasláno: 5. 3. 2013, 19:48:26
Dobrý večer, omlouvám se za delší odmlku, byl jsem mimo pracovní PC. něco jsem sesmolil ale nemám ponětí jak pokračovat dál ve stromu tak, aby se menu rozklikávalo postupně
(tzn. pokud mám Komponenty zdroje bla blablabla zákl. desky intel AMD blablablabla Celé PC ASUS ACER tak aby po rozkliknutí např Komponentů zobrazily pouze zdroje a zákl. desky bez podkategorií. To samé když pak kliknu na zákl. desky tak aby se objevilo pouze intel a AMD.) Prozatím neřeším v menu cestu směrem k rodiči ( dle mého bych to nechal až pokud rozjedu menu směrem dolů) :) zde je php: function getTree($kat) { $result = mysql_query('SELECT * FROM strom WHERE parent_id = 1 ORDER BY lfg ASC'); while($row = mysql_fetch_array($result)){ if ($_GET['kat'] == $row['url'] or $_GET['page'] == $row['url']){ $a = ""; $aend = ""; }else{ $a = "<a href='".SERVER.$row['slozka'].$row['url'].".html'>"; $aend = "</a>"; } echo $a."<div class='menu' style='background:#A60000;color: #FF7373;text-decoration: none;'>".$row['name']."</div>".$aend; if ($_GET['kat'] == $row['url'] or $_GET['page'] == $row['url']){ $pid=$row['parent_id'] + 1; $podrazene = mysql_query('SELECT * FROM strom WHERE lfg BETWEEN '.$row['lfg'] .' AND '.$row['rgt'].' ORDER BY lfg ASC'); while($pod=mysql_fetch_array($podrazene)){ if ($pod['parent_id'] == $pid){ if ($_GET['kat'] == $pod['url'] or $_GET['page'] == $pod['url']){ $a = ""; $aend = ""; }else{ $a = "<a href='".SERVER.$pod['slozka'].$pod['url'].".html'>"; $aend = "</a>"; echo $a."<div class='menu' style='background:#A60000;color: #FF7373;text-decoration: none;'>".$pod['name']."</div>".$aend; } } //echo $a."<div class='menu' style='background:#A60000;color: #FF7373;text-decoration: none;'>".$pod['name']."</div>".$aend; } } } } |
||
Tori Profil |
Já jsem si ukládala i úroveň zanoření. Pak by to bylo:
mysql_query('SELECT * FROM strom WHERE lfg BETWEEN '.$row['lfg'].' AND '.$row['rgt'].' AND level = '.($row['level']+1).'ORDER BY lfg ASC'); |
||
Demoniak Profil |
#5 · Zasláno: 5. 3. 2013, 21:37:08
Ano jistě, omlouvám se za chybný kod, parent_id funguje stejně jako level. Při navrhování tabulky jsem si původně chtěl zapisovat id rodiče, z toho sešlo a už jsem prozatím neupravil název sloupce.
omlouvám se za neinformovanost. |
||
Demoniak Profil |
#6 · Zasláno: 6. 3. 2013, 19:20:13
tak něco jsem poupravil ovšem teď mi to vypisuje vše co je v DB, takže je vesměs celá funkce k ničemu.
Pomůžete prosím někdo? :) function getTree($kat) { $result = mysql_query('SELECT * FROM strom WHERE parent_id = 1 ORDER BY lfg ASC'); // parent_id je stejné jako level zanoření while($row = mysql_fetch_array($result)){ if ($_GET['kat'] == $row['url'] or $_GET['page'] == $row['url']){ $a = ""; $aend = ""; }else{ $a = "<a href='".SERVER.$row['slozka'].$row['url'].".html'>"; $aend = "</a>"; } echo $a."<div class='menu'>".$row['name']."</div>".$aend; $max=mysql_fetch_row(mysql_query('SELECT MAX(parent_id) FROM strom WHERE lfg BETWEEN '.$row['lfg'] .' AND '.$row['rgt'].' LIMIT 1')) or die (mysql_error()); for ($pid = 2; $pid <= $max[0]; $pid++ ){ echo $pid; $podrazene = mysql_query('SELECT * FROM strom WHERE lfg BETWEEN '.$row['lfg'] .' AND '.$row['rgt'].' ORDER BY lfg ASC') or die (mysql_error()); while($pod=mysql_fetch_array($podrazene)){ if ($pod['parent_id'] == $pid){ if ($_GET['kat'] == $pod['url'] or $_GET['page'] == $pod['url']){ $a = ""; $aend = ""; }else{ $a = "<a href='".SERVER.$pod['slozka'].$pod['url'].".html'>"; $aend = "</a>"; }echo $a."<div class='menu'>".$pod['name']."</div>".$aend; } } } }} |
||
Tori Profil |
Demoniak:
|
||
Kcko Profil |
#8 · Zasláno: 6. 3. 2013, 19:58:02
Je skutečně nutné to traverzování? S uložením do pole a následným výpisem či rozbalováním to mám již hotové
http://sandbox.rjwebdesign.cz/dbmenu/pg.php |
||
Demoniak Profil |
#9 · Zasláno: 6. 3. 2013, 20:00:53
Kcko:
Takhle nějak si to představuji, traverzování jsem zvolil, protože to bude součástí eshopu a přišlo mi to jako nejlepší řešení, pokud ovšem mi to nevyvrátíte :) |
||
Kcko Profil |
#10 · Zasláno: 6. 3. 2013, 20:04:41
Demoniak:
Mno ... to traverzování mi přišlo poněkud složité při práci se zadáváním nové položky, nebo při mazání (přepočet ranku atd..) Takže já si jedním dotazem načtu do pole vše (celou strukturu) a poté rekurzivně vypisuji. Mám ted eshop kde je cca 2500 produktů a asi 400 kategorií a skutečně tam nevidím problém s výkonem. |
||
juriad Profil |
#11 · Zasláno: 6. 3. 2013, 20:12:55
V této prezentaci jsou od strany 49 popsané všechny způsoby, jak uchovávat stromové struktury. Osobně používám path enumeration.
Při desítkách kategorií je obecně jedno, jaký přístup se vybere. Spíše jde o to, vybrat takový, který bude mít poměr "jednoduchost implementace"/"jednoduchost použití" co nejlepší. |
||
Demoniak Profil |
#12 · Zasláno: 6. 3. 2013, 20:13:04 · Upravil/a: Demoniak
To by mohlo stačit, jen jsem se bál toho zatěžování serveru
juriad: A pokud použiju path enumeration, musím stejně použít rekurzivní funkci? |
||
Kcko Profil |
#13 · Zasláno: 6. 3. 2013, 20:41:36
Demoniak:
Na rekurzi se bojíš čeho, smím-li se zeptat? |
||
Demoniak Profil |
#14 · Zasláno: 6. 3. 2013, 21:13:25
Kcko:
Ničeho, jen co pročítám tak je pár lidí proti, už na tom pracuji, asi to bude lepší než se patlat s traverzováním. Ovšem šlo by mi to rychleji, kdyby jste byl ochoten mi zpřístupnit Váš kód :) |
||
Kcko Profil |
#15 · Zasláno: 6. 3. 2013, 22:44:42
Demoniak:
Pošli mi email, pošlu Ti to. /Resp. napiš mi na můj email v profilu/ |
||
Demoniak Profil |
#16 · Zasláno: 6. 3. 2013, 23:51:58
Tak email jsem zde nenašel, tak jsem napsal na ten co máte na webu rjwebdesign.cz
|
||
Časová prodleva: 11 let
|
0