Jump to content
php.lv forumi

2 līmeņu menu


anonīms

Recommended Posts

Sveiki. Interesē kā labāk veidot 2 līmeņu izvēlni.

Ir tā, ka būs papildus kollona `parent`, kur attiecīgi tam menu tiks piesaistīts arī vecākajam. Jautājums ir par izvadīšanu.

Negribās taisīt ciklcu iekšs cikla, tāpēc gribēju par to paprasīt..

 

Teiksim variants ir

while() {


menu
submenu -- // taisam jaunu kveriju un ar ciklu izvadam
}

 

bet tas liekas drusku nepareizi. Teiksim, ja man ir 10 izvēlnes, tas nozīmē, ka būs 11 kveriji. Tāpēc gribēju paprasīt kā to visu zem viena varētu.

 

Izvadīt visus menu linkus un samaukt arrayjā un tad attiecīgi "spēlēties"?

Link to comment
Share on other sites

Glabā tabulā izvēlni sakārtotā secībā, glabā klāt arī līmeni. (pamata vai 2. līmenis)

Atlasa visus datus, vienā ciklā izej cauri visiem rezultātiem un sagrūd divdimensiju masīvā. Tad nevajadzētu būt problēmām izvadīt visu.

 

Piemēram šādi:

kategorijas.PNG

 

Kvērijus ciklā saukt galīgi neracionāli...

Edited by briedis
Link to comment
Share on other sites

 

Priekškam rekursiju, paskaties manu variantu - 1 kvērijs un 1 cikls, lai visu saliktu strukturētā masīvā. Nedomāju, ka ir iespējams uzrakstīt vēl efektīvāk.

 

Skaidrs. Vienkārši variants "ielasam visus datus no attiecīgās tabulas" man neliekas pieņemams. Okej - ja tev tabulā glabājās tikai viena menu izvēles (cik tur var būt - divdesmit trīsdesmit ieraksti), bet kā mana gadījumā bija - multi-līmeņu komentāri (kuri, teorētiski, var būs miljoniem). Visus selektēt nebūtu prāta darbs. :D

Link to comment
Share on other sites

Paldies visiem, kas centās palīdzēt :) Principā briedis arī parādīja īsto ceļu.

Neturēšu sveci zem pūra. Struktūru nerādīšu, aptuveni ir kā briedis rakstīja.

http://paste.php.lv/b108409210cd2c05ebe7a63eff6d4e3a?lang=php

Vienīgi man .active klases iegūšana neliekas gudra doma, bet nu tas bija "fiksais" variants.

Droši komentējam, ja ir kas, ko vajadzētu pielabot.

 

P.S. Taisīju tikai 2 līmeņu menu, jo zinu, ka vairāk nevajadzēs, kgan varēja ntos, bet nu naf :)

Link to comment
Share on other sites

Kāpēc jūs nelietojat atstarpi starp valodas konstrukcijām? Tas palīdz vizuāli vieglāk uztvert kodu, sevišķi, ja nav highlighting...

if ($atstarpe) {
while ($ari_atstarpe) {
   	funkcijai_atstarpe_nav();
}
}

Kas attiecas uz kodu, nav labākais risinājums. Kā jau minēts, ielasīti visi dati atmiņā, pie tam, pārejot pāri, man liekas, ka baigi ciklējas - katrai 1. līmeņa izvēlnei tiek taisīts cikls pa visām atmiņā ielādētajām izvēlnēm.. principā, vairāki subquery aizstāti ar to, ka subquery tiek darīti kodā pret atmiņā ielādēto informāciju, pie tam, neindeksēti, pārejot visam pāri...

 

Ar normālu struktūru tas ir viens walks pa vienu resultsetu pēc viena pieprasījuma un attiecīga zīmēšana.

Link to comment
Share on other sites

Nu struktūra ir šāda:

CREATE TABLE IF NOT EXISTS `menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(30) NOT NULL,
 `link` varchar(100) NOT NULL,
 `parent` int(11) NOT NULL,
 `level` tinyint(1) NOT NULL,
 `order` int(11) NOT NULL,
 `blank` tinyint(1) NOT NULL,
 PRIMARY KEY (`id`)
)

 

Key, varbūt varētu tad paskaidrot kā labāk to panākt? kādu mazu piemēru

Link to comment
Share on other sites

Ja gribi vienu query, sk. linku.

ja ir strikti 2 līmeņi, tad var arī manipulēt ar datubāzes pieprasījumu.

Pieņemsim, ka ir atlasīti ieraksti pareizā secībā 1, 1.1, 1.2, 2, 2.1, 2.2, 2.3, 3, 3.1, 4 utt.. Zīmējot tu ej vienā ciklā pāri un mainoties parentam attiecīgi noslēdz/atver..

Vnk. patreizējais risinājums neko neatrisina, tad jau labāk rekursija vai daudzi queries un rezultātu iekešo.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...