Projektbeschreibung “Filterverlinkungen ab der Gambio Shopsoftware Version 2.1”

28. Dezember 2012

1. Grundlage

Ab der Gambio Shopsoftware Version 2.0 ist standardmäßig ein Produkt-Filter im Shopsystem implementiert. Das Filtersystem gibt dem Kunden die Möglichkeit, beliebige Filterwerte zur Einschränkung der Suchergebnisse zu wählen, um irrelevante Ergebnisse auszuschließen. Dabei werden alle Filterwerte, die einem Produkt zugewiesen sind, geprüft und im Falle eines Treffers in den Suchergebnissen angezeigt. Dabei werden dem Benutzer alle möglichen Kombinationen von Filterwerten zur Auswahl gegeben, was zur Folge hat, dass es auch zu Suchergebnissen ohne einen Treffer kommen kann.

Filterwerte, die einem Produkt zugewiesen sind, werden alle miteinander verknüpft. Wählt man beispielsweise die Filterwerte “VW”, “Polo”, “Audi” und “A1” für einen Autoblinker, der bei diesen beiden Automodellen passt, so werden unter anderem auch die Werte “Audi” und “Polo” miteinander verknüpft, obwohl sie keine sinnvolle Einheit bilden. Der Shopbetreiber hat keine Möglichkeit, die Verknüpfungen seiner Filterwerte separat zu definieren.

2. Projektziel

Durch ein neues Modul soll es möglich sein, eine Verbindung zwischen einzelnen Filterwerten herzustellen, wonach im Shop gefiltert werden kann. Durch die weiteren Verknüpfungen und dadurch entstehende Filterung soll dem Kunden bei jeder Auswahl ein gültiges Ergebnis, mit mindestens einem Produkt, angezeigt werden.

3. Lösungswege

3.1 Globale Paarverknüpfungen zwischen Filterwerten

Der erste Lösungsansatz nutzt Verknüpfungen zwischen den einzelnen Filterwerten. Dabei wird zu einem Filterwert ein weiterer zugehöriger Filterwert gespeichert. Durch diese Technik entstehen direkte Verbindungen zwischen zwei Filterwerten, die direkt miteinander verknüpft sind. Filterwerte, die sich gegenseitig ausschließen, werden bei diesem Lösungsansatz nicht miteinander verknüpft. Der Vorteil dieser Technik liegt in der globalen Einstellung dieser Verknüpfungen.

3.2 Zuweisungen zwischen Filterwerten und Produkten in Gruppen (Sets)

Der zweite Lösungsansatz nutzt Gruppen, um die passenden Filterwerte nicht alle zusammen dem Produkt zuzuweisen. Diese Gruppen (so genannte Sets) befinden sich zwischen Produkt und Filterwerten und dienen als Schnittstelle. Dadurch werden zukünftig die Filterwerte nicht mehr dem Produkt direkt, sondern einer Gruppe zugewiesen. Diese Gruppen werden wiederum den Produkten zugewiesen. Durch die Aufteilung in Gruppen ist es nun möglich, nicht zusammengehörende Filterwerte zu trennen, wodurch eine korrekte Anzeige im Shop möglich ist.

3.3 Entscheidungsfindung

Beide Lösungsansätze haben Vor- und Nachteile. Beim ersten Lösungsansatz müssen die Verknüpfungen zwischen den Filterwerten nur einmal global im Shop eingerichtet werden. Beispielweise müssen die Werte “VW” & “Golf” nur einmal miteinander verknüpft werden, egal, wie viele Produkte diese Verknüpfungen benötigen. Darin liegt wiederum ein Nachteil, denn eine globale Verknüpfung zwischen zwei Filterwerten kann für einzelne Produkte nicht gelöscht werden. Somit besteht keine Möglichkeit, Ausnahmen von solchen Verknüpfungen zu definieren.

Die zweite Variante verknüpft Filterwerte nicht global, sondern auf Produktebene. Aufgrund dessen ist die Verknüpfung zwischen Werten sehr genau und führt dadurch nicht zu Fehlern. Nachteil wiederum ist, dass der Shopbetreiber zum Teil mehrere Filterwerte doppelt zuweisen muss, da manche Werte zu mehrere Sets gehören. Wie viel Mehrarbeit dadurch entsteht, ist abhängig von der Produktart und kommt darauf an, wie viele Filterwerte sich gegenseitig ausschließen. Je mehr Filterwerte sich ausschließen, desto mehr Filtersets müssen für dasselbe Produkt erstellt werden.

Letztendlich wurde der zweite Lösungsansatz gewählt, da bei dieser Technik ein sehr genaues Ergebnis geliefert wird (keine leeren Suchergebnisseiten im Shop), wodurch der Mehraufwand gerechtfertigt wird.

4. Umsetzung

4.1 Änderung der Tabellenstruktur in der MySQL-Datenbank

In den bisherigen Versionen wurden die Produkte mit den Filterwerten direkt verknüpft, wodurch lediglich eine Tabelle benötigt wurde. Aufgrund der Performance wurde eine weitere Tabelle erstellt, welche als Index-Tabelle dient. Durch die Einführung der Sets musste die Tabellenstruktur angepasst werden, damit alle nötigen Informationen abgebildet werden können. Insgesamt wurden mehrere Tabellen hinzugefügt, damit Sets und dazugehörige Set-Werte gespeichert werden können. Anhand der neuen Tabellen wird auch in Zukunft die Index-Tabelle gefüllt, damit das spätere Auswerten der Filterkriterien zu einem schnelleren Ergebnis führt.

4.2 Erstellung einer Bearbeitungsmaske

In der Produktbearbeitung im Administrationsbereich ist ein neuer Bereich mit dem Namen “Filterauswahl” entstanden. Hier hat der Shopbetreiber die Möglichkeit, Filtersets für das Produkt anzulegen, zu bearbeiten und zu löschen. In den meisten Fällen wird die Definition eines einzelnen Sets reichen, möchte man jedoch eine Kombination aus Filterwerten von anderen zugewiesenen Filterwerten separieren, so muss diese in einem zusätzlichen Set definiert werden.

Zur Verwaltung der Sets wird die neu entwickelte Lightbox verwendet, die die angezeigten Daten per AJAX erhält. Dadurch werden Änderungen direkt übernommen, ohne dass ein Neuladen der Seite nötig ist. Ein weiteres Feature ist das Hinzufügen kategoriefremder Filter in der Eingabemaske der Filtersets. So kann der Shopbetreiber, wenn er bei der Definition eines Sets bemerkt, dass ein weiterer Filter für diesen Artikel relevant ist, diesen direkt dem Set hinzufügen, ohne den Filter vorher der Kategorie zuordnen zu müssen. Dadurch muss er seine Arbeit nicht unterbrechen und kann den Filter nach dem Bearbeiten der Kategorie zuweisen. Das Verhalten der einzelnen Filterboxen unterscheidet sich, entgegen der optischen Darstellung, von gewöhnlichen Multiselectboxen, um dem Shopbetreiber eine intuitive Auswahl der einzelnen Filterwerte zu ermöglichen. Anders als bei einer Selectbox, ist es für die Mehrfachauswahl nicht nötig, die “Strg”-Taste gedrückt zu halten.

Für die Umsetzung wurden zwei Templates für die Anzeige der Sets und der einzelnen Filterboxen angelegt. Eine Controller-Klasse zur Steuerung des Programmflusses sowie eine Logikklasse, in der die Verarbeitung der Daten stattfindet, wurden während der Entwicklung ebenfalls implementiert. In vier separaten Javascript-Dateien wird das Verhalten der Bearbeitungsmaske, wie auch das Anzeigeverhalten der Filter, im Frontend gesteuert. Für die Verarbeitung und anzuzeigenden Ergebnisse der AJAX-Requests wurden zwei AJAX-Handler (einer für den Administrationsbereich und einer für den Shop) sowie eine ContentView-Klasse entwickelt. Im Rahmen der Entwicklung wurden zudem einige strukturelle Änderungen vorgenommen, um den Anforderungen an die Performance zu entsprechen. Unter anderem wurde dabei eine ContentView-Klasse für die Lightbox entwickelt.

4.3 Umsetzung der Anzeigelogik

Kernbereich des neuen Moduls ist die Filterung der Filterwerte anhand bereits ausgewählter Werte. Durch die implementierte Logik werden nicht mehr passende Filterwerte ausgeblendet. Die Anzeige einer leeren Suchergebnisseite ist so nicht mehr möglich. Die Filterung der noch verfügbaren Werte geschieht mittels AJAX. Nach jedem Klick wird durch einen Request die bereits getätigte Auswahl an einen AJAX-Handler übermittelt. Dieser leitet die übermittelten Daten an eine Logik-Klasse weiter, welche die Prüfung und Ermittlung der noch verfügbaren Filterwerte übernimmt. Als Rückgabewert wird eine Liste der noch verfügbaren Filterwerte erwartet. Nachdem eine gültige Liste zurückgegeben wurde, wird über alle Filterwerte iteriert und geprüft, ob der jeweilige Filterwert weiterhin angezeigt werden darf. Dabei werden verschiedene Anzeige-Modi verwendet. Der Shopbetreiber kann auswählen, ob alle Filter gleichzeitig oder stufenweise nach jeder Auswahl angezeigt werden sollen. Auch die Anzeige der auszublenden Filterwerte kann der Shopbetreiber auswählen. Das Ausblenden sowie das Deaktivieren eines Filterwertes sind im Shop möglich.
Bei der Ermittlung der noch verfügbaren Filterwerte gehen wir von Kombinationen aus. Dabei werden alle Sets als eine eigene Kombination angesehen, die wir mit der Kombination der bisher ausgewählten Filterwerte vergleichen. Aufgrund dieser Ausgangslage können wir die noch verfügbaren Filterwerte ermitteln. Durch einen weiteren Klick eines Kunden wird die Auswahl der noch verfügbaren Kombinationen eingeschränkt, bis nur noch ein Set verfügbar ist, oder alle Filter vom Kunden ausgewählt wurden. In diesen Fällen findet des System aufgrund der ausgewählten Filterwerte mindestens ein Set, welches wiederum einem Produkt zugeordnet ist, das nun als Suchergebnis angezeigt wird. Sollten mehrere Sets verfügbar sein, werden alle dazu passenden Produkte angezeigt.
Um zu gewährleisten, dass der Kunde ausschließlich Suchergebnisse mit mindestens einem Treffer erhält, werden die verfügbaren Filterwerte nach jeder Filterauswahl neu ermittelt. Dies geschieht mit Hilfe von AJAX, weshalb auch kein Neuladen der Seite nötig ist.

Die verfügbaren Werte werden als Response an den Browser zurückgegeben, wodurch das Javascript die nicht mehr verfügbaren Werte aus- und die verfügbaren Werte einblendet.

5. Schwierigkeiten bei der Umsetzung

5.1 Verschiedene Verknüpfungsarten einzelner Filter

Durch die Möglichkeit, den einzelnen Kategoriefiltern verschiedene Verknüpfungsarten, also UND- oder ODER-Verknüpfungen, zuzuweisen, ist es erforderlich, eine Filterlogik zu verwenden, die die Verwendung beider Arten gleichzeitig zulässt. Es ist gelungen, eine solche zu entwickeln und sowohl dem Shopbetreiber, als auch dem Kunden eine komfortable Nutzung und Konfiguration zu bieten. Für eine reibungslose und intuitive Nutzbarkeit ist dem Shopbetreiber empfohlen, innerhalb einer Kategorie nur dann verschiedene Verknüpfungsarten für die einzelnen Filter zu vergeben, wenn dies ein in dem entsprechenden Kontext erwartetes Verhalten ist. Beispielsweise wäre es sinnvoll, die verschiedenen Filter, wie “Marke”, „Modell“ und „Farbe“ einer Kategorie “Autos” mit einer ODER-Verknüpfung zu versehen. Bei einem weiteren Filter “Extras” wäre zu erwarten, dass dieser UND-verknüpft ist. Wenn der Kunde nämlich nach einem Auto mit Navigationsgerät und Klimaanlage sucht, in der Ergebnismenge jedoch auch Autos angezeigt werden, die nur einen dieser Komfortextras besitzt, ist dies kein relevantes Ergebnis und sollte auch nicht in der Ergebnismenge enthalten sein.

5.2 Anzeige von Filterwerten, die durch eine Änderung erreichbar sind

Die Ermittlung der verfügbaren Filterwerte erfolgt durch zwei SQL-Anfragen. Die erste sucht alle Filterwerte, die in Sets enthalten sind, die einen vollständigen Treffer der gewählten Filter darstellt. Die zweite ist dazu da, dem Kunden mehr Spielraum in der Wahl seiner Filter zu bieten. Es sollen nämlich zusätzlich alle Filterwerte angezeigt werden, die mit einer weiteren Selektion erreichbar sind. So sucht die zweite SQL-Anfrage nach allen Filterwerten, die durch Ausschluss der gewählten Werte jeweils eines Filters, innerhalb der Filter, von denen mindestens ein Wert gewählt wurde, verfügbar sind. Als Beispiel sei folgende Filterauswahl gegeben:

– Automarke: VW

– Modell: Golf

– Farbe: Rot
Die zweite SQL-Anfrage würde in diesem Fall nach Werten in Sets suchen, die entweder VW und Golf oder VW und Rot oder Golf und Rot beinhalten. Die gefundenen Werte müssen zudem Werte des jeweils ausgesparten Features sein. Das bedeutet für diesen Fall, dass Farben aus Sets, die VW und Golf enthalten, Modelle aus Sets, die VW und Rot enthalten sowie Automarken aus Sets, die Golf und Rot enthalten, gefunden werden. So wird sichergestellt, dass der Kunde die Möglichkeiten hat, seine Filterung kulanter zu gestalten, als bei einem komplett restriktiven Filtersystem.
5.3 Ermittlung von noch verfügbaren Werten nach einer Deselektion (Klick-Historie)

Durch die Verwendung der ODER-Verknüpfung ist es möglich, dass Abhängigkeiten bei der Anzeige von verfügbaren Werten entstehen, so dass einige Werte erst durch zusätzliche Filterauswahlen zur Verfügung stehen. Werden solche abhängigen Filterwerte vom Kunden ausgewählt und der Kunde entscheidet sich anschließend, einen vorherigen Filter wieder abzuwählen, kann es passieren, dass die benötigte Grundlage zum Anzeigen bereits selektierter Werte nicht mehr vorhanden ist. Das Problem ist, dass in Folge dessen Selektionen des Kunden verschwinden können, was bei einer langen Liste selektierter Filterwerte durchaus zu Unzufriedenheit bei dem Kunden führen könnte. Deshalb wurde versucht, einen möglichst großen Teil der Selektion zu erhalten, ohne dass die Performanz zu sehr darunter leidet. Außerdem stellte sich die Frage, welche Auswahlen des Kunden Priorität haben.
Bei der Umsetzung wurde angenommen, dass der Nutzer die Werte, die für ihn am wichtigsten sind, zuerst auswählt. Die Sortierreihenfolge, die der Shopbetreiber im Backend vorgibt, suggeriert dem Nutzer zwar eine Selektionsreihenfolge (eine logische oder subjektive Sortierung des Shopbetreibers), jedoch kann der Kunde aus dieser ausbrechen und damit seine eigene Priorität definieren. Wenn jemand dies tut, wurde dies als Zeichen betrachtet, dass die Reihenfolge der Selektion durch den Kunden die eigentliche Priorität vorgibt. Während ein Shopbetreiber es z.B. als wichtiger findet, dass zuerst die Automarke gewählt wird, findet ein Kunde es vielleicht wichtiger, dass sein Auto rot sein soll. Um also dem Kunden eine möglichst wunschgetreue Erhaltung der Selektion zu bieten, wird eine Klick-Historie verwendet, anhand der entschieden wird, was erhalten bleibt.
Bei der Deselektion eines Wertes, von dem andere ausgewählte Werte abhängig sind, werden also Werte, die vor dem Deselektierten gewählt wurden, behalten. Auf dieser Grundlage wird eine SQL-Anfrage gesendet, die ermittelt, welche Werte, die nach dem Deselektierten gewählt wurden, noch immer Teil der Ergebnismenge sind. Diese Werte werden der Suchgrundlage hinzugefügt und es wird erneut per SQL-Anfrage geprüft, ob mit den zusätzlichen Filterwerten weitere selektierte Werte der ursprünglichen Auswahl gefunden werden. Dieser Vorgang wiederholt sich so lange, bis keine weiteren ausgewählten Werte gefunden werden.

5.4 Mehrere Benutzeraktionen gleichzeitig

Durch die Verwendung von Select- und Multiselectboxen passiert es, dass der Benutzer mit einem Klick mehrere Änderungen durchführt. Das hat zur Folge, dass die Verwaltung der Klick-Historie und die Verarbeitung der gewählten Filterwerte auch für eine Liste von Änderungen geeignet sein muss, so dass auch die Regeln, die in Abschnitt 5.3 dieses Artikels beschrieben sind, nach wie vor greifen. Diese Problematik wurde umgangen, indem die gleiche Vorgehensweise wie bei einer Deselektion genutzt wird. Durch die Klick-Historie ist bekannt, welche Werte weiterhin angeklickt wurden. Diese Gruppe von Werten dient als Grundlage für die noch verfügbaren Werte. Die neu angeklickten Werte werden danach der Gruppe hinzugefügt und die noch verfügbaren Werte aufgrund der neuen Gruppe herausgefiltert.