Die Funktion ist eine Template-Erweiterung und keine Kernfunktion des Shopsystems. Es gibt dafür keine eigene Konfiguration im Admin-Interface - die Steuerung erfolgt ausschließlich über die hier beschriebenen Template-Dateien.
Voraussetzungen
Damit der Produktvergleich sinnvoll funktioniert, muss das Kategoriefeld am Produkt gepflegt sein. Fehlt es, lassen sich Produkte weiterhin vergleichen, allerdings ohne Schutz vor kategorieübergreifenden Vergleichen. Der Shop benötigt ein freies Produktfeld, das die Kategorie eines Produkts als Text enthält (beispielsweiseBekleidung, Elektronik, Katzenfutter). Im BestPractice-Shop trägt dieses Feld den technischen Namen mainCategory. Ist das Feld bei einem Produkt leer, wird dieses Produkt beim Hinzufügen zu einer bestehenden Vergleichsliste abgelehnt, sobald die Liste bereits eine Kategorie festgelegt hat (siehe Wie der Produktvergleich funktioniert).
Begriffe und technische Namen auf einen Blick
Die Session speichert
compareIds als kommagetrennten String ("123,456,789"), nicht als Array. Grund dafür ist, dass $wsSession.set() bei einem leeren Array keinen Wert schreibt; ein leerer String lässt sich dagegen zuverlässig speichern und auslesen. Im Template wird der String bei jedem Aufruf über split(",") wieder in ein Array zerlegt.Wie der Produktvergleich funktioniert
Beim Versuch, ein Produkt zur Vergleichsliste hinzuzufügen, prüft der Shop die Kategorie in folgender Reihenfolge:- Die Liste ist leer. Das Produkt wird unabhängig von seiner Kategorie aufgenommen. Seine Kategorie (
mainCategory) wird dabei als sitzungsweite Vergleichskategorie (compareType) festgelegt. - Die Liste enthält bereits Produkte und die Kategorie des neuen Produkts stimmt mit der festgelegten Vergleichskategorie überein. Das Produkt wird aufgenommen.
- Die Kategorie stimmt nicht überein (oder ist am Produkt leer). Das Produkt wird nicht aufgenommen. Auf der Produktseite erscheint an Stelle des „Hinzufügen”-Links ein Hinweistext mit der aktuell geltenden Kategorie.
Die maximale Anzahl der vergleichbaren Produkte ist im Template-Code fest hinterlegt (
len($compareIds) >= 4) und keine Einstellung im Admin-Interface. Ein anderer Grenzwert lässt sich nur durch Ändern dieser Zahl direkt im Template erreichen.Anzeige im Shop
Button auf der Produktdetailseite
Auf der Produktseite erscheint je nach Zustand einer von vier Varianten:Badge im Header
Im Header zeigt ein Icon mit Zähler die aktuelle Anzahl der verglichenen Produkte an und verlinkt auf die Vergleichsseite. Der Zähler erscheint nur, wenn mindestens ein Produkt in der Liste ist.Vergleichsseite
Die Vergleichsseite (views/compare.htm) listet alle Produkte der aktuellen Vergleichsliste in einer Tabelle: eine Produktkarte pro Spalte (Bild, Name, Preis, Link zur Produktseite), darunter Preis, Artikelnummer, Beschreibung, Kategorie und alle weiteren gepflegten freien Felder. Felder, die bei keinem der verglichenen Produkte einen Wert tragen, werden nicht angezeigt. Zeilen, in denen sich die Werte unterscheiden, werden farblich hervorgehoben, damit Unterschiede auch bei vielen Feldern auf einen Blick erkennbar sind.
Ist die Liste leer, erscheint ein Leerzustand mit einem Link zurück zum Shop.
Module
Für die Umsetzung des Produktvergleichs werden folgende Module verwendet:- $wsSession - Speichern und Auslesen der Vergleichsliste (
compareIds) und der festgelegten Kategorie (compareType). - Aktionen - Übersicht - Aktion
SessionUpdate, um die Session vor dem Rendern der Seite zu schreiben. - $wsProducts - Laden der Produktdaten für jede ID in der Vergleichsliste auf der Vergleichsseite.
Einrichtung
Der Produktvergleich betrifft drei Template-Dateien: die Produktdetailseite (product.htm), den Header (header.htm bzw. die eingebundene Header-Komponente) und eine neu anzulegende Vergleichsseite (views/compare.htm). Die folgenden Schritte bauen aufeinander auf und sollten in dieser Reihenfolge umgesetzt werden.
Schritt 1: Kategoriefeld am Produkt bereitstellen
Legen Sie, falls noch nicht vorhanden, ein freies Produktfeld für die Kategorie an (siehe Voraussetzungen). In dieser Anleitung heißt das FeldmainCategory. Pflegen Sie es bei allen Produkten, die am Vergleich teilnehmen sollen.
Benutzerdefiniertes Feld anlegen
Falls solch ein Feld in Ihrem Shop noch nicht existiert, können Sie es wie folgt im Admin-Interface anlegen.- Unter Katalog → Produkte → Einstellungen → „+ Neu” kann ein neues Produktfeld angelegt werden.

- Vergeben Sie einen eindeutigen technischen Namen für Ihr Produktfeld und speichern Sie es.

- Anschließend ist das Feld am Produkt verfügbar und kann befüllt werden. In diesem Beispiel wird der Produkttyp Flyer verwendet, passend zum Produkt Flyer Option 1.

Feld an Produkten pflegen
Damit die Kategorieprüfung zuverlässig funktioniert, muss das Feld bei allen Produkten mit einem Wert befüllt sein. Produkte ohne Wert werden vom Vergleich ausgeschlossen, sobald bereits ein Produkt mit einem Wert in der Vergleichsliste liegt.Schritt 2: Vergleichsliste in product.htm einlesen
Öffnen Sie product.htm und fügen Sie ganz oben im Block content_main, vor der eigentlichen Seitenausgabe, den folgenden Abschnitt ein. Er liest den aktuellen Stand der Vergleichsliste aus der Session und bereitet ihn für die weitere Verwendung auf:
$compareIds steht ab dieser Stelle als Array von Produkt-IDs zur Verfügung, $compareType enthält die aktuell festgelegte Kategorie oder einen leeren String, wenn die Liste leer ist. Beide Variablen werden in den nächsten Schritten benötigt.
Schritt 3: Button-Bereich in product.htm einbauen
Fügen Sie an der Stelle, an der der Vergleichs-Button erscheinen soll (beispielsweise unterhalb des Warenkorb-Formulars), folgenden Block ein. Er berechnet je nach Zustand den passenden Formularinhalt und übergibt ihn an die Aktion SessionUpdate. Die maximale Anzahl von 4 Produkten ($maxReached) kann hier durch Ändern der Zahl an Ihren gewünschten Grenzwert angepasst werden:
Auf der Produktseite erscheint abhängig vom aktuellen Zustand automatisch der passende Button oder Hinweistext (siehe Anzeige im Shop).
Schritt 4: Badge im Header einbauen
Öffnen Sie die Header-Datei (header.htm bzw. die entsprechend eingebundene Komponente Ihres Templates) und fügen Sie im Bereich der übrigen Icons (Merkliste, Warenkorb) folgenden Block ein:
Im Header erscheint ein Icon mit Zähler, das auf die Vergleichsseite verlinkt. Der Zähler aktualisiert sich beim Hinzufügen oder Entfernen eines Produkts ohne Neuladen der Seite.
Schritt 5: Vergleichsseite anlegen
Legen Sie eine neue Dateiviews/compare.htm an. Sie ist eine eigenständige View und wird über {{= $wsViews.viewUrl('compare.htm') }} aufgerufen (siehe Schritt 4). Die Datei liest zunächst den Session-Stand ein - identisch zu Schritt 2:
<!DOCTYPE html>, eigenes <head> mit Stylesheet, <body>). Da compare.htm eine eigenständige View ist, wird kein Shop-Layout eingebunden - Kopf- und Fußbereich der Seite müssen, sofern gewünscht, selbst ergänzt werden.
Innerhalb des Seitenkörpers folgt zunächst der „Vergleich leeren”-Button:
{{ if len($compareIds) == 0 }} ... {{ else }} ...). Andernfalls werden die Produktdaten geladen:
tag, um sie voneinander zu unterscheiden:
Die Vergleichsseite zeigt alle Produkte der Liste mit einem eigenen Entfernen-Button pro Produkt sowie einem Button zum vollständigen Leeren der Liste.
Schritt 6: Vergleichstabelle mit dynamischen Feldern aufbauen
Nach den Produktkarten folgt die eigentliche Vergleichstabelle. Feste Zeilen wie Preis, Artikelnummer und Kategorie werden direkt ausgegeben. Für die übrigen, frei gepflegten Produktfelder wird zunächst ermittelt, welche Feldnamen bei mindestens einem der Produkte einen Wert tragen:$skipFields enthält die Felder, die bereits über eigene, fest formulierte Tabellenzeilen ausgegeben werden (beispielsweise das Bild oder die Kategorie), damit sie nicht ein zweites Mal in der dynamischen Liste erscheinen. Passen Sie diese Liste an die in Ihrem Shop verwendeten Feldnamen an.Felder, die bei keinem der verglichenen Produkte einen Wert tragen, erscheinen nicht in der Tabelle. Zeilen, in denen sich die Werte zwischen den Produkten unterscheiden, erhalten die CSS-Klasse
highlight und lassen sich damit optisch hervorheben (beispielsweise mit einem farbigen Hintergrund).
Weiterführende Links
- $wsSession - Speichern und Lesen sitzungsweiter Werte.
- Aktionen - Übersicht - Funktionsweise von Aktionen, insbesondere die Verarbeitung vor dem Rendern und die Ausführung per AJAX über
wsReplaceIds. - $wsProducts - Laden einzelner Produkte anhand ihrer ID.
- $wsViews - Erzeugen von View-URLs für eigene Views wie
compare.htm.
