Kann mir jemand helfen? Eingeschränkte Volltextsuche

Gesperrt
malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Kann mir jemand helfen? Eingeschränkte Volltextsuche

Beitrag von malsdgtac »

Hallo,
ich möchte auf meiner Seite eine eingeschränkte Volltextsuche einbauen. Dabei soll man die Möglichkeit haben nur bestimmte Kategorien zu durchsuchen.

Ich habe bis jetzt die Volltextsuche mit dem Sitemapmodul gekoppelt, um mir alle bzw. eingeschränkte Auswahl von Kategorien zu bekommen.
Im Moment wird immer die ausgewählte Kategorie durchsucht.

Ich möchte allerdings, dass man "Überkategorien" aussuchen kann und alle untergeordneten Kategorien auch durchsucht werden.

Also z.B.

Kultur
Sport
- Rad
-- Rennrad
-- Mountainbike
-- Trekkingbike
- Schwimmen
- Golf
Bezirke

Wenn man die Kategorie Sport durchsucht, soll auch die Kategorien Rad, Rennrad, Mountainbike, Trekkingbike, Schwimmen und Golf durchsucht werden.

Kann mir jemand helfen wie ich das am besten umsetzen kann? Ich habe die Überlegung, dass ich wenn die "Levels" für die Darstellung der Sitemap ausgelesen werden, diese in ein Array schreibe und dann eine Datenbankabrage mit diesem Array mache ???
Ich wäre über eure Hifle wirklich sehr dankbar, wenn mir jemand die notwendige Datenbankabfrage mitteilen könnte wäre das natürlich spitzenmäßig.

Hier mal das Modul wie ich es jetzt bereits verwende:

Eingabe:

Code: Alles auswählen

// selected category
$selected = "CMS_VALUE[0]";

echo  "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\">\n".
        "  <tr valign=\"top\">\n".
        "    <td>Kategorie wählen:</td>\n".
        "    <td>\n".
        "      <select name=\"CMS_VAR[0]\">\n".
        "        <option value='0'>---Alle---</option>\n";

// fetch all categorys
$query = "SELECT A.idcat, A.level, C.name FROM ".$cfg["tab"]["cat_tree"]." AS A, ".
              $cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat ".
              "AND B.idcat=C.idcat AND C.idlang='$lang' AND B.idclient='$client' ".
              "AND C.visible=1 ORDER BY A.idtree";

// execute query
$db->query($query);

// loop result and build the options
while ($db->next_record()) 
{
  // indent spacer
  $spaces = "";

  // how many levels
  $levels = $db->f("level");

  for ($i = 0; $i > $levels; $i ++) 
  {
     // add 2 spaces for every level
     $spaces = $spaces . "  ";
  } // end for

  if ($selected == $db->f("idcat")) 
  {
     // selected category
     echo "        <option selected=\"selected\" value=\"". 
             $db->f("idcat") ."\">". 
             $spaces . $db->f("name") ."</option>";
  } 
  else 
  {
     // category
     echo  "        <option value=\"". 
             $db->f("idcat") ."\">". 
             $spaces . $db->f("name") ."</option>";
  } // end if

} // end while

echo  "      </select>\n".
         "     </td>\n".
         "   </tr>\n".
         "   <tr>\n".
         "     <td>Anzahl Ebene:</td>\n".
         "     <td>\n".
         "       <input type=\"text\" name=\"CMS_VAR[1]\" value=\"CMS_VALUE[1]\">\n".
         "     </td>\n".
         "   </tr>\n".
         " </table>\n";
Ausgabe:

Code: Alles auswählen

<?php 
$leer = strpos($suchkat,"-");
$suchclient = substr($suchkat,0,$leer);
$amountLevel = "CMS_VALUE[1]";
$newcat = "CMS_VALUE[0]";
echo "<center><table width=\"80%\" border=\"1\"><tr><td>Suche nach Themen:</td></tr><tr><td align=center> 
<form name=\"suche\" method=\"POST\" action=\"".$auth->url()."\" > 
<input type=\"text\" size=\"9\" style=\"width:120px\" name=\"suche\" value=\"$suche\">";
include_once($cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php");

  echo '<select name="suchkat">';
	echo '<option>Bitte wählen Sie aus</option>';
	
	

  
  function sitemap($newcat=0)
  {
    global $lang, $client, $amountLevel, $color, $startLevel, $cfg, $suchclient, $gestartet;
		$db  = new DB_Contenido;
    $sql  = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ".
              $cfg["tab"]["cat"]." AS B, ".
              $cfg["tab"]["cat_lang"]." AS C ".
              "WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND ".
              "C.idlang='$lang' AND B.idclient='$client' AND ".
              "B.parentid =$newcat AND level <= $amountLevel AND C.visible=1 ".
              "ORDER by A.idtree";
    $db->query($sql);
    $result = "";
    while ($db->next_record())
    {  
      $lvl = $db->f("level");
      if ($lvl==1)
      {
        $result.="";
      }
			if ($lvl==$gestartet){
			$result	.=  "<option value='".$db->f("idcat")."-".$db->f("name")."'";
			if ($db->f("idcat")==$suchclient){$result .= " selected";}
			$result .= ">".$db->f("name")."-juhu</option>";
			$result .= sitemap($db->f("idcat"));
			} 
    }
    $result.= "";
    return($result);
  }
  
  $sql = "SELECT level FROM " . $cfg["tab"]["cat_tree"] . " WHERE idcat=$newcat";
  $db->query($sql);
  $db->next_record();
  $startLevel = $db->f("level");
	$gestartet = $db->f("level");
	$gestartet++;
  $amountLevel +=  $startLevel;
  if ($newcat==0){$amountLevel--;}
  echo sitemap($newcat);
	
echo "</select>";

echo "<INPUT TYPE=\"submit\" VALUE=\"Suchen\"></FORM></td></tr>"; 

$leer = strpos($suchkat,"-");
$suchclient = substr($suchkat,0,$leer);
$suchname = substr($suchkat,$leer+1);

if($suche){ 
   $suche = trim($suche); 
   $suchregexp = "(".str_replace(" ",")|(",$suche).")"; 
        $s=ereg_replace("ü", "%FC",strtolower($suche)); 
        $s=ereg_replace("ä", "%E4",$s); 
        $s=ereg_replace("ö", "%F6",$s); 
        $suchregexp .=  "|$s"; 
   $suchliste = explode(" ",strtolower($suche)); 

   $sql = "SELECT A.title AS title,A.idart AS idart,A.summary AS comment,B.idcat AS idcat,C.parentid AS parentid,D.value AS content,A.idartlang AS sideid "; 
   $sql .= "FROM " . $cfg["tab"]["art_lang"] . " AS A, " . $cfg["tab"]["cat_art"] . " AS B, " . $cfg["tab"]["cat"] . " AS C, " . $cfg["tab"]["content"] . " AS D "; 
   $sql .= "WHERE A.idart=B.idart AND A.idartlang=D.idartlang AND B.idcat=C.idcat AND C.idclient='$client' AND idlang='$lang' AND online='1'"; 
   $sql .= " AND (D.value REGEXP '$suchregexp' OR A.title REGEXP '$suchregexp' OR A.summary REGEXP '$suchregexp') AND C.idcat='$suchclient'"; 

   $db->query($sql); 
   if ($db->num_rows() != 0){ 
      for ($i=0; $i<$db->num_rows(); $i++) { 
         $db->next_record(); 
         if ($auth->auth["uid"] == "nobody"){ 
            $sql2 = "SELECT public FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".$db->f("idcat")."'"; 
            $db2 = new DB_Contenido; $db2->query($sql2); $db2->next_record(); 
            if($db2->f("public") == 0)continue; 
         } 
         $num = 0 + $db->f("sideid"); 
         $results[$num][link] = $client."_".$lang."__".$db->f("idart").".aktiv"; 
         $results[$num][title] = $db->f("title"); 
         switch ("CMS_VALUE[2]") { 
            case 0: $results[$num][text] = "";break; 
            case 1: $results[$num][text] = $db->f("comment");break; 
            case 2: $results[$num][text] .= substr(strip_tags(rawurldecode($db->f("content"))),0,100)."..."; 
         } 
         for($x=0;$x<count($suchliste);$x++){ 
            $hits[$num] += substr_count(strtolower($db->f("title")), $suchliste[$x]) + 
            substr_count(strtolower($db->f("comment")), $suchliste[$x]) + 
            substr_count(strtolower($db->f("content")), $suchliste[$x]); 
         } 
      } 
      if(count($hits) > 0){ 
				 		echo "<tr><td><b>Suchergebnisse:</b></td></tr>";
						echo "<tr><td>Die Suche nach \"".$suche."\" im Thema \"".$suchname."\" hat folgende Suchergebnisse gebracht:</td></tr>";
         $hits = array_values($hits); 
         $results = array_values($results); 
         array_multisort ($results, SORT_DESC, SORT_NUMERIC, $hits, SORT_DESC, SORT_NUMERIC); 
         for ($i=0; $i<count($hits); $i++){ 
						echo "<tr><td align=left>";
						echo "<a href=\"".$results[$i][link]."\" id=\"fontCMS_VALUE[0]\""; 
            if("CMS_VALUE[3]"){echo "TARGET=\"CMS_VALUE[3]\" ";} 
            echo ">".$results[$i][title]."</a> <span id=\"fontCMS_VALUE[1]\"><BR>"; 
            echo $results[$i][text]."</span></td></tr>"; 
         } 
      } else {echo "<tr><td align=center>Keine passenden Seiten gefunden</td></tr>"; } 
   } else {echo "<tr><td align=center>Keine passenden Seiten gefunden</td></tr>"; } 
} 
echo "</table></center>"; 
?> 
malsdgtac
Beiträge: 717
Registriert: Fr 12. Mär 2004, 15:50
Kontaktdaten:

Beitrag von malsdgtac »

Hallo an Alle!
Ich habe bereits eine Lösung gefunden (ist zwar wahrscheinlich nicht die beste - aber sie funktioniert).

Man kann nun über die Konfiguration die Kategorien einschränken, in welchen Kategorien gesucht werden darf, und dann läuft eine Volltextsuche über alle Kategorien, die dieser Kategorie untergeordnet sind.

Falls es jemand interessiert, hier der Code:

Eingabe:

Code: Alles auswählen

// selected category 
$selected = "CMS_VALUE[0]"; 

echo  "<table cellspacing=\"0\" cellpadding=\"10\" border=\"0\">\n". 
        "  <tr valign=\"top\">\n". 
        "    <td>Kategorie wählen:</td>\n". 
        "    <td>\n". 
        "      <select name=\"CMS_VAR[0]\">\n". 
        "        <option value='0'>---Alle---</option>\n"; 

// fetch all categorys 
$query = "SELECT A.idcat, A.level, C.name FROM ".$cfg["tab"]["cat_tree"]." AS A, ". 
              $cfg["tab"]["cat"]." AS B, ".$cfg["tab"]["cat_lang"]." AS C WHERE A.idcat=B.idcat ". 
              "AND B.idcat=C.idcat AND C.idlang='$lang' AND B.idclient='$client' ". 
              "AND C.visible=1 ORDER BY A.idtree"; 

// execute query 
$db->query($query); 

// loop result and build the options 
while ($db->next_record()) 
{ 
  // indent spacer 
  $spaces = ""; 

  // how many levels 
  $levels = $db->f("level"); 

  for ($i = 0; $i > $levels; $i ++) 
  { 
     // add 2 spaces for every level 
     $spaces = $spaces . "  "; 
  } // end for 

  if ($selected == $db->f("idcat")) 
  { 
     // selected category 
     echo "        <option selected=\"selected\" value=\"". 
             $db->f("idcat") ."\">". 
             $spaces . $db->f("name") ."</option>"; 
  } 
  else 
  { 
     // category 
     echo  "        <option value=\"". 
             $db->f("idcat") ."\">". 
             $spaces . $db->f("name") ."</option>"; 
  } // end if 

} // end while 

echo  "      </select>\n". 
         "     </td>\n". 
         "   </tr>\n". 
         "   <tr>\n". 
         "     <td>Anzahl Ebene:</td>\n". 
         "     <td>\n". 
         "       <input type=\"text\" name=\"CMS_VAR[1]\" value=\"CMS_VALUE[1]\">\n". 
         "     </td>\n". 
         "   </tr>\n". 
         " </table>\n"; 
Ausgabe:

Code: Alles auswählen

<?php 
$leer = strpos($suchkat,"-"); 
$suchclient = substr($suchkat,0,$leer); 
$amountLevel = "CMS_VALUE[1]"; 
$newcat = "CMS_VALUE[0]"; 
echo "<center><table width=\"80%\" border=\"1\"><tr><td>Suche nach Themen:</td></tr><tr><td align=center> 
<form name=\"suche\" method=\"POST\" action=\"".$auth->url()."\" > 
<input type=\"text\" size=\"9\" style=\"width:120px\" name=\"suche\" value=\"$suche\">"; 
include_once($cfg["path"]["contenido"].$cfg["path"]["includes"]."functions.con.php"); 

  echo '<select name="suchkat">'; 
   echo '<option>Bitte wählen Sie aus</option>'; 
    
    
if (!function_exists("catIsChildOf"))
{
    function catIsChildOf($id, $idparent) {
        global $cfg, $client, $lang;
        $db = new DB_Contenido;
        $parent = $id;
        while ( $parent != 0 ) {
            $sql = "SELECT
                        a.parentid
                    FROM
                        ".$cfg["tab"]["cat"]." AS a,
                        ".$cfg["tab"]["cat_lang"]." AS b
                    WHERE
                        a.idclient  = '".$client."' AND
                        b.idlang    = '".$lang."' AND
                        a.idcat     = b.idcat AND
                        a.idcat   = '".$parent."'";
    
            $db->query($sql);
            $db->next_record();
    
            $parent = $db->f("parentid");
    
            if ($parent == $idparent) {
                return true;
            }
        }
        return false;
    }
}


  
  function sitemap($newcat=0) 
  { 
    global $lang, $client, $amountLevel, $color, $startLevel, $cfg, $suchclient, $gestartet; 
      $db  = new DB_Contenido; 
    $sql  = "SELECT * FROM ".$cfg["tab"]["cat_tree"]." AS A, ". 
              $cfg["tab"]["cat"]." AS B, ". 
              $cfg["tab"]["cat_lang"]." AS C ". 
              "WHERE A.idcat=B.idcat AND B.idcat=C.idcat AND ". 
              "C.idlang='$lang' AND B.idclient='$client' AND ". 
              "B.parentid =$newcat AND level <= $amountLevel AND C.visible=1 ". 
              "ORDER by A.idtree"; 
    $db->query($sql); 
    $result = ""; 
    while ($db->next_record()) 
    {  
      $lvl = $db->f("level"); 
      if ($lvl==1) 
      { 
        $result.=""; 
      } 
         $result   .=  "<option value='".$db->f("idcat")."-".$db->f("name")."'"; 
         if ($db->f("idcat")==$suchclient){$result .= " selected";} 
         $result .= ">".$db->f("name")."</option>"; 
         $result .= sitemap($db->f("idcat")); 
    } 
    $result.= ""; 
    return($result); 
  } 
  
  $sql = "SELECT level FROM " . $cfg["tab"]["cat_tree"] . " WHERE idcat=$newcat"; 
  $db->query($sql); 
  $db->next_record(); 
  $startLevel = $db->f("level"); 
   $gestartet = $db->f("level"); 
   $gestartet++; 
  $amountLevel +=  $startLevel; 
  if ($newcat==0){$amountLevel--;} 
  echo sitemap($newcat); 
    
echo "</select>"; 

echo "<INPUT TYPE=\"submit\" VALUE=\"Suchen\"></FORM></td></tr>"; 

$leer = strpos($suchkat,"-"); 
$suchclient = substr($suchkat,0,$leer); 
$suchname = substr($suchkat,$leer+1); 

if($suche){ 
   $suche = trim($suche); 
   $suchregexp = "(".str_replace(" ",")|(",$suche).")"; 
        $s=ereg_replace("ü", "%FC",strtolower($suche)); 
        $s=ereg_replace("ä", "%E4",$s); 
        $s=ereg_replace("ö", "%F6",$s); 
        $suchregexp .=  "|$s"; 
   $suchliste = explode(" ",strtolower($suche)); 

   $sql = "SELECT A.title AS title,A.idart AS idart,A.summary AS comment,B.idcat AS idcat,C.parentid AS parentid,D.value AS content,A.idartlang AS sideid "; 
   $sql .= "FROM " . $cfg["tab"]["art_lang"] . " AS A, " . $cfg["tab"]["cat_art"] . " AS B, " . $cfg["tab"]["cat"] . " AS C, " . $cfg["tab"]["content"] . " AS D "; 
   $sql .= "WHERE A.idart=B.idart AND A.idartlang=D.idartlang AND B.idcat=C.idcat AND C.idclient='$client' AND idlang='$lang' AND online='1'"; 
   $sql .= " AND (D.value REGEXP '$suchregexp' OR A.title REGEXP '$suchregexp' OR A.summary REGEXP '$suchregexp')"; 

   $db->query($sql); 
   if ($db->num_rows() != 0){ 
      for ($i=0; $i<$db->num_rows(); $i++) { 
         $db->next_record(); 
				 
				 if ( catIsChildOf($db->f("idcat"), $suchclient) ) {
				 
         if ($auth->auth["uid"] == "nobody"){ 
            $sql2 = "SELECT public FROM ".$cfg["tab"]["cat_lang"]." WHERE idcat='".$db->f("idcat")."'"; 
            $db2 = new DB_Contenido; $db2->query($sql2); $db2->next_record(); 
            if($db2->f("public") == 0)continue; 
         } 
         $num = 0 + $db->f("sideid"); 
         $results[$num][link] = $client."_".$lang."__".$db->f("idart").".aktiv"; 
         $results[$num][title] = $db->f("title"); 
         switch ("CMS_VALUE[2]") { 
            case 0: $results[$num][text] = "";break; 
            case 1: $results[$num][text] = $db->f("comment");break; 
            case 2: $results[$num][text] .= substr(strip_tags(rawurldecode($db->f("content"))),0,100)."..."; 
         } 
         for($x=0;$x<count($suchliste);$x++){ 
            $hits[$num] += substr_count(strtolower($db->f("title")), $suchliste[$x]) + 
            substr_count(strtolower($db->f("comment")), $suchliste[$x]) + 
            substr_count(strtolower($db->f("content")), $suchliste[$x]); 
         } 
				}
      } 
      if(count($hits) > 0){ 
                   echo "<tr><td><b>Suchergebnisse:</b></td></tr>"; 
                  echo "<tr><td>Die Suche nach \"".$suche."\" im Thema \"".$suchname."\" hat folgende Suchergebnisse gebracht:</td></tr>"; 
         $hits = array_values($hits); 
         $results = array_values($results); 
         array_multisort ($results, SORT_DESC, SORT_NUMERIC, $hits, SORT_DESC, SORT_NUMERIC); 
         for ($i=0; $i<count($hits); $i++){ 
                  echo "<tr><td align=left>"; 
                  echo "<a href=\"".$results[$i][link]."\" id=\"fontCMS_VALUE[0]\""; 
            if("CMS_VALUE[3]"){echo "TARGET=\"CMS_VALUE[3]\" ";} 
            echo ">".$results[$i][title]."</a> <span id=\"fontCMS_VALUE[1]\"><BR>"; 
            echo $results[$i][text]."</span></td></tr>"; 
         } 
      } else {echo "<tr><td align=center>Keine passenden Seiten gefunden</td></tr>"; } 
   } else {echo "<tr><td align=center>Keine passenden Seiten gefunden</td></tr>"; } 
} 
echo "</table></center>"; 
?> 
Gesperrt