Package: shop-core Shop/Configurator
Der Konfigurator bietet die Möglichkeit eine Ansicht anhand einer Konfiguration darzustellen, die dazu dient, eine Entity über verschiedene UI-Elemente zu konfigurieren.
Beispiele:
shopSessionArticle dem die Menge, die Variante, das Editor-Dokument, etc. konfiguriert wird, bevor er in den Warenkorb gelegt wird.
Paketartikel
weitere
Ein Implementations- und Pflegebeispiel findet sich hier.
Funktionsweise
Die Idee hinter dem Konfigurator ist ein modularer Aufbau aus UI-Steuerelementen. Zum Beispiel die Checkoutbox mit dem Preis des Artikels und der Menge oder die Variantenauswahl. Beide Sachen sollten getrennt für sich im Konfigurator plalziert werden können sollen.
Um die Ansicht des Konfigurators zu definieren, steht dem Benutzer die Möglichkeit eine Konfiguration zu pflegen bereit. Dabei wird ein Konfigurator-Datensatz angelegt, welcher als Kind-Datensätze Konfiguratorbereiche verknüpft hat. In den Bereichen lassen sich dann über ein Auswahlfeld die einzelnen UI-Elemente zuordnen.
Der Konfigurator-Datensatz dient also dazu, diesen bei einem Artikel oder ähnlichem auszuwählen. Die Bereiche repräsentieren dann die Div-Elemente, die mit Varianten versehen werden können und quasi das Layout bilden. Bei den Bereichen lassen sich dann Inhalte auswählen, welche die einzelnen UI-Steuerelemente repräsentieren.
Wichtig: Den Namen des Konfigurators und der Bereiche sollten nicht als Identifikation verwendet werden. Das ist eine lose Strukturpflege, die ein Kunde vornehmen soll.
Beispiel (Artikelkonfigurator auf Basis des shopSessionArticle):
Konfigurator-Datensatz "Standard"
Bereich "Intro"
Varianten: xs-12
Inhalte: Artikelüberschrift, Artikelbeschreibung
Bereich "Stage"
Varianten: xs-12, md-6
Inhalte: Artikelgallerie
Bereich "Konfiguration"
Varianten: xs-12, md-6
Inhalte: Bestellprozess, Variantenauswahl
Erweiterbarkeit
Eigene Elemente registrieren
Ein eigenes Element sollte über \Brandbox\ShopCore\Shop\Configurator\Lib\Event\OnPopulateContents
registriert werden. Dadurch steht es auch in der Konfiguration bei den Bereichen als Auswahl zur Verfügung.
Eigene Elemente darstellen
Das Zusammenbauen des Elements sollte über \Brandbox\ShopCore\Shop\Configurator\Lib\Event\OnPopulateElement
gemacht werden. Hier muss aber zuerst geprüft werden, dass $event→identifier
und $event→context
für das Element valide sind.
Javascript
Der Konfigurator besitzt eine eigene Struktur für das Javascript, um direkt mit dem Artikel zu arbeiten.
Payload
Die Payload ist ein Datenobjekt, welches als Kommunikation zwischen JS und PHP gedacht ist.
Die Payload kann mit Shop\Configurator\Lib\Event\OnPopulatePayload
in PHP befüllt werden und wird bei configurator.change()
Requests mit JS an PHP Shop\Configurator\Lib\Event\OnExecuteChange
zurückgeschickt. Hier können auch eigene Daten hinzugefügt werden.
Change
Um eine Änderung oder Aktion im Konfigurator auszuführen, sollte die Change-Methode verwendet werden. Dabei sollte die payload
entsprechend angepasst werden und eine action
hinzugefügt werden und this.configurator.change
aufgerufen werden. Danach wird in PHP das Event Shop\Configurator\Lib\Event\OnExecuteChange
ausgeführt und man kann auf seine action
und die geänderte payload
reagieren. Um Feedback oder Änderungen der Payload zurück in die Ui zu liefern, sollten StackActions (Http\Response\AdvancedResponseStackElementAbstract
) verwendet werden.
Hinweis: Falls eigene Daten für in der Payload mitgeschickt werden sollen, sollten diese auch in OnPopulatePayload
hinzugefügt werden. Nicht nur beim Request im js. Siehe auch Abschnitt für Payload.
Beispiel js quantity change
// ... async myChangeAction() { if ( false === this.configurator.blocked && this.configurator.payload.hasOwnProperty('cartSessionArticle') && this.configurator.payload.cartSessionArticle.shopSessionArticleQuantity !== this.quantity ) { this.configurator.payload.cartSessionArticle.shopSessionArticleQuantity = this.quantity this.configurator.payload.actions.push('MyChangeAction') this.configurator.change() } } // ...
Beispiel php quantity change
// ... public const ACTION_QUANTITY = 'MyChangeAction'; public const PAYLOAD_KEY = 'cartSessionArticle'; // $payload = Configurator\Lib\Event\OnExecuteChange $event->payload public function process(array $payload, ?Http\Response\AdvancedResponseStack $response): void { // do not just copy. This is an example. if ( array_key_exists('actions', $payload) && in_array(self::ACTION_QUANTITY, $payload['actions']) && array_key_exists(self::PAYLOAD_KEY, $payload) && array_key_exists('shopSessionArticleQuantity', $payload[self::PAYLOAD_KEY]) ) { $entity = $this ->staticController(CartSessionArticle\Manager::class) ->getConfiguratorRequestEntity() ; if ($entity instanceof CartSessionArticle\Lib\Struct\CartSessionArticle) { $quantity = (int)$payload[self::PAYLOAD_KEY]['shopSessionArticleQuantity']; $this ->staticController(CartSessionArticle\Lib\Execute\Quantity::class) ->execute($entity->sessionArticle, $quantity) ; if ($response instanceof Http\Response\AdvancedResponseStack) { $element = new CartSessionArticle\Lib\Response\StackAction\ConfiguratorQuantityUpdate(); $element->quantity = $quantity; $response->add($element); } } } } // ...
Modul / eigenes Script laden
Um ein eigenes Modul für den Konfigurator zu laden, sollte das Data-Attribut "data-shop-configurator-module" verwendet werden. Dort sollte der Pfad von root /plugin/remote/brandbox/ beginnent angegeben werden.
Beispiel
$element->attributes['data-shop-configurator-module'] = '/plugin/remote/brandbox/shop-core/src/Shop/CartSessionArticle/js/configurator-quantity.js';
Erwartet wird mindestens folgendes:
Beispielklasse
export default class MyDummyConfiguratorModule { /** * @param {ShopConfigurator} configurator */ constructor(configurator) { this.configurator = configurator } async process(element) { this.element = element this.changeExample() } async changeExample() { this.configurator.payload.actions.push('MyActionKey') this.configurator.change() } }
constuctor
Übersicht Events View
Event | Beschreibung |
---|---|
| Damit kann ein eigenes Element registriert werden. Siehe auch "Eigenes Element registrieren". |
| Damit kann Einfluss über den Context genommen werden. Der Kontext dient als Basis für folgende Events und definiert, in welchem Kontext der Konfigurator gerade aufgerufen wird. |
| Damit kann die Struktur angepasst werden. Die Struktur ist der Aufbau der Bereiche und deren Inhalten. Das ist die Ebene der Pflege der Konfiguration für den Konfigurator. |
| Aufbau der UI-Elemente. Standardmäßig wird hier auch |
| Aufbau der UI-Elemente des einzelnen Bereichs. Standardmäßig wird hier auch |
| Aufbau des spezifischen UI-Elements für den in der Struktur hinterlegten Inhalt für diesen konkreten Bereich. Siehe auch "Eigene Elemente darstellen". |
| Dient dazu, die HTML-Meta-Tags wie keywords, title, canonical link für den Kontext des Konfigurators zu definierten. |
Übersicht Events Daten
Event | Beschreibung |
---|---|
| Wird nach dem Laden der Seite aufgerufen. Erlaubt das Ausführen von StackResponses direkt nach dem Aufrufen der Seite. |
| Die Payload steht im JS zur Verfügung und wird von da requests wieder an PHP mitgeschickt. |
| Die Options werden bei requests und posts vom Konfigurator mitgeschickt. |
| Wird bei Änderungen im Konfigurator via Request aufgerufen. Hier wird die Payload aus dem JS (und OnPopluatePayload) mitgeschickt. Zusätzlich gibt es in der $payload den allgemeinen Key 'actions', mit dem die ausgeführten Aktionen lose mitgegeben werden. |