ugrás a tartalomhoz

Menü php-mysql

agyergorcs · 2010. Feb. 18. (Cs), 21.21
Hali!

Egy egyszerűbb hierarchikus menüvel küzdök, tákolgatom, már nagyjából működik csak még mindig nem olyan amilyennek lennie kéne és ebben kérném a segítségeteket.

íme a kód:

function nyitZar(x) {
							if (document.getElementById("T"+x).style.display=='none')
						   	document.getElementById("T"+x).style.display='block'
						  	else
						   	document.getElementById("T"+x).style.display='none'
						}

<?php

				function kiir($szoveg,$pid) {
					$sql="select * from lista where parentID=$pid";
					$rs=mysql_query($sql);
										
					if (mysql_num_rows($rs)==0) {
					   echo ($pid>0)?$szoveg."</a>\n":"";
					}
					else {
						echo ($pid>0)?'<a href="#" onclick="nyitZar('.$pid.')">'.$szoveg."</a>\n":"";
					};
					echo '<table cellspacing="5" id="T'.$pid.'">';
					while ($sor=mysql_fetch_array($rs)) {
					   echo "<tr><td>\n";   
					   kiir($sor['szoveg'],$sor['id']);
					   echo "</td></tr>\n";
					};
					
					echo "</table>\n";
				};
																
				kiir("",0);
				?>
És az adatbázis:

CREATE TABLE IF NOT EXISTS `lista` (
`id` int(4) NOT NULL auto_increment,
`parentID` int(4) NOT NULL,
`szoveg` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;

--
-- Tábla adatok: `lista`
--

INSERT INTO `lista` (`id`, `parentID`, `szoveg`) VALUES
(1, 0, 'gyümölcs'),
(2, 0, 'auto'),
(3, 1, 'alma'),
(4, 1, 'Körte'),
(5, 3, 'starking'),
(6, 3, 'jonatán'),
(7, 0, 'Ország'),
(8, 2, 'opel'),
(9, 2, 'Skoda'),
(10, 8, 'astra'),
(11, 8, 'kadett');


Az a problémám, hogy amikor megnyitom az oldalt, nyitva van az összes ág valamiért és amelyik menünek nincs almenüje arra nem lehet kattintani. Majd különböző termékek lesznek bennük és attól, hogy nincs almenüje még lehet benne termék...

Előre is köszi a segítséget
 
1

8. sor: az A taget csak

h31st · 2010. Feb. 19. (P), 07.32
8. sor: az A taget csak lezárod, nem nyitod meg, így természetesen nem lehet rá kattintani :)
ha alapból zárva akarod megjeleníteni, akkor mondjuk a 13. sorban a TABLE -be rakj egy style attribútumot amiben a display értékét none-ra rakod (bocs, direkt nem a kész megoldást írom! :). azt utána majd tudod a style-t manipulálgatni... viszont ezzel még az lesz a baj, hogy a legfeleső szinten is kiraksz egy nyitzar linket, aminek viszont nincs szövege, így nem lehet rákattintani, és nem tudsz kinyitni semmit. :) megberhelhető, hogy a 0. szinten ne rakd bele a table-be a style attribot...
2

Ja igen, lemaradt:) és hogy

agyergorcs · 2010. Feb. 19. (P), 12.56
Ja igen, lemaradt:)
és hogy tudnám megoldani, hogy a gyökérmenüket külön kezeljem az almenüktől? Csak úgy működhetne a display none
3

a kiir() -en belül már most

h31st · 2010. Feb. 19. (P), 21.12
a kiir() -en belül már most is külön van kezelve a $pid> -val ezt a table -nél is megteheted (csak akkor rakja bele, ha nem 0), de ezt írtam a végén
vagy mondjuk csinálsz egy kiir0() függvényt ami a gyökeret írja ki, és a kiir() -t hivogatja a többihez ? itt mondjuk teljesen felesleges, csak ha teljesen másképp akarnád kezelni azt a részt...

egyébként ha kész és működik, javaslom a jQuery áttanulmányozását, abban egy sima toggle() -el egy sorban megoldható, amit te most a style.display vizsgálatával csinálsz 3ban.
4

Elnézést, de egy kicsit

Baldric · 2010. Feb. 19. (P), 23.55
Elnézést, de egy kicsit befolyok a témába egy kapcsolódó kérdéssel.
Sokat gondolkoztam, hogy hierarchikus kategórialistához melyik megoldást válasszam, használtam már parentID-s módszert és a nested set model-t is, de igazából egyik sem tetszik, utóbbi a bonyolultsága, előbbi a rekurzív függvényhívásokban lévő adatbázis lekérdezések miatti rossz hatékonysága miatt.
Jelenleg a parentID-s módszert használom, annyi módosítással, hogy kategóriatábla kiolvasása nem rekurzív, csak a kiíratása, és kíváncsi lennék, hogy szerintetek ennek a megközelítésnek van-e értelme. Szóval van egy olyan táblám mint a fönti, kiolvasom az egész táblát, majd végrehajtom a következőket:

// A $kategoria_tomb tömb a teljes kategória adattábla tartalma
foreach($kategoria_tomb as $list_elem):
    // a következő sor minden kategóriát eltárol egy tömbben a parent_id-t használva indexnek
    $kategoriak[$list_elem->parent_id][] = $list_elem;
endforeach;

foreach($kategoria_tomb as $list_elem):
    //ha az adott kategória szülője egy másik kategóriának, akkor...
    if(isset($kategoriak[$list_elem->id])){
        //ebbe a kategóriába elhelyezi az összes gyermek kategóriát
        $list_elem->child = $kategoriak[$list_elem->id];
    }
endforeach;
ezzel létrejött egy tömb, aminek az első eleme tartalmazza az összes főkategóriát, ezek a főkategóriák meg a saját alkategóriájukat, sajnos ezt kiíratni még mindig rekurzívan érdemes.
Az, hogy mindig a teljes kategórialistát kiolvassa, valamint hogy minden szülő elem el van tárolva a tömbben jelenleg szerintem nem hátrány, mert mindig szükségem van a teljes kategórialistára, és időnként külön az alkategóriákra is.
Nem teszteltem ezt a megoldást a nested set modellel szemben, biztosan lassabb, de szerintetek jelentősen?
A fenti rekurzív lekérdezéses módszernél biztosan gyorsabb (a teljes kategórialista lekérdezése, a fenti kódrészlet futtatása, és a rekurzív kiíratása összesen annyi idő, mint kettő egy soros lekérdezés a kategóriatáblázatból, az én jelenlegi táblázatomnál ez azt jelenti hogy kb hatszor gyorsabb)
A válaszokat előre is köszönöm!
5

Olvasd el ezt: link

agyergorcs · 2010. Feb. 22. (H), 14.17
Olvasd el ezt:

link