nach tagelanger Arbeit (was wahrscheinlich groesstenteils auf mein PHP-Halbwissen zurueckzufuehren ist) und mit Hilfe der Ansaetze des einen oder anderen aus dem Forum (danke nochmal an dieser Stelle!) habe ich es nun doch hinbekommen. Mag sein, dass es auch schoenere Loesungen gibt, oder das eine oder andere effektiver gestaltet werden kann. Fuer konstruktive Kritik bin ich dankbar, und falls jemand Verbesserungsvorschlaege hat, bin ich (sofern sie sinnvoll sind ) bereit, sie in meine Loesung einzubauen, denn man muss nicht das Rad neu erfinden (was oft passiert, wenn einige im stillen Kaemmerlein herumwurschteln und "vergessen", die anderen teilhaben zu lassen). Hinweis: die Sache mit preg_replace kann viel Eleganter mit str_ireplace geloest werden, sofern man ueber PHP5 verfuegt. Da mir leider nur PHP4 zur Verfuegung steht, musste ich es umstaendlicher Loesen. Wer Lust hat, kann noch eine (zusaetzliche!) Version fuer PHP5 schreiben, denn eine solche Aenderung wuerde ich hier nicht einbauen.
Ich wollte eine Suche haben, die eine UND-/ODER-Verknuepfung der Suchbegriffe erlaubt. Die habe ich nicht gefunden, ausser der conFlakes-Suche von Andreas Kummer, die aber auch die conFlakes-Tabellen durchsucht. Da ich conFlakes nicht benutze, und i-fekt festgestellt hat, dass die Suche bei ihm sehr langsam ist (was vermutlich auf die gemischte Nutzung, conFlakes und "normale" Artikel, zurueckzufuehren ist; sicher sind wir uns aber nicht), war diese Suche "too much". Deswegen habe ich daraus den conFlakes-spezifischen Teil herausgenommen.
Eine Kleinigkeit habe ich noch geaendert, weil ich wollte, dass "UND" als Vorauswahl angeklickt ist; die Fontskalierungen habe ich ebenfalls herausgenommen, weil die Ausgabe bei mir etwas merkwuerdig aussah.
Was ich auch unbedingt haben wollte: wenn man die Trefferliste hat und die Trefferseiten anklickt, sollen auf den Seiten die Suchbegriffe hervorgehoben werden, sonst muss man mit der Browsersuche innerhalb der einzelnen Seiten wieder suchen. Was man noch machen koennte: auf der Seite mit der Trefferliste die Suchbegriffe hervorheben, falls diese in den angezeigten Ueberschriften vorkommen.
Was man ebenfalls noch machen koennte: die Suche auf zwei Containern aufteilen.
Wegen des Highlightings mussten auch die Module Text (HTML), Headline (HTML) und Subheadline (HTML) geaendert werden.
Jetzt aber genug der Vorrede, hier kommen die Module. Es handelt sich bei allen Modulen um den Output-Bereich, der Input-Bereich bleibt jeweils leer.
Volltextsuche:
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : w3concepts.search.v1.1
* Author : Andreas Kummer
* Copyright : mumprecht & kummer w3concepts
* Created : 2004-12-29
* Modified : 2005-07-27
* Modified by : Christa Tabara
* conFlakes-Teil herausgenommen, leicht umgeschrieben
* ***********************************************/
class Search {
function Search() {
// Globale Variablen in Klassenkontext aufnehmen
$this->getGlobals();
// Übergabeparameter in Klassenkontext aufnehmen
$this->importParameters();
// Datenbankverbindung herstellen
$this->db = new DB_Contenido;
// Suchmaske ausgeben
echo $this->getSearchMask();
// Suche vornehmen
if (!empty($this->post['searchEntry'])) {
$this->doSearch();
$this->showResults();
}
}
function getGlobals() {
global $auth;
$this->classGlobal['auth'] = $auth;
}
function importParameters() {
$this->get = array ();
if (!empty ($_GET))
foreach ($_GET as $key => $value) {
$this->get[$key] = $value;
}
$this->post = array ();
if (!empty ($_POST))
foreach ($_POST as $key => $value) {
$this->post[$key] = $value;
}
}
function getSearchMask() {
if (array_key_exists('searchEntry',$this->post)) {
$searchEntry = $this->post['searchEntry'];
} else {
$searchEntry = '';
}
$returnvalue = "<form style=\"display:inline;\" name=\"Search\" method=\"POST\" action=\"".$this->classGlobal[auth]->url()."\">";
$returnvalue .= "<div><input style=\"border:solid 1px #999; padding:3px;\" type=\"text\" name=\"searchEntry\" size=\"30\" value=\"$searchEntry\"/>";
$returnvalue .= ' <input type="submit" name="doSearch" value="Suche starten" /></div>';
if (!empty($this->post['logical']) && $this->post['logical'] == 'or') {
$returnvalue .= '<div style="margin-top:10px; margin-bottom:30px;"><fieldset><legend>Logische Verknüpfung der Suchbegriffe</legend><div style="margin-bottom:5px; margin-top:5px;"><input style="vertical-align:bottom;" type="radio" name="logical" value="and" /> UND (alle Begriffe sind vorhanden)</div>';
$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" checked="checked" /> ODER (ein Begriff oder mehrere sind vorhanden)</div></fieldset></div>';
} else {
$returnvalue .= '<div style="margin-top:10px; margin-bottom:30px;font-size: 12px;"><fieldset><legend>Logische Verknüpfung der Suchbegriffe</legend><div style="margin-bottom:5px; margin-top:5px;"><input style="vertical-align:bottom;" type="radio" name="logical" value="and" checked="checked" /> UND (alle Begriffe sind vorhanden)</div>';
$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" /> ODER (ein Begriff oder mehrere sind vorhanden)</div></fieldset></div>';
}
$returnvalue .= '</form>';
return $returnvalue;
}
function doSearch() {
global $cfg, $client, $lang;
$sql = "" .
"SELECT " .
" a.title, " .
" a.idart, " .
" a.summary, " .
" a.idartlang, " .
" b.idcat, " .
" count(*) AS ordervalue, " .
" a.lastmodified " .
"FROM {$cfg['tab']['art_lang']} AS a " .
"LEFT JOIN {$cfg['tab']['cat_art']} AS b ON a.idart = b.idart " .
"LEFT JOIN {$cfg['tab']['cat']} AS c ON b.idcat = c.idcat " .
"LEFT JOIN {$cfg['tab']['content']} AS d ON a.idartlang = d.idartlang " .
"WHERE " .
" c.idclient = $client " .
" AND a.idlang = $lang " .
" AND a.online = 1 ";
$searchString = str_replace('*','.*',trim(strtolower($this->post['searchEntry'])));
if ($this->post['logical'] == 'or') {
// Suchbegriffe sind logisch ODER-verknüpft
$regExpression = "(".str_replace(" ", ")|(", $searchString).")";
$s = ereg_replace("ü", "%FC", $regExpression);
$s = ereg_replace("ä", "%E4", $s);
$s = ereg_replace("ö", "%F6", $s);
$regExpression .= " | $s";
$whereClause = " " .
"AND (" .
" d.value REGEXP '{$regExpression}' " .
" OR a.title REGEXP '{$regExpression}' " .
" OR a.summary REGEXP '{$regExpression}' " .
" OR d.value REGEXP '{$s}' " .
" OR a.title REGEXP '{$s}' " .
" OR a.summary REGEXP '{$s}' " .
" ) ";
} else {
// Suchbegriffe sind logisch UND-verknüpft
$searchStrings = explode(' ',$searchString);
$whereClause = '';
foreach ($searchStrings as $search) {
$regExpression = "($search)";
$s = ereg_replace("ü", "%FC", $regExpression);
$s = ereg_replace("ä", "%E4", $s);
$s = ereg_replace("ö", "%F6", $s);
// $regExpression .= " | $s";
$whereClause .= " " .
"AND (" .
" d.value REGEXP '{$regExpression}' " .
" OR a.title REGEXP '{$regExpression}' " .
" OR a.summary REGEXP '{$regExpression}' " .
" OR d.value REGEXP '{$s}' " .
" OR a.title REGEXP '{$s}' " .
" OR a.summary REGEXP '{$s}' " .
" ) ";
}
}
$sql = $sql.$whereClause;
$sql = $sql." " .
"GROUP BY " .
" a.title, " .
" a.idart, " .
" a.summary, " .
" a.idartlang, " .
" b.idcat, " .
" a.lastmodified " .
"ORDER BY " .
" ordervalue DESC";
$this->db->query($sql);
$this->searchResults = array();
while ($this->db->next_record()) {
$this->searchResults[$this->db->f('idartlang')] = array('idart'=>$this->db->f('idart'),'idcat'=>$this->db->f('idcat'),'title'=>$this->db->f('title'),'summary'=>$this->db->f('summary'),'lastmodified'=>$this->db->f('lastmodified'));
}
}
function showResults() {
global $sess, $cfgClient, $client, $lang;
// Ausgabe der Suchresultate
if (!empty($this->searchResults)) {
// Ausgabe der Resultate
$counter = 0;
foreach ($this->searchResults as $result) {
$counter++;
$suchwort = $this->post['searchEntry'];
$link = $link = $sess->url($cfgClient[$client]['path']['htmlpath']."front_content.php?client=$client&lang=$lang&idcat={$result['idcat']}&idart={$result['idart']}&suchwort=$suchwort");
echo '<div style="margin-bottom:15px;">';
echo "<div style=\"margin-bottom:5px;font-size: 12px;\"><a href=\"$link\"><span style=\"font-weight:bold;\">{$result['title']}</span></a></div>";
echo "<div style=\"margin-bottom:5px;font-size: 12px;\">{$result['summary']}</div>";
echo "<div style=\"font-size: 10px;\">Letztmals aktualisiert: {$result['lastmodified']}</div>";
echo '</div>';
}
} else {
// Ausgabe der Meldung, dass keine Seiten gefunden worden sind.
echo '<div style="font-size: 12px;">Die Suche ergab keine Resultate. Versuchen Sie es bitte mit anderen Suchbegriffen.</div>';
}
}
}
$Search = new Search();
?>
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : Text (HTML)
* Author : Christa Tabara & i-fekt
* Copyright : Christa Tabara & i-fekt
* Created : 2005-07-25
* Modified : 2005-07-27
* Version : 1.1 (fuer Volltextsuche mit Highlighting)
* ***********************************************/
if ($edit && empty($_REQUEST['edit'])) {
// Edit-Mode
echo "CMS_HTML[1]";
} else if (("CMS_HTML[1]" != "") && ("CMS_HTML[1]" != " ")) {
$hol_das_suchwort = $_GET[suchwort];
$suchbegriffe = explode(" ",$hol_das_suchwort);
$einlesen = "CMS_HTML[1]";
foreach ($suchbegriffe as $suchbegriff)
{
if ($suchbegriff!="")
{$regexp = "/$suchbegriff/i";
$einlesen = preg_replace($regexp, "<span class=\"suche\">$0</span>", $einlesen);
}
}
echo $einlesen;
}
?>
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : Headline (HTML)
* Author : Christa Tabara & i-fekt
* Copyright : Christa Tabara & i-fekt
* Created : 2005-07-25
* Modified : 2005-07-27
* Version : 1.1 (fuer Volltextsuche mit Highlighting)
* ***********************************************/
if ($edit && empty($_REQUEST['edit'])) {
// Edit-Mode
echo "CMS_HTMLHEAD[1]";
} else if (("CMS_HTMLHEAD[1]" != "") && ("CMS_HTMLHEAD[1]" != " ")) {
$hol_das_suchwort = $_GET[suchwort];
$suchbegriffe = explode(" ",$hol_das_suchwort);
$einlesen = "CMS_HTMLHEAD[1]";
foreach ($suchbegriffe as $suchbegriff)
{
if ($suchbegriff!="")
{$regexp = "/$suchbegriff/i";
$einlesen = preg_replace($regexp, "<span class=\"suche\">$0</span>", $einlesen);
}
}
echo $einlesen;
}
?>
Code: Alles auswählen
<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname : Subheadline (HTML)
* Author : Christa Tabara & i-fekt
* Copyright : Christa Tabara & i-fekt
* Created : 2005-07-25
* Modified : 2005-07-27
* Version : 1.1 (fuer Volltextsuche mit Highlighting)
* ***********************************************/
if ($edit && empty($_REQUEST['edit'])) {
// Edit-Mode
echo "CMS_HTMLHEAD[2]";
} else if (("CMS_HTMLHEAD[2]" != "") && ("CMS_HTMLHEAD[2]" != " ")) {
$hol_das_suchwort = $_GET[suchwort];
$suchbegriffe = explode(" ",$hol_das_suchwort);
$einlesen = "CMS_HTMLHEAD[2]";
foreach ($suchbegriffe as $suchbegriff)
{
if ($suchbegriff!="")
{$regexp = "/$suchbegriff/i";
$einlesen = preg_replace($regexp, "<span class=\"suche\">$0</span>", $einlesen);
}
}
echo $einlesen;
}
?>
Code: Alles auswählen
.suche {
border:1px solid #000080;
background-color:#92DD71;
}
Christa