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";
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>";
?>