Jump to content
php.lv forumi

par n leveļu navigācijas veidošanu


ezs

Recommended Posts

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

  • Replies 35
  • Created
  • Last Reply

Top Posters In This Topic

ņā 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

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

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

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

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


×
×
  • Create New...