Navigationsbaum abhängig von Suchbegriff.

ronaldo84

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem:
Für ein Shop baue ich einen Navigationsbaum mittels Nested Sets auf. Artikel können biz zu 6 Artikelgruppen haben. Nun würde ich gerne je nach Suchbegriffeingabe nur Teile des Baums darstellen lassen, nämlich nur die Teile in den Artikel vorkommen, in denen der gesuchte Begriff vorkommt. Leider würde denke ich meine Umsetzung zu lange dauern. Ich würde so vorgehen:

1 - Artikel Suchen die auf Suchkriterium zutreffen.
2 - Id der Produktgruppen der Artikel auslesen
3 - Elternelemente der Produktgruppen auslesen.

Und bei ca. 100 PGs dauert das halt dementsprechend lange. Hat jemand eine Idee wie ich das verbessern könnte?

Hier mal der Aufbaue des Baums (Auszüge):
PHP:
session_start();
require_once('classDB.php4'); 


function node_text_format($row, $count=0)
{
  if($count!=0)
    return "<li class='produktgruppe'><a href='blub' class='produktgruppe'>".strtoupper($row[node_text])." (".$count.")</a>";
  else
    return "<li class='produktgruppe'>".strtoupper($row[node_text]);
}

function createTree($DbCon,$sql, $anz="on")
{
  $pgArr=$DbCon->GetResArr($sql);
  $body="<div id='menu' style='letter-spacing:0.001em; position:absolute; top:20px;'><ul>";
  for($i=0; $i<count($pgArr);$i++){
    $row="";
    if($pgArr[$i][level]>1 AND anz=="on"){
      $DbCon->DoSql("SELECT count(proid) AS anz FROM t_webshop WHERE proid=".$pgArr[$i][node_id]." GROUP BY proid");
      $row=$DbCon->GetRes();
    }
    if($pgArr[$i][level]<$pgArr[$i+1][level]){
      $body.= node_text_format($pgArr[$i], $row['anz'])."<ul>";
    }
    elseif($pgArr[$i+1][level]<$pgArr[$i][level]){ 
      $body.= node_text_format($pgArr[$i], $row['anz'])."</li>";
      for($c=0;$c<($pgArr[$i][level]-$pgArr[$i+1][level]);$c++)
        $body.="</ul></li>";
    }
    else{
      $body.= node_text_format($pgArr[$i], $row['anz'])."</li>";
    }
  }
  $body.="</ul><script type='text/javascript' src='tree.js'></script></div>";
  return $body;
}


$head="<html><head><title>Test</title></head><body><form method='Post'>";
$footer="</form></body></html>";
$DbCon = new DB();

echo $head;
echo createTree($DbCon, "SELECT node_id, node_text, level FROM node ORDER BY lft ASC", "on");
echo $herstellerPD;
echo $footer;
Die ClassDB ist nur eine Klasse zur Kommunikation mit der MySQL-DB.

P.S. Bei jeder PG soll auch noch angezeigt werden wie viele Artikel sich in dieser Tabelle befinden.

Hier mal die Tabellenstruktur der Navigation:
sql Code:
  1. CREATE TABLE `node` (
  2. `node_id` int(10) NOT NULL AUTO_INCREMENT,
  3. `node_text` varchar(50) collate latin1_general_ci DEFAULT NULL,
  4. `lft` int(10) DEFAULT NULL,
  5. `rgt` int(10) DEFAULT NULL,
  6. `level` int(10) DEFAULT NULL,
  7. `parent_node` int(10) DEFAULT NULL,
  8. PRIMARY KEY (`node_id`)
  9. )


In der Tabelle der Artikel befindet sich nur noch ein Integer-Feld, in dem die Node_id des tieften Knotens eingegeben wird.

Hoffe das ihr mir helfen könnt, bin für allre Vorschläge offen.
 
Zurück