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 …
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, ...
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
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