Menü php-mysql
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:É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
■ 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);
?>
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
8. sor: az A taget csak
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...
Ja igen, lemaradt:) és hogy
é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
a kiir() -en belül már most
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.
Elnézést, de egy kicsit
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:
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!
Olvasd el ezt: link
link