ezs Posted November 5, 2005 Report Share Posted November 5, 2005 Labda diena pieļauju ka šī tēma ir jau apsprieta, tā arī ir esmu sagatavojis nelielu mājas darbu, bet lūdzu jūsu palīdzību. Tātad šinī te vietā aprunātā navigācijas veidošana: http://php.lv/f/index.php?sh.... bubu piedāvājo ļoti interesantu risinājumu: <?php function show_menu($id) { $all = mysql_query("SELECT * FROM main Where parent_id=$id ORDER BY id ASC"); if (!$all) { echo( mysql_error()); } else { if (mysql_num_rows($all) { echo '<ul class="id_nav">'; while ($row = mysql_fetch_array($all)) { echo '<li><a class="nav" href="?id='.$row['id'].'">'.$row['name'].'</a>'; show_menu($row['id']); echo '</li>' } echo '</ul>'; } } } show_menu(0); ?> Viss jau ļoti jauki un skaisti, bet cik noprotu, tad noteikti ir jānorāda $id, kurš atsauktos uz Tabulas lauku parent_id, labi tik tāl viss ok, bet piemēram ja nav skaidri zināms, nedz sadaļu dziļums, ned arī to daudzums pēc bra ralstītā, sapratu ka ir vel viens parametrs (tabulas lauks) sad_id, ļoti jauki un skaisti selectu jau uzraxtīt varētu, bet nezinu kā ar php un rekrusīvajām f-cijām vai iekš php pastāv tāda lieta, un ja pastāv tad kā izmantot tieši šinī gadījumā. Cik noprtu varētu darīt šādi: uzzinam maksimālo parent_id lauka vērtību - apzīmēs cik ir maksimālais dziļums, un tad ar while ciklu laižam caruri viesiem tabulas laukiem un kārtojam mūsu nepieciešamās sadaļas formātā kādā vēlamies Aizmirsu piebilst ka velkot datus ārā no DB veicam nelielu pārbaudi t.i. pārbaudam dziļumu un sadaļu, kura atrodas līmeni zemāk Tad visu izvadam laukā : šādā formātā: <ul id="tree"> <li>1 <ul> <li>1.1</li> <li>1.1</li> </ul> </li> <li>2 <ul> <li>2.1</li> <li>2.2</li> <li>2.3</li> </ul> </li> </ul> Katrs ieraksts unikāls un atrodas savā vietā, ar plānošanu man viss laikam labi, bet ar izpildi, nepārāk vai lūdzu, kāds nevarētu man palīdzēt. Paldies Jums jau iepriekš Link to comment Share on other sites More sharing options...
hmnc Posted November 5, 2005 Report Share Posted November 5, 2005 un kur jautājums?! :) Link to comment Share on other sites More sharing options...
bubu Posted November 5, 2005 Report Share Posted November 5, 2005 Īsti nesapratu, kāpēc tev vajadzīgs līmeņa dziļums. Bet tiešām - kur jautājums? Link to comment Share on other sites More sharing options...
hmnc Posted November 5, 2005 Report Share Posted November 5, 2005 a līmenis vajadzīgs, ja dati uzreiz netiek izvadīt, bet vēlāk vajag piemēram kaut vai ar tabulu izvadīt un tad levelis der kā reizinātājs paddingiem :) nu tāds primitīvs piemērs. Link to comment Share on other sites More sharing options...
bubu Posted November 5, 2005 Report Share Posted November 5, 2005 Nu tas jau ir piemēram. Es piemērus ar vau izdomāt ;) Bet topika autoram kam tas vajadzīgs, to jau te vajag noskaidrot. Link to comment Share on other sites More sharing options...
ohmygod Posted November 5, 2005 Report Share Posted November 5, 2005 Nu būtībā jau dziļumu pavisam viegli iegūstam ejot ar rekursīvu funkciju cauri visām kategorijām. Varam pat pilnīgu menu hierarhiju izveidot. Galvenais ir norādīt parent kategoriju. Jāiet ta cauri visām kategorijām būs tā vai tā. Link to comment Share on other sites More sharing options...
hmnc Posted November 5, 2005 Report Share Posted November 5, 2005 da leveli vienkārši skaitam klāt (ja iet sub), vai arī atņemam (kad sub beidzas) Link to comment Share on other sites More sharing options...
ezs Posted November 5, 2005 Author Report Share Posted November 5, 2005 ņā laikam man ir iedzimta kaite: ja ko raxtu 1. tad par īstu 2. par garu Ko vēlos panākt: No Db izvelkam ārā datus (DB stuktūra: id | name ... | sad_id | level (sad_id apzīmē piederību sadaļai | level apzīmē sadaļas līmeni)) Tad ar php apstrādājam datus un izvadam ārā sadaļu koku, kur katra sadaļa atrodas attiecīgajā levelī zem piesastītās sadaļas: piemēram DB saturs id | name | sad_id | leve 1 | 1 | 0 | 0 2 |1.1 | 1 l 1 3 |1.2 | 1 l 1 4 |1.2.1 | 3 l 2 5 |1.2.2 | 3 l 2 Izvadītais izvadāmais rezūltāts <ul id="tree"> <li>1 <ul> <li>1.1</li> <li> 1.2 <ul> <li>1.2.1</li> <li>1.2.2</li> </ul> </li> </ul> </li> </ul> Vedojot jaunu bloku, ja pieprasītajai sadaļai ir apakšsadaļa to vienkārši izdara ievietojot <ul> <li>1.2.1</li> <li>1.2.2</li> </ul> kas vaido jauno sadaļas bloku. Jutājums ir sekojoš kāds varētu izskatīties kods, kurš veic šādu te darbību? šobrīd es izlīdzos ar vairāku selektu raxtīšanu, kuri izvel iz datubāzes un katram blokam raxtu atsevišķu selctu, bet tas noteikti nav labais tonis, jo bieži nav zināms cik dziļi tad kategorijas var izvērsties. ceru ka šoreiz izklāstīju labāk Link to comment Share on other sites More sharing options...
hmnc Posted November 5, 2005 Report Share Posted November 5, 2005 nafig tev līmeni, ja tu jau braukājies cauri ar rekursīvu funkciju un visu sadari kā tev vajag?!?!?! level norāde ir pilnīgi bezjēdzīga iekš datubāzes!! un kas notiks, ja tu pārcelsi pieņemsim vienu elementu no 28 levela uz 3 leveli? katru reizi pārbaudīsi, kur kas pārceļas?! Link to comment Share on other sites More sharing options...
ezs Posted November 5, 2005 Author Report Share Posted November 5, 2005 loģiski, par to nebīju iedomājies, bet principā ideja ir skairdra, tikai kā lai to izpilda :) Link to comment Share on other sites More sharing options...
bubu Posted November 5, 2005 Report Share Posted November 5, 2005 Ko lai izpilda? Link to comment Share on other sites More sharing options...
ezs Posted November 5, 2005 Author Report Share Posted November 5, 2005 kāds varētu izskatīties kods, kurš izpilda šis te darbības... Link to comment Share on other sites More sharing options...
ohmygod Posted November 5, 2005 Report Share Posted November 5, 2005 Nu man ātrumā izskatās šādi: Atlasam pirmās pakāpes kategorijas. Katrai izpildam funkciju: Kā $hierarchy padodam pamatkategorijas kārtas numuru. $id un $parent_id abi vienādi - pamatkategorija. function getParents($id, $parent_id, $hierarchy) { $ide = $id; $query = "SELECT child_id, name from cat_hierarchy where parent_id = '" . $id . "'"; $i = 0; while ($row = $mysql_fetch_array($query)) { $i++; $hierarchy2 = $hierarchy . '.' . $i; $this->groupHierarchy[$parent_id][] = array('id' => $row['child_id'], 'hierarchy' => $hierarchy2, 'name' => $row['name']); getParents($row['child_id'], $parent_id, $hierarchy2); } } Tātād beigās iegūstam masīvu ar katras pamatkategorijas pilnīgi visām apakškategorijām visos līmeņos. Kā aŗi to hierarhisko atrašanās vietu. Nu un tad dari ar to, ko vēlies. Vari uzreiz savākt visas kategorijas masīvā un tad tikai iet cauri, lai nebūtu n pieprasījumi db. Da variācijas ir daudzas, šitā man tā ātrumā uzmetās... Un to dziļumu, kā redzi nevajag! Pats viņš rekursīvi izveidojas... A gudrie prāti nerāt mani... ((: Nav jau nekāds izcilais kods... :D Bet es domāt ka vajadzētu strādāt... Link to comment Share on other sites More sharing options...
bubu Posted November 5, 2005 Report Share Posted November 5, 2005 kāds varētu izskatīties kods, kurš izpilda šis te darbības... Ievies papildus string veida mainīgo tai rekursīvajai funkcijai, kurā glabā parent līmeņu numurus atdalītus ar punktu. Tajā ciklā skaiti tekošā līmeņa numurus uz priekšu un kad izsauc rekursīvo funkciju sevī, tad tur padot tajā parametrā jauno līmeņu stringu (izveidotu no saņemtā prametra, punkta, un tekošā kārtas numura sakonkatenētiem kopā). Link to comment Share on other sites More sharing options...
Klez Posted November 6, 2005 Report Share Posted November 6, 2005 shaadaam tipa fcijaa, kas te paraadiijaas ir viens miinus. ja navigaacija buus paliela taa iebremzees. lai gan select no mysql nau ilgs proces, bet tomeer kaut kaadu laiku tas aiznjem. iipashi ja ir dzilja navigaacija. protams ja visu pareizi saindeksee, tad tas process paatrinaas :) Link to comment Share on other sites More sharing options...
Recommended Posts