Event/Hook ausführen falls Versandadresse geändert wurde

Ziel ist es eine E-Mail an eine Adresse zu senden, wenn der User seine Lieferanschrift ändert.

In meinem Plugin höre ich in Funktion getSubscribedEvents auf das Event ‘Enlight_Controller_Action_Frontend_Address_edit’.

public static function getSubscribedEvents()
{
    return [
        'Enlight_Controller_Action_Frontend_Address_edit' => 'onAddressChange',
    ];
}

 Jetzt würde ich gerne in dieser Funktion prüfen, welche Felder sich geändert haben, hat jemand eine Idee? Hier meine Lösung oder geht das schöner/besser?

public function onAddressChange(\Enlight_Event_EventArgs $event)
{
    $controller = $event->getSubject();
    $request = $controller->Request();

    if ('POST' !== $request->getMethod()) {
        return;
    } else {
        $addressRepository = $controller->get('models')->getRepository(\Shopware\Models\Customer\Address::class);
        $userId = $controller->get('session')->get('sUserId');
        $addressId = $controller->Request()->getParam('id');
        $address = $addressRepository->getOneByUser($addressId, $userId);

        $changed = false;
        if ($address->getFirstname() != $request->get('address')['firstname']) {
            $changed = true;
        }

        if ($changed) {
            // send mail
        }
    }
}

 

Ich hatte mal ein ähnliches Plugin (schon lange her) erstellt. Habe allerdings “Enlight_Controller_Action_PostDispatchSecure_Frontend_Address” benutzt und dann in der jeweiligen Funktion getActionName() abgefragt. Solange bei Action “edit” kein Parameter “address” übergeben wurde, habe ich die alten Daten in der Session zwischengespeichert.

Sobald bei Action “edit” und Parameter “address” fiel, habe ich die alten Daten und neuen Daten einer eigenen Mail-Vorlage übergeben. Diese Mail-Vorlage wurde so erstellt, dass man links die neuen Daten sieht und rechts die alten Daten. Damit hatte man also alle Daten als vergleichbare Übersicht. Vielleicht so als Idee …

Du kannst dich in das Doctrine-Event hängen, wenn die Adresse in die DB geschrieben wird. Anschließend kommst du wie hier php - Is there a built-in way to get all of the changed/updated fields in a Doctrine 2 entity - Stack Overflow an die Änderungen ran.

Habe jetzt in meinem Plugin in der service.xml einen Doctrine-Event-Subscriber angelegt, aber leider geht er nicht in die preUpdate Funktion rein. Ich erhalte eine PHP-Warning.

Fehlermeldung:

2020/04/20 10:43:00 [error] 8539#8539: *11858 FastCGI sent in stderr: "PHP message: PHP Warning: Invalid argument supplied for foreach() in /var/www/releases/2/vendor/shopware/shopware/engine/Library/Enlight/Event/EventManager.php on line 352" while reading response header from upstream, ...

Resources/service.xml

Subscriber/Address.php

getEntity();
        Shopware()->PluginLogger()->info(\Doctrine\Common\Util\Debug::dump($entity));

        return;
    }
}

Jemand eine Idee, Caches habe ich alle komplett geleert und auch das Plugin neuinstalliert.

Wir getSubscribedEvents oder der Konstruktor aufgerufen?
Und hast du was an den Daten geändert? preUpdate wird nur aufgerufen, falls sich die Daten geändert haben
“The preUpdate event occurs before the database update operations to entity data. It is not called for a DQL UPDATE statement nor when the computed changeset is empty.” https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html

Er geht nun in beide Methoden rein, lag noch am PHP-Cache, aber die PHP-Warning kommt immer noch.

Ist es möglich in der preUpate Funktion auf den aufgerufenen Controller zuzugreifen??

also du kommst jetzt an die Entity und das Changeset ran?

Auf den Controller kannst über das Event nicht zugreifen, weil das ein Doctrine Event ist und Shopware da unbekannt ist. Müsstest dir den Request im Kontruktor übergeben

1 „Gefällt mir“