Kundenattribute speichern aus Session

Hallo Shopware Community!

Ich würde gerne meine Kundendaten (Attribute/Customer) aktualisieren sobald ein neuer Datensatz angelegt wird.

Also habe ich mir gedacht dass sollte kein Problem darstellen und warte auf den folgenden event:

    public static function getSubscribedEvents()
    {
        return [
            'Shopware\Models\Customer\Customer::postPersist' => 'afterPersist'
        ];

    }

Nun habe ich jedoch das Problem das der Datensatz noch gar nicht gespeichert wurde. Deshalb kann ich auch noch nicht auf die Attribute zugreifen. Eigentlich müsste der Post Event doch genau dafür zuständig sein? Weiss jemand eventuell wie ich die Kunden Attribute aktualisieren kann sobald ein neuer Kunde angelegt wird?

Ich habe einmal folgendes versucht:

    public function afterPersist(\Enlight_Event_EventArgs $args)
    {
        $model = $args->getEntity();

        $this->modelManager->persist($model);
        $this->modelManager->flush($model);
...

Das model ist existent habe is mithilfe von die und vardump ausgegeben. Den ModelManager lade ich im Konstruktor:

    protected $modelManager;

    protected $sessionManager;

    public function __construct()
    {
        $this->sessionManager = Shopware()->Session();
        $this->modelManager = Shopware()->Container()->get('models');
    }

Aber egal was ich versuche zu diesem Zeitpunkt habe ich noch kein persistent Model weiss jemand wieso? Ich kann es noch nicht einmal speichern?

Hoffe Ihr erkennt mein Problem und könnt mir helfen!

Vielen Dank im voraus und mit freundlichem Gruss

Alexander

Hallo Alexander,

habe es gerade mal so getestet auf diese Art und Weise brauchst du nicht mit dem Modelmanager rumschlagen sondern nur das Objekt verändern und später flusht das System deine Änderungen automatisch mit ein.

    public static function getSubscribedEvents()
    {
        return array(
            'Shopware\Models\Customer\Customer::prePersist' => 'onPrePersist'
        );
    }

    public function onPrePersist(\Enlight_Event_EventArgs $args)
    {
        /** @var Customer $customer */
        $customer = $args->getEntity();
        $customer->setFirstname("Testemich");
        $customer->getAttribute()->setTest('testemich123');
    }

Ich habe dem Customer auch mal ein Attribut „Test“ gegeben was das System auch so schreibt.

Grüße Lukaschel

1 „Gefällt mir“

Hallo Lukaschel!

Super vielen Dank für den funktionierenden Code. Ich hatte wohl zwei Probleme (eins davon verstehe ich jedoch nicht).

  1. Der Event soll prePersist sein? Eigentlich war mein gedanke das der postPersist nach dem Speichern ausgeführt wird. Und während ich das hier schreibe macht es doch wieder Sinn? Vor dem Speichern (prepersist) wird nacher gespeichert (postPersist) wird nicht gespeichert - stimmt das so?

  2. Achso setzt man ein Attribute richtig ich habe die Ganze Zeit folgendes versucht $customer->setAttribute()->setTest(‚testemich123‘);

Gruss

Alexander

Hallo Alexander,

  1. PostPersit feuert normalerweise nach dem Speichern, hast du mal probiert ob das Event überhaupt ausgeführt wird nach einem Customer persist? (Code mal danach mit einem die() angehalten?)

  2. Du musst dir mit getAttribute erst das Attributmodel holen und das kannst du dann beschreiben.

Grüße Lukaschel

1 „Gefällt mir“

Und hier noch ein kleiner Nachtrag:

Der Konstruktor funktioniert so nicht. Wenn nun ein Kundenkonto via Backend erstellt werden haben wir das Problem dass kein Shopware() service zur Verfügung steht. Da ich jedoch einen Wert aus der Session des Benuzters speichern möchte musste ich das Ganze in ein TryCatch auslagern unten findet Ihr den finalen Subscriber:

 'beforeStorage'
        ];
    }

    public function beforeStorage(EventArguments $args)
    {
        $model = $args->getEntity();

        try {
            if ($sessionManager = Shopware()->Session()) {

                $editorUser = $sessionManager->get('ccw2pUserId');
                $hasUserIdAttribute = $model->getAttribute()->getCcw2pUserId();

                if (null === $hasUserIdAttribute) {
                    $model->getAttribute()->setCcw2pUserId($editorUser);
                }
            }
        } catch (\Exception $e) {
            // Usually the backend throws this error
            // just ignore that - cheerio!
        }

    }

}

 

@Lukaschel schrieb:

Hallo Alexander,

  1. PostPersit feuert normalerweise nach dem Speichern, hast du mal probiert ob das Event überhaupt ausgeführt wird nach einem Customer persist? (Code mal danach mit einem die() angehalten?)

  2. Du musst dir mit getAttribute erst das Attributmodel holen und das kannst du dann beschreiben.

Grüße Lukaschel

Danke für den Nachtrag.

Ja ich habe das Model ausgegeben (beim PostPerist). Dabei habe ich ein vardump ausgegeben und hatte das Model. Ein Blick in die Datenbank zeigte mir aber dass das Model noch nicht abgespeichert wurde - deshalb meine Verwirrung. Die Datenbank hatte den Eintrag erst angelegt als das Ganze durchgelaufen ist - deshalb erkenne ich auch bisher noch keinen Unterschied zwischen diesen Events. Getestet hatte ich es durch den Checkout (Confirm) Prozess - das Model wurde erst gespeicher als ich zur checkout/shippingPayment weitergeleitet wurde.

Gruss

Alexander