Jump to content
php.lv forumi

katalogi & kategorijas


andrisp

Recommended Posts

domaaju par katalogu sisteemu, kuraa iespeejams veidot n-to liimenju apakshkategorijas, tas ir, kategorija -> subkategorija -> subsubkategorija -> subsubsubkate.. utt.

 

Domaaju to dariit ar shaadu vienkaarshu tabulu (kataloga mugurkauls):

ID | parent_cat_id | cat_name

 

 

ID - unikaals peec kaa atpaziist kategorija

parent_cat_id - taas kategorijas ID zem kuras atrodas apakshkategorija

cat_name - kategorijas nosaukums

 

0 liimenja kategorijaam parent_cat_id buutu 0, apakshkategorijaam parent_cat_id buutu taas kategorijas ID, zem kuras taa atrodas.

 

+/- shim konceptam ?

Varbuut ir labaaks veids kaa veidot n-liimenju katalogu sisteemas ?

 

paldies

Link to comment
Share on other sites

Ja vajadzēs meklēšana no ROOT (vai citas ne-beigu-kategorijas (not-LEAF) )... tad labāk kešot visu parent child ID ar komatiem.. ParentChilds = "45,23,77" lai nevajadzētu katru reizi taisīt query uz visiem SubTree..

 

vēlāk pie meklēšanas pielikot tikai

WHERE ItemCatId IN ('.$rootCat->ParentChilds.')

 

PS: PgSQL tas ir easy.. uztaisam storēto proc. un dzīvojam mierīgi.

Link to comment
Share on other sites

Vēl ieteiktu pievienot child_count kolonnu. Dažos gadījumos tas ir visai noderīgi

 

child_count - cik lapas/ieraksti ir tieši zem esošā (parent) ieraksta

 

nevaig to child_count to var paveikt ar to pashu parent_cat_id.

 

where parent_cat_id=".$tagadejasadala."

 

nu domu sapratat :)

Link to comment
Share on other sites

es meegjinu visaadiigi izdomaat kodu, kam padodod kautkaadas apakshsadaljas ID, automaatiski tiktu sagjenereeti listes arii augstaak staavoshaas kategorijas.

 

ilustraacijai:

<ul>
<li>Root #1</li>
<li>Root #2</li>
<li>Root #3</li>
 <ul>
  <li>Subcat #1</li>
  <li>Subcat #2</li>
<ul>
 <li>Subsubcat #1</li>
 <li>Subsubcat #2</li>
 <ul>
  <li>Subsubsubcat #1</li>
  <li>Subsubsubcat #2</li>
 </ul>
 <li>Subsubcat #3</li>
</ul>
  <li>Subcat #3</li>
 </ul>
<li>Root #4</li>
</ul>

 

Piem, es uztaisu pieprasiijumu katalogs.php?cat=20, kur 20 ir 'Subsubcat #2' ID, un mans kods automaatiski sagjeneree gan hiarhijaa augstaakstaavoshaas kategorijas, gan savas child kategorijas.

 

Zinu, ka izklausaas peec gatava koda pieprasiijuma, bet esmu nokuupinaajis savu galvu melnu, un nevaru izdomaat, kaa lai to izdara.

Link to comment
Share on other sites

šitas no manuāļa

$BASEDIR="/tmp";
function recurse_array($array) {
  foreach($array as $arr)
  {
		 if (is_array($arr)) 
				   {
				recursedir($arr);
		   }
					else 
				   {
					   //sheit daram visas lietas
			   echo $arr;
		 }
   }
}
recursedir($array);

Edited by teror
Link to comment
Share on other sites

varēji jau pats netā sameklēt...

 

function rekursija( rootId )
{
 select .. where parentId = rootId
 $cnt = 0;
 while ( $obj = .. )
 {
	 if ( rootId == $obj->id ) continue; // Lai nav muuzigais cikls
	 rekursija( $obj->id );
	 $cnt++;
 }

 return $cnt;
}

Link to comment
Share on other sites

Blackout, kāpēc tu vienmēr stīdies, un vienmēr `neapreizi`..

 

Visos gadījumos, kad izmantoju Tree, child_count ir 100% nepieciešams.. kaut vai perfomance uzlabošanai (pamatā)

 

Es jau nestrīdos, bet kāpēc nepareizi? ja tev vaig uszināt cik subkategoriju tavam katalogam kapēc neizmantot šito? :

 

$k_query = mysql_query("SELECT * FROM katalogi WHERE parent_cat_id='".$katalogs."'");
$num_k = mysql_num_rows( $k_query );

if ( $num_k != 0 ) {
echo("$num_k"); //izdos cik subkatalogu
} else {
echo('Nav neviena subkataloga'); }

 

kas tur nepareizs?

Edited by Blackout
Link to comment
Share on other sites

Blackout : daudz kas nepareizs. skaitīt cik ierakstu ar num_rows() ir 'pareizi', selektēt visus laukus, ja tev vajag tikai vienu ciparu, kas ir chaildu skaits nodei, ir vienkārši super!

Edited by v3rb0
Link to comment
Share on other sites

Blackout, nu nestrīdies ar pieredzējušiem..

 

Kā jau verbo teica, tavā piemērā ir vairākas kļūdas

1.) lai saskaitītu, tu selektē visus laukus

2.) skaitu dabū no num_rows()

3.) skaits tiek dabūts ar papildus query (arī sub-query ir papildus query)

4.) on-line režīmā šitais neder, jo veido nevajadzīgu noslogojumu

 

Risinājums šitām problēmā jau sen zināms:

1.) izveidojam ChildCount un updeitojam pie ieraksta pielikšanas

2.) skaitīšanai izmanto SQL count() f-ju

Link to comment
Share on other sites

ko es daru nepareizi ?

 

function rekursija($parentID) {
	$query = mysql_query("SELECT * FROM `dokumenti_categories` WHERE parent_cat_id = ".$parentID);
	$html .= '<ul>';
	while ($row = mysql_fetch_assoc($query)) {
		$html .= '<li>'.$row['cat_name'].'</li>';
		$subquery = mysql_fetch_array(mysql_query("SELECT COUNT(ID) FROM `dokumenti_categories` WHERE parent_cat_id = ".$row['parent_cat_id']));
		if ($subquery[0] != 0) {
			$html .= rekursija($row['parent_cat_id']);
		}
	}
	$html .= '</ul>';
	return $html;
}
echo rekursija(0);

 

man vispaar nekas nenotiek.. apacis atsuuta, ka dokuments nemaz neeksistee.. kad izkomenteju aaraa sho kodu, tad dokuments gan atrodas.. pieljauju, ka mana rekursija nokarina php vai aiziet muuzhiigajaa loopaa.. kas par vainu ?

 

Atradu kļūdu! ieksh $subquery selecta jaabuut bija parent_cat_id = '.$row['ID'] un ieksh tur kur $html .= rekursija($row['parent_cat_id']) ir tas pats - jaabuut $row['ID'];

Edited by andrisp
Link to comment
Share on other sites

×
×
  • Create New...