Projektbeschreibung Filterverlinkungen

Thema wurde von Timo (Gambio), 17. Dezember 2012 erstellt.

  1. Timo (Gambio)

    Timo (Gambio) Administrator

    Registriert seit:
    23. Juni 2011
    Beiträge:
    1.688
    Danke erhalten:
    651
    Danke vergeben:
    46
    Projektbeschreibung “Filterverlinkungen ab der Gambio Shopsoftware Version 2.1”

    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 alle möglichen Kombinationen von Filterwerten dem Benutzer 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-, sowie 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 zu keinen 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, je mehr Filtersets müssen für das selbe 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 nach dem Bearbeiten den Filter 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 (einen für den Administrationsbereich und einen für den Shop), sowie eine ContentView-Klasse entwickelt. Im Rahmen der Entwicklung wurden zudem einige strukturelle Änderungen vorgenommen, um den Anforderungen an die Performanz 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 einschrä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 dazupassenden 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, anhand dessen das Javascript die nicht mehr verfügbaren Werte ausblendet 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 sei dem Shopbetreiber empfohlen innerhalb einer Kategorie nur dann verschiedene Verknüpfungsarten für die einzelnen Filter zu vergeben, wenn dies 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. Der erste sucht alle Filterwerte, die in Sets enthalten sind, die einen vollständigen Treffer der gewählten Filter darstellt. Der 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 Ermittelung 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 sich anschließend entscheidet einen vorherigen Filter wieder abzuwählen, kann es passieren, dass somit 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 somit 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 z.B. wichtiger findet, dass zuerst die Automarke gewählt wird, findet ein Kunde vielleicht wichtiger das 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 ergibt sich der Fall, 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 geeicht sein muss, so dass auch die Regeln, die in Abschnitt 5.3 dieses Dokuments beschrieben sind, nach wie vor greifen. Diese Problematik wurde umschifft, indem auf gleiche Weise, wie auch selektierte Werte nach der Deselektion eines Wertes, der Grundlage für weitere selektierte Werte ist, zu erhalten versucht werden (siehe Abschnitt 5.3), eine möglichst große Anzahl von selektierten Werten in die Auswahl übernommen werden.