Volltextsuche mit Highlighting und UND-/ODER-Verknuepfung

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Volltextsuche mit Highlighting und UND-/ODER-Verknuepfung

Beitrag von Halchteranerin » Mi 27. Jul 2005, 16:52

Hallo,

nach tagelanger Arbeit (was wahrscheinlich groesstenteils auf mein PHP-Halbwissen zurueckzufuehren ist) :lol: 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 :wink:) 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 .= '&nbsp;<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" />&nbsp;UND (alle Begriffe sind vorhanden)</div>';
			$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" checked="checked" />&nbsp;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" />&nbsp;UND (alle Begriffe sind vorhanden)</div>';
			$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or"  />&nbsp;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();

?>
Text (HTML):

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]" != "&nbsp;")) {
	 $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;
}
?>
Headline (HTML):

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]" != "&nbsp;")) {
	 $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;
}
?>
Subheadline (HTML):

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]" != "&nbsp;")) {
	 $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;
}
?>
Mein css-Eintrag als Beispiel, aber das sollte fuer die eigene Seite natuerlich angepasst werden:

Code: Alles auswählen

.suche {
    border:1px solid #000080;
    background-color:#92DD71;
  }
Viel Spass!
Christa

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Mi 27. Jul 2005, 20:08

Volltextsuche mit GET statt POST (Output):

Code: Alles auswählen

<?php  

/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :	   w3concepts.search.v1.2 
* Author      :     Andreas Kummer
* Copyright   :     mumprecht & kummer w3concepts 
* Created     :     2004-12-29
* Modified    :     2005-07-27
* Modified by :     Christa Tabara
* conFlakes-Teil herausgenommen
* ***********************************************/

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 ($_GET))
			foreach ($_GET as $key => $value) {
				$this->post[$key] = $value;
			}
	}
	
	function getSearchMask() {
		
		if (array_key_exists('searchEntry',$this->post)) {
			$searchEntry = $this->post['searchEntry'];
		} else {
			$searchEntry = '';
		}
		$kat = "$_GET[idcat]";
		$sucheintrag = "&$_GET[searchEntry]";
		if ("$_GET[logical]" != "") 
		  {
			$suchlogik = "&logical=$_GET[logical]";
  		}
   $returnvalue = "  <div>
   <form method=\"get\" action=\"front_content.php?idcat=$kat"."$sucheintrag"."$suchlogik\">\n
   <div><input type=\"hidden\" name=\"idcat\" value=\"33\"/>\n<input type='hidden' name='lang' value='1'>\n<input type='hidden' name='client' value='1'></div>\n";
		
		$returnvalue .= "<div><input style=\"border:solid 1px #999; padding:3px;\" type=\"text\" name=\"searchEntry\" size=\"30\" value=\"$searchEntry\"/>";
		$returnvalue .= '&nbsp;<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" />&nbsp;UND (alle Begriffe sind vorhanden)</div>';
			$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or" checked="checked" />&nbsp;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" />&nbsp;UND (alle Begriffe sind vorhanden)</div>';
			$returnvalue .= '<div><input style="vertical-align:bottom;" type="radio" name="logical" value="or"  />&nbsp;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();

?>
Achtung, bei dieser Version muessen folgende Werte angepasst werden (idcat ist die Kategorie, in der der Artikel fuer die Volltextsuche Startartikel ist!):
<div><input type=\"hidden\" name=\"idcat\" value=\"33\"/>\n<input type='hidden' name='lang' value='1'>\n<input type='hidden' name='client' value='1'></div>\n";
Und nochmal Obacht! Die obige Quelltext-Zeile soll nirgendwo extra eingefügt/angelegt werden. Es handelt sich dabei um einen Ausschnitt aus dem langen Quelltext (ungefaehr in der Mitte des Quelltextes kommt die zitierte Zeile vor).
Zuletzt geändert von Halchteranerin am Do 15. Sep 2005, 13:19, insgesamt 1-mal geändert.

sandra07
Beiträge: 93
Registriert: So 10. Apr 2005, 11:17
Wohnort: Schweiz
Kontaktdaten:

super!

Beitrag von sandra07 » Di 2. Aug 2005, 16:09

Hallo Halchteranerin

Super, das hast Du / Ihr wirklich super hingekriegt, auch das Problem mit der Gross- und Kleinschreibung geht jetzt! Gratuliere, gute Arbeit! :D

Was mir jetzt noch fehlt ist ein Eingabe-Suchfeld in einem separatem Container... Zurzeit stecke ich leider in Bergen von Arbeit und kann mich nicht dahinter setzen.
Gruss
Sandra

sandra07
Beiträge: 93
Registriert: So 10. Apr 2005, 11:17
Wohnort: Schweiz
Kontaktdaten:

Quelltext

Beitrag von sandra07 » So 7. Aug 2005, 12:15

Hallo Halchteranerin

Ich habe noch ein Problem mit der Volltextsuche. Das Modul sucht im Gesamten Quelltext. Falls man ein Suchwort benützt, das im Quelltext vorhanden ist, zeigt es auf der Ergebnisseite den entsprechenen Quelltext an.

Beispiel: ich suche nach "mitglied" und ich habe ein Bild bennent als "mitglieder.jpg" zeigt es mir dieses Bild nicht mehr an, sondern den Quelltext mitglieder.jpg">. Dasselbe passiert wenn ich z.B. das Suchwort "body" eingebe, zeigt es mir bei allen Tabellen, den Quelltext "body" auf den Seiten an.

Das Bilderproblem lässt sich ja lösen, indem man alle Bilder kompliziert benennt kliklit.jpg :lol: Aber wie könnte man denn die anderen Quelltextangaben, die nicht angezeigt werden sollen von der Suche ausschliessen??

Ich hoffe mein Gekritzel war einigermassen entzifferbar :)
Gruss
Sandra

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » So 7. Aug 2005, 20:12

Hallo Sandra,

dein "Gekritzel" war sehr gut entzifferbar :wink:, weil ich schon mit i-fekt ueber das Problem gesprochen habe. Er hatte mich darauf aufmerksam gemacht, dass Teile des Quelltextes angezeigt werden, wenn jemand nach HTML-Tags sucht. Erst habe ich ihm geantwortet, dass derjenige es nicht anders verdient hat :lol:, bis mir dann aber auffiel, dass auch das, was ich bei einer Tabelle z.B. als "summary" angegeben habe, ebenfalls angezeigt wird. Eine Loesung habe ich jedoch (noch?) nicht gefunden, sorry. :cry: Vielleicht hat jemand anders eine Idee ...

Gruss
Christa

sandra07
Beiträge: 93
Registriert: So 10. Apr 2005, 11:17
Wohnort: Schweiz
Kontaktdaten:

Nur im Text suchen

Beitrag von sandra07 » Do 11. Aug 2005, 11:42

Hallo, ich nochmals. Das Thema lässt mich nicht in Ruhe. Ich habe bemerkt, dass auch bei anderen Volltextsuchen die Bilder gefunden und dann nicht mehr angezeigt werden!

Ich habe nun den ganzen Morgen verbracht um die verschiedenen Volltextsuchen zu vergleichen, kann aber nicht eruieren wo das definiert wird, dass die Bildernamen von der Suche ausgeschlossen werden.

Kann mir jemand einen Anstoss geben wo ich anfangen soll zu suchen? Irgendwo im Modul bei der SQL-Abrage? Oder eher bei der Ausgabe?

Hilfeee.... :(
Gruss
Sandra

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 11. Aug 2005, 12:06

Na ja, aber wie gesagt, das Problem sind nicht nur die Bilder sondern allgemein, wenn Begriffe aus dem HTML-Quelltext gefunden werden. :cry:

yumila
Beiträge: 3
Registriert: Mo 15. Aug 2005, 08:24
Kontaktdaten:

Beitrag von yumila » Mo 15. Aug 2005, 08:28

Hallo erstmal und gleich vorweg ne Entschuldigung für die folgende Frage ;)

Ich habe ein Problem beim Einbauen des Suchmoduls und beim Suchen hier im Forum habe ich keine Antwort gefunden..

Also, ich habe mir den Code kopiert und ihn in ein neues Modul geschrieben (in den Output).
In meinem HTMl-Quelltext habe ich ein div, in das der container eingebettet ist und bei den templates habe ich ebenfalls das suchmodul integriert, doch wenn ich mir das ganze angucken will, passiert nichts.
also ich kann nicht suchen, weil es gar kein eingabefeld gibt.

Was habe ich denn vergessen anzulegen?
Wäre nett, wenn mir jemand helfen könnte :)

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Mo 15. Aug 2005, 08:36

yumila, hast du eines der beiden obigen Volltextsuche-Module angelegt? Welches, das erste oder das zweite?

Oben sind ja noch zwei weitere Module, die man braucht, wenn man ein Highlighting der Suchbegriffe auf der Ergebnisseite haben moechte, da gibt es natuerlich kein Eingabefeld.

Ist die Site online, so dass ich mir das ggf. anschauen kann? Wenn ja, bitte Zugangsdaten per PM schicken.

yumila
Beiträge: 3
Registriert: Mo 15. Aug 2005, 08:24
Kontaktdaten:

Beitrag von yumila » Mo 15. Aug 2005, 08:46

Halchteranerin,
ich habe das erste verwendet. Online ist die Site nicht.

Hm, also bei mehr fehlt allein schon das Eingabefeld für den Suchbegriff.
Hatte zunächst das Suchmodul aus dem Downloadbereich genommen und dort stand dann in meinem div nur "Suchbegriff:" , aber eingeben konnte ich nix. Muss ich da noch eine <form> anlegen?

naja, dann habe ich im forum gesucht und dieses suchmodul genommen, aber nun ist auch der "suchbegriff:" weg

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Mo 15. Aug 2005, 10:39

yumila hat geschrieben:Muss ich da noch eine <form> anlegen?
Nein, weil das durchs Modul erstellt wird. Steht in der errorlog.txt irgendwas?

yumila
Beiträge: 3
Registriert: Mo 15. Aug 2005, 08:24
Kontaktdaten:

Beitrag von yumila » Mo 15. Aug 2005, 11:09

Axo, ich habe meinen Fehler erkannt.
Habe keine Unterscheidung zwischen Eingabe und Ausgabe gemacht :oops:
Am besten sofort wieder vergessen :wink:

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Do 18. Aug 2005, 07:28

Hallo Sandra,

bist du noch "irgendwo in der Gegend"? Gestern Abend kam mir eine Idee, aber noch habe ich keine richtige Loesung gefunden. Ich fuerchte, da muesste man ein bisschen mehr im Modul umschreiben. Die Idee ist, dass man ueber den Text, mit dem man den Suchstring vergleichen will, die php-Funktion "strip_tags" laufen laesst. Das Problem ist, der Vergleich erfolgt z. Zt. innerhalb eines SQL-Statements, und da kann man, so viel ich weiss, keine php-Funktionen benutzen. :cry: Es sei denn, MySQL hat da eine Besonderheit. Aber da kann ich nur hoffen, dass sich jemand meldet, der MySQL besser kennt als ich.

Gruss
Christa

sandra07
Beiträge: 93
Registriert: So 10. Apr 2005, 11:17
Wohnort: Schweiz
Kontaktdaten:

ich bin hier

Beitrag von sandra07 » Do 18. Aug 2005, 08:04

Hallo Christa

Klar, ich bin doch immer in der Gegend :lol:

Deine Idee ist nicht schlecht, sowas könnte die Lösung sein. Nur leider bin ich da ebenfalls überfordert. Habe mich mit meiner "MySQL-Bibel" kurzgeschlossen, komme aber auch nicht weiter!

Ist hier ein MySQL - Profi "in der Gegend", der uns weiterhelfen könnte?? :?
Gruss
Sandra

delze
Beiträge: 8
Registriert: Do 18. Aug 2005, 10:31
Wohnort: NRW
Kontaktdaten:

Beitrag von delze » Do 18. Aug 2005, 11:11

Hallo Christa,
erstmal: DANKE :)
Deine Suche hilft mir sehr sehr weiter.
Mein Ansatz für das Tag-zerschiessen wäre folgender,es löst nicht das Problem im Kern, aber es ist ein Anfang für einen work-around, bis eine wirkliche Lösung vorliegt.
Den Text(HTML) Code habe ich mir so abgeändert

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]" != "&nbsp;")) { 
    $hol_das_suchwort = $_GET[suchwort]; 
         $suchbegriffe = explode(" ",$hol_das_suchwort); 
         $einlesen = "CMS_HTML[1]"; 
         foreach ($suchbegriffe as $suchbegriff) 
    { 
         if ($suchbegriff!="") 
         {$regexp = "/$suchbegriff/i"; 
         $einlesen_sicherung = $einlesen;
         $einlesen = preg_replace($regexp, "<span class=\"suche\">$0</span>", $einlesen); 
// modi delze
         if (strip_tags($einlesen_sicherung) == strip_tags($einlesen))
         {
               // da wurde wohl etwas INNERHALB eines Tags ersetzt, deshalb zurücsichern
               $einlesen = $einlesen_sicherung;
         }
//
         } 
         } 
        echo $einlesen; 
} 
?>
Ist keine Zauberei, fiel mir so ein...

Damit werden zwar die "falschen" Einträge gefunden (die Suche ist ja ein Teil-Problem), aber die Darstellung wenigstens nicht so zerschossen.

Schönen Gruß aus Aachen,
Ralph

Gesperrt