Die Suchfunktion von xt:Commerce hat Schwierigkeiten mit Sonderzeichen. Sucht man beispielsweise nach “grün”, werden nur Artikel gefunden, in deren Namen die Zeichenkette “grün” vorkommt. Steht das Wort jedoch bloß im Artikeltext, taucht das Produkt ärgerlicherweise nicht in der Trefferliste auf.

Zum Ausprobieren: Einen Artikel namens “lölölö” anlegen, als Artikeltext nehmen wir “lalala”. Dann einen Artikel namens “lalala” anlegen, als Artikeltext nehmen wir “lölölö”. Sucht man nach “lölölö”, gibt’s nur ein Ergebnis - und nicht (wie man erwarten sollte) zwei

Das liegt daran, dass der FCK-Editor Sonderzeichen vorm Abspeichern in Entities wandelt, Artikelnamen landen hingegen unmaskiert in der Datenbank.

Und lölölö ist nun mal nicht ganz das selbe wie lölölö

 

Lölölösungsvorschlag:

Wir greifen uns die Datei “advanced_search_result.php”, fertigen eine Sicherheitskopie (!) an - und suchen nach der Stelle, wo die eingegebenen Suchbegriffe in den $where_str eingebaut werden. Das passiert in (ca.) Zeile 210:


default :
	$where_str .= " ( ";
	$where_str .= "pd.products_keywords LIKE ('%".addslashes($search_keywords[$i])."%') ";
	if (SEARCH_IN_DESC == 'true') {
	   $where_str .= "OR pd.products_description LIKE ('%".addslashes($search_keywords[$i])."%') ";
	   $where_str .= "OR pd.products_short_description LIKE ('%".addslashes($search_keywords[$i])."%') ";
	}
	$where_str .= "OR pd.products_name LIKE ('%".addslashes($search_keywords[$i])."%') ";
	$where_str .= "OR p.products_model LIKE ('%".addslashes($search_keywords[$i])."%') ";
	if (SEARCH_IN_ATTR == 'true') {
	   $where_str .= "OR (pov.products_options_values_name LIKE ('%".addslashes($search_keywords[$i])."%') ";
	   $where_str .= "AND pov.language_id = '".(int) $_SESSION['languages_id']."')";
	}
	$where_str .= " ) ";
	break;
}
	

Den ganzen Block ersetzen wir hiermit:


default :
	// Wurde nach Umlauten gesucht?
	$ent_keyword = htmlentities($search_keywords[$i]);
	$ent_keyword = ($ent_keyword != $search_keywords[$i]) ? addslashes($ent_keyword) : false;

	// addslashes langt einmal ...
	$keyword = addslashes($search_keywords[$i]);

	$where_str .= " ( ";
	$where_str .= "pd.products_keywords LIKE ('%".$keyword."%') ";
	$where_str .= ($ent_keyword) ? "OR pd.products_keywords LIKE ('%".$ent_keyword."%') " : '';
	if (SEARCH_IN_DESC == 'true') {
	   $where_str .= "OR pd.products_description LIKE ('%".$keyword."%') ";
	   $where_str .= ($ent_keyword) ? "OR pd.products_description LIKE ('%".$ent_keyword."%') " : '';
	   $where_str .= "OR pd.products_short_description LIKE ('%".$keyword."%') ";
	   $where_str .= ($ent_keyword) ? "OR pd.products_short_description LIKE ('%".$ent_keyword."%') " : '';
	}
	$where_str .= "OR pd.products_name LIKE ('%".$keyword."%') ";
	$where_str .= ($ent_keyword) ? "OR pd.products_name LIKE ('%".$ent_keyword."%') " : '';
	$where_str .= "OR p.products_model LIKE ('%".$keyword."%') ";
	$where_str .= ($ent_keyword) ? "OR p.products_model LIKE ('%".$ent_keyword."%') " : '';
	if (SEARCH_IN_ATTR == 'true') {
	   $where_str .= "OR (pov.products_options_values_name LIKE ('%".$keyword."%') ";
	   $where_str .= ($ent_keyword) ? "OR pov.products_options_values_name LIKE ('%".$ent_keyword."%') " : '';
	   $where_str .= "AND pov.language_id = '".(int) $_SESSION['languages_id']."')";
	}
	$where_str .= " ) ";
	break;
}
	

Was sich dadurch ändert: Zunächst einmal wird überprüft, ob der eingegebene Suchbegriff nach Anwendung von htmlentities anders aussieht als vorher.

  • Wenn ja, dann wurde nach einem Suchbegriff mit Sonderzeichen gesucht - und es muss sowohl nach der Variante mit Entities $ent_keyword als auch nach der Variante ohne Entities $keyword geforscht werden.
  • Wenn nein, ändert sich am resultierenden Abfrage-String nichts.
  • Und ich meine, man muss nicht unbedingt 6 Mal hintereinander addslashes ausführen lassen, wenn einmal eigentlich reichen würde.

Nun sollte die Suche das finden, was wir gerne hätten. Jedenfalls bei Installationen, die unter “iso-8859-15″ laufen, funktioniert es ordentlich. Mit UTF-8 hab ich’s noch nicht probiert. Da wäre Feedback willkommen.

 

Ich wünsche viel Spaß beim Basteln …
Und bitte nicht gleich am Live-Shop probieren, Tralala, das kennen wir ja.

:-)