Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

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.

...

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

...

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
Codeblock
languagejs
// ...

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
Codeblock
languagephp
// ...

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
Codeblock
languagejs
$element->attributes['data-shop-configurator-module'] = '/plugin/remote/brandbox/shop-core/src/Shop/CartSessionArticle/js/configurator-quantity.js';

Erwartet wird mindestens folgendes:

Beispielklasse
Codeblock
languagejs
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

Shop\Configurator\Lib\Event\OnPopulateContents

Damit kann ein eigenes Element registriert werden. Siehe auch "Eigenes Element registrieren".

Shop\Configurator\Lib\Event\OnPopulateContext

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.
Beispiel: Shop\Article\lib\Struct\ContextConfiguratorArticle

Shop\Configurator\Lib\Event\OnPopulateStructure

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.

Shop\Configurator\Lib\Event\OnPopulateConfigurator

Aufbau der UI-Elemente. Standardmäßig wird hier auch OnPopulateSection im Verlauf des Events ausgeführt.

Shop\Configurator\Lib\Event\OnPopulateSection

Aufbau der UI-Elemente des einzelnen Bereichs. Standardmäßig wird hier auch OnPopulateElement im Verlauf des Events ausgeführt.

Shop\Configurator\Lib\Event\OnPopulateElement

Aufbau des spezifischen UI-Elements für den in der Struktur hinterlegten Inhalt für diesen konkreten Bereich. Siehe auch "Eigene Elemente darstellen".

Shop\Configurator\Lib\Event\OnPopulateMeta

Dient dazu, die HTML-Meta-Tags wie keywords, title, canonical link für den Kontext des Konfigurators zu definierten.

Übersicht Events Daten

Event

Beschreibung

Shop\Configurator\Lib\Event\OnPopulateInit

Wird nach dem Laden der Seite aufgerufen. Erlaubt das Ausführen von StackResponses direkt nach dem Aufrufen der Seite.
Beispiel: Anhängen des cartSessionArticleID-Urlparameter nach dem Laden und Erstellen der shopSessionArticles

Shop\Configurator\Lib\Event\OnPopulatePayload

Die Payload steht im JS zur Verfügung und wird von da requests wieder an PHP mitgeschickt.
Beispiel: cartSessionArticle

Shop\Configurator\Lib\Event\OnPopulateOptions

Die Options werden bei requests und posts vom Konfigurator mitgeschickt.
Beispiel: cartSessionArticle => 123

Shop\Configurator\Lib\Event\OnExecuteChange

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.
Beispiel:  'payload' => ['actions' =>  ['cartSessionArticleQuantityChange'], 'cartSessionArticle' => ....]