Mittwoch, 1. April 2009 Druck-Ansicht
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ö
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.
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.
Bookmarks, Feed und Links
Wenn Ihnen dieser Beitrag geholfen hat ...
Beiträge zu ähnlichen Themen:
12 Antworten zu xt:Commerce - Suche nach Umlauten
Kommentar schreiben