Replace-Hook funktioniert nicht

Hallo,

ich möchte die Methode Checkout.finishAction() mit meiner eigenen erstzen, dafür habe ich in meinem Plugin:

 

public static function getSubscribedEvents()
    {
        return [
              'Shopware_Controllers_Frontend_Checkout::finishAction::replace' => 'insteadFinishAction'
        ];
}

Laut 5.2.3 des Shopware-Buches „Diese Events [Hooks] stehen in Shopware nur für bestimmte Klassen zur Verfügung, insbesondere für die Core-Klassen, Doctrine-Repositorys und Controller.“. Soweit ich verstehe, geht es hier um eine Controller-Klasse.

Trotzdem funktioniert das nicht. Ich weiß das, weil ich mit xdebugger debugge und anstatt meiner Methode zu Chckout.finishAction() komme.

Verstehe ich etwas falsch?

  

 

Ich muss auch sagen, dass ich zunächste ::before-Hook probiert habe und dieses Versuch hat auch gescheitert.

Hallo @rreimche‍

was genau möchtest du denn erreichen? Ein Replace-Hook sollte immer das allerletze Mittel sein, wenn es wirklich gar nicht anders geht. Ich behaupte, dass man in 95% der Fälle keinen Replace-Hook braucht  Wink Man muss sich klar machen, dass man die komplette Shopware Logik dadurch aushebelt, man muss sicherstellen, dass man exakt die gleichen Template Variablen übergibt, die gleiche Logik ausführt etc pp. 

Grundsätzlich sollten Controller mit PostDispatch oder PreDispatch Events erweitert werden. Siehe auch Shopware events

Viele Grüße aus Schöppingen

cool Michael Telgmann

Naja, wenn die Core-Klassen aber hardcoded minimalistisch sind - bleibt einen ja nichts Anderes übrig, als ganze Funktionen zu überschreiben.
Stehe nämlich auch grad vor dem Problem, eine "fest-codierte-Unzulänglichkeit" zu ersetzen:
shopware/sBasket.php at 5.3 · shopware/shopware · GitHub
In der Funktion kann man sich ja nicht einmal irgendwo „rein-Hooken“.
Da hilft mir kein dispatchen der Welt mehr weiter  Wearing-Sunglasses

@Michael Telgmann, genauer ist meine Aufgabe hier beschrieben: https://forum.shopware.com/discussion/48717/bearbeitung-der-bestellung-gerade-nach-dem-drucken-von-jetzt-kaufen#latest

Es geht darum, das Verhalten von Checkout.finishAction() zu ändern sowie Checkout/finish.tpl. In finishAction() habe ich keine Ereignisse gefunden, deshalbe wollte ich Hooks verwenden. Von der Nachteilen der replace-Hooks habe ich in Shopware-Buch gelesen, aber ich sehe hier keinen anderen Weg.

Danke dir für den Hint, dass „Grundsätzlich sollten Controller mit PostDispatch oder PreDispatch Events erweitert werden“. Ich lese jetzt den Artikel und dann vllt. sehe ich die Lösung. Oder nicht :slight_smile:

Hi,

@sonic‍ ich sagte ja auch in den allermeisten Fällen  Wink und unsere allseits geliebten Core-Klassen sind ja noch mal was anderes…

@rreimche‍ ich werde dir im anderen Thread antworten.

Viele Grüße aus Schöppingen

cool Michael Telgmann

@Michael_Telgmann, danke dir sehr, aber könntest du auch hier antworten, wenn du die Antwort weiß, warum bei mir Hooking dieser Methode nicht funktionieren?

Hi, 

für die Hooks werden Proxy Klassen benutzt, die einmal initial aufgebaut werden und dann sozusagen im Cache liegen. Evtl musst du hier einmal den kompletten Shopware Cache löschen oder von Hand den “production_123456789” Order unter var/cache löschen. Danach noch mal probieren.

Viele Grüße aus Schöppingen

cool Michael Telgmann

1 „Gefällt mir“

Hi @michael 

I know hook is the last resort and the same funcation can not be hooked more than two times. However, I am still not successful to write a hook and test the same. So, I want to know a working example of Hook which i can test. Can you please help me.

Thanks in advance!

Hi chaul,

please have a look at our dev docs: Shopware events
btw a method can of course be hooked multiple times  Wink

Best regards from Schöppingen

cool Michael Telgmann