# finishAction() übersichtlich erweitern

**URL:** <https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406>\
**Category:** Programmierung\
**Created:** [8. August 2017 um 15:13 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406 "2017-08-08T15:13:05Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [8. August 2017 um 15:13 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/1 "2017-08-08T15:13:05Z")

</div>

Hallo,

Ich bin auf der Suche, wie man eine bereits existierende action (genauer gesagt die finishAction im Checkout Controller) erweiter kann, ohne dabei die komplette Checkout.php aus dem Controllers/Frontend Ordner in das eigene Plug-In kopieren zu müssen, da das ja nicht wirklich updatefreundlich ist, schätz ich mal.

Ich habe auf der Suche dann diesen Foreneintrag gefunden: [https://forum.shopware.com/discussion/34252/controller-action-ueberschreiben-erweitern](https://forum.shopware.com/discussion/34252/controller-action-ueberschreiben-erweitern)

Allerdings ist hier die Rede von Hooks und bisher habe ich zum Thema Hooks nur gelesen, dass man die Finger davon lassen soll, weil bad practice. Ich schätze also mal, dass es hier eine schönere Lösung gibt.

&nbsp;

Um das ganze ein weniger konkret zu machen hier ein paar genauere Infos:

In meiner Bootstrap.php gibt es eine Funktion die generateCode heißt. Diese erstellt eine Zeichenfolge folgendermaßen:

```
    public function generateCode()
    {
      //Creates 16 times a number and add it to the var
        $rand = 0;
        for ($i = 0; $i<15; $i++)
            {
                $rand .= mt_rand(0,9);
            }
            //On Checkoutcomplete add that random number to database table
        $addInt = "INSERT INTO `s_plugin_tnev` (`vouchercode`) VALUES ($rand);";
        $connect = Shopware()->Db()->query($addInt);
    }

```

Diese Funktion soll nun ausgelöst werden, wenn der Kunde eine Bestellung erfolgreich abgeschlossen hat. Das würde ja heißen, wenn der Kunde die URL: [webauftritt.de/frontend/checkout/finish](http://webauftritt.de/frontend/checkout/finish) erreicht hat wird diese Funktion ausgelöst.

Wenn ich nun diesen Code genau so in die Checkout.php reinkopier, funktioniert das auch einwandfrei. Nur möchte ich das etwas übersichtlicher.

Die finishAction()-Funktion ist in der Checkout.php sehr sehr lang. Ich suche also nach so etwas ungefähr:

```
class Shopware_Controllers_Frontend_CheckoutGenerate extends Shopware_Controllers_Frontend_Checkout
{
     function finishAction()
      {
          generateCode();
          parent::finishAction();
      };
};

```

Nur leider funktioniert das nicht.

Gibt es hierfür irgendeine schöne Lösung die mit Shopware kompatibel ist? 🙂

Mein Plugin-Verzeichnis teilt sich folgendermaßen auf:

- Frontend
  - meinPlugin
    - Bootstrap.php
    - Controllers
      - Frontend
        - Checkout.php

Beste Grüße,

Max Konrad

---

<div class="post-metadata">

**Author:** ![IFF](https://avatars.discourse-cdn.com/v4/letter/i/c37758/32.png) [@IFF](https://forum.shopware.com/u/IFF)\
**Post date:** [9. August 2017 um 06:41 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/2 "2017-08-09T06:41:31Z")

</div>

Hier im Forum fand ich die Methode:

```
 Shopware\_Controllers\_Frontend\_Checkout::finishAction::before

```

In meine Falle machte sie genau das was ich wollte.

---

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [9. August 2017 um 07:00 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/3 "2017-08-09T07:00:46Z")

</div>

> [@IFF schrieb:](https://forum.shopware.com/profile/26530/IFF "IFF")
> 
> Hier im Forum fand ich die Methode:
> 
> Shopware\_Controllers\_Frontend\_Checkout::finishAction::before

Hmm schade. Das wäre ja dann der in der documentation beschriebene Hook von dem fast immer abgeraten wird.

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [9. August 2017 um 07:03 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/4 "2017-08-09T07:03:44Z")

</div>

Hallo Max,

zur Erweiterung von Shopware solltest du immer Events benutzen. Hooks sind, wie du schon richtigerweise herausgefunden hast, eher nicht die richtige Wahl.  
Um nun etwas nach/während&nbsp;der finishAction auszuführen hast du mehrere Möglichkeiten:

Auf das Event ‘Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend\_Checkout’ subscriben. Damit dein Code auch wirklich nur auf der finishAction ausgeführt wird, musst du allerdings auf den action-Namen in der Callback Methode prüfen.

```
public function onPostDispatchCheckout(\Enlight_Controller_ActionEventArgs $args)
{
    /** @var \Enlight_Controller_Action $controller */
    $controller = $args->getSubject();

    /** @var \Enlight_Controller_Request_Request $request */
    $request = $controller->Request();

    if ($request->getActionName() !== 'finish') {
        return;
    }

    // do your stuff here
}

```

Alternativ nutzt du ein Event, dass während des Speicherns der Bestellung geworfen wird. Hier findest du in der&nbsp;\sOrder::sSaveOrder() Methode einige Stellen.&nbsp;

Viele Grüße aus Schöppingen

![cool](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![IFF](https://avatars.discourse-cdn.com/v4/letter/i/c37758/32.png) [@IFF](https://forum.shopware.com/u/IFF)\
**Post date:** [9. August 2017 um 07:04 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/5 "2017-08-09T07:04:55Z")

</div>

Hier irgendwo im Forum wurde er von Shopware empfohlen.

---

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [9. August 2017 um 07:13 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/6 "2017-08-09T07:13:52Z")

</div>

> [@Michael Telgmann schrieb:](https://forum.shopware.com/profile/17553/Michael%20Telgmann "Michael%20Telgmann")
> 
> Hallo Max,
> 
> zur Erweiterung von Shopware solltest du immer Events benutzen. Hooks sind, wie du schon richtigerweise herausgefunden hast, eher nicht die richtige Wahl.  
> Um nun etwas nach/während&nbsp;der finishAction auszuführen hast du mehrere Möglichkeiten:
> 
> Auf das Event ‚Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend\_Checkout‘ subscriben. Damit dein Code auch wirklich nur auf der finishAction ausgeführt wird, musst du allerdings auf den action-Namen in der Callback Methode prüfen.
> 
> public function onPostDispatchCheckout(\Enlight\_Controller\_ActionEventArgs $args)  
> {  
> /\*\* @var \Enlight\_Controller\_Action $controller \*/  
> $controller = $args-\>getSubject();
> 
> /\*\* @var \Enlight\_Controller\_Request\_Request $request \*/  
> $request = $controller-\>Request();
> 
> if ($request-\>getActionName() !== ‚finish‘) {  
> return;  
> }
> 
> // do your stuff here  
> }
> 
> Alternativ nutzt du ein Event, dass während des Speicherns der Bestellung geworfen wird. Hier findest du in der&nbsp;\sOrder::sSaveOrder() Methode einige Stellen.&nbsp;
> 
> Viele Grüße aus Schöppingen
> 
> ![cool](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/86c57fbace799dd4eb1f1b8a2d3bdc1733f0aea1.png "cool")&nbsp;Michael Telgmann

Super. Vielen Dank für die übersichtliche Antwort. Würde das dann alles in meine Bootstrap.php Datei kommen oder sollte das ausgelagert werde?

---

<div class="post-metadata">

**Author:** ![Michael\_Telgmann](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/michael_telgmann/32/20289_2.png) [@Michael\_Telgmann](https://forum.shopware.com/u/Michael_Telgmann)\
**Post date:** [9. August 2017 um 07:16 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/7 "2017-08-09T07:16:46Z")

</div>

Nutzt du das alte oder das neue Plugin-System?&nbsp;  
Grundsätzlich sollte die Basisklasse deines Plugins nicht zu voll werden. Einfach der Übersichtlichkeit wegen. Wenn das Plugin aber nur das machen soll, was du oben beschrieben hast, dann ist es völlig i.O. alles in der Basisklasse zu bauen.

Viele Grüße aus Schöppingen

![cool](http://forum.shopware.com/plugins/CKEditor/plugins/smiley/images/shopware.png "cool")&nbsp;Michael Telgmann

---

<div class="post-metadata">

**Author:** ![maxkon](https://avatars.discourse-cdn.com/v4/letter/m/97f17d/32.png) [@maxkon](https://forum.shopware.com/u/maxkon)\
**Post date:** [9. August 2017 um 07:21 UTC](https://forum.shopware.com/t/finishaction-ubersichtlich-erweitern/47406/8 "2017-08-09T07:21:48Z")

</div>

Momentan benutze ich noch das alte Shopware Plugin System. Es kommt schon noch ein bisschen was dazu, aber mir ging es viel mehr darum, ob Shopware diese Methode in einem bestimmten Ordner oder so sucht und braucht. Aber aus der Antwort schließe ich mal, dass die Methode einfach im Main Directory sein kann.
