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

**URL:** <https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338>\
**Category:** Programmierung\
**Created:** [17. April 2020 um 09:45 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338 "2020-04-17T09:45:03Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![molto\_ulli](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@molto\_ulli](https://forum.shopware.com/u/molto_ulli)\
**Post date:** [17. April 2020 um 09:45 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/1 "2020-04-17T09:45:03Z")

</div>

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&nbsp;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
        }
    }
}

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![R4M](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/r4m/32/9983_2.png) [@R4M](https://forum.shopware.com/u/R4M)\
**Post date:** [17. April 2020 um 10:44 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/2 "2020-04-17T10:44:26Z")

</div>

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 …

---

<div class="post-metadata">

**Author:** ![uehler](https://avatars.discourse-cdn.com/v4/letter/u/f14d63/32.png) [@uehler](https://forum.shopware.com/u/uehler)\
**Post date:** [19. April 2020 um 16:13 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/3 "2020-04-19T16:13:28Z")

</div>

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](https://stackoverflow.com/questions/9057558/is-there-a-built-in-way-to-get-all-of-the-changed-updated-fields-in-a-doctrine-2) an die Änderungen ran.

---

<div class="post-metadata">

**Author:** ![molto\_ulli](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@molto\_ulli](https://forum.shopware.com/u/molto_ulli)\
**Post date:** [20. April 2020 um 10:47 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/4 "2020-04-20T10:47:25Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![uehler](https://avatars.discourse-cdn.com/v4/letter/u/f14d63/32.png) [@uehler](https://forum.shopware.com/u/uehler)\
**Post date:** [20. April 2020 um 11:35 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/5 "2020-04-20T11:35:30Z")

</div>

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.”&nbsp;[https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html](https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/events.html)

---

<div class="post-metadata">

**Author:** ![molto\_ulli](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@molto\_ulli](https://forum.shopware.com/u/molto_ulli)\
**Post date:** [20. April 2020 um 12:14 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/6 "2020-04-20T12:14:51Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![molto\_ulli](https://avatars.discourse-cdn.com/v4/letter/m/3d9bf3/32.png) [@molto\_ulli](https://forum.shopware.com/u/molto_ulli)\
**Post date:** [20. April 2020 um 13:00 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/7 "2020-04-20T13:00:48Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![uehler](https://avatars.discourse-cdn.com/v4/letter/u/f14d63/32.png) [@uehler](https://forum.shopware.com/u/uehler)\
**Post date:** [21. April 2020 um 16:45 UTC](https://forum.shopware.com/t/event-hook-ausfuhren-falls-versandadresse-geandert-wurde/66338/8 "2020-04-21T16:45:59Z")

</div>

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
