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
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.
Demoniak
Profil
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
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
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:
Co to má zobrazit - všechny položky z nejvyšší úrovně stromu s rozbalenou cestou od nejvyšší úrovně až ke kliknuté položce + její potomky o jednu úroveň níž? Zbytečná otázka. Napadlo mě jen ne moc pěkné rekurzivní řešení, takže radši nic.
Kcko
Profil
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
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
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
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
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
Demoniak:
Na rekurzi se bojíš čeho, smím-li se zeptat?
Demoniak
Profil
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
Demoniak:
Pošli mi email, pošlu Ti to. /Resp. napiš mi na můj email v profilu/
Demoniak
Profil
Tak email jsem zde nenašel, tak jsem napsal na ten co máte na webu rjwebdesign.cz

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0