ab Shopware 5.5 wurde ja die Funktion executeParent() umgebaut: „Changed the execution model of replace hooks to prevent multiple calls of the hooked method, if more than one replace hook on the same method exists and all of them call executeParent() once“. Leider gibt es dazu keinerlei Dokumentation, wie nun der Funktionsaufruf neu aussehen soll.
Die Umstellung erfolgte ja in der Datei „ProxyFactory“ (engine/Library/Enlight/Hook/), wo nun der hook execution context benötigt wird. Es kommt nämlich auch folgende Fehlermeldung:
Cannot execute parent without hook execution context for method ""
scheint korrekt zu sein (es kommt dann die Fehlermeldung "Cannot execute parent without hook execution context for method „Methodenname“), nur wie muss die Methode für das Event sein, damit es auch wieder funktioniert? $args->getMethod() gibt null zurück.
erst einmal vielen lieben Dank für deine Antwort, wenigstens eine. Der Pull - Request ist doch bereits im Shopware 5.5 RC 1 drin (hab ich auch grad in den Dateien geprüft) und funktioniert leider somit auch nicht.
Vielleicht verstehe ich dich falsch - aber du willst den parent aufrufen beim Shopware_Modules_Basket_AddArticle_Start notify until event?!
Oder ich verstehe deine Frage (und wo das Problem ist) nicht.
Der einzige Unterschied zu vorher besteht darin, dass die parent Methode nun nicht mehr mehrfach ausgeführt wird, sondern durch das executeParent() evtl. ein anderer hook ausgeführt wird - der dann wiederum die originale Methode aufrufen kann - je nach Reihenfolge.
Das Event beschreibt sogar Daniel im Buch auf Seite 428: “Shopware_Modules_Basket_AddArticle_Start: Artikel wird in den Warenkorb gelegt. Abbruch möglich.” und deshalb wird es auch in vielen Plugins genutzt, wenn man beispielsweise verhindern möchte, das ein spezieller Artikel in den Warenkorb gelegt werden kann (auch Shopware selbst macht das ja in seinen Plugins und nutzt es dafür, ich glaube beispielsweise in SwagLiveShopping und anderen).
Da man ja aber nicht global das Legen eines Artikels in den Warenkorb verhindern möchte, möchte man ja für die Artikel, die weiterhin in den Warenkorb gelegt werden können (die also die eigenen Bedingungen nicht erfüllen), dass die eigentliche Funktion hinter dem Event wieder ausgeführt wird -> executeParent (dazu kommt ja, da dieses Event eben auch oft für solche Zwecke verwendet wird und man durch executeParent ermöglichen würde, das Plugins untereinander durch das executeParent kompatibel sind).
Ich weiß nicht, ob es wirklich sinnvolle wäre, statt executeParent hier eher “return;” zu nutzen (weil dann würde ja das Event immer true sein und andere Plugins dann im Prinzip nicht mehr berücksichtigen). Wie gesagt bis Shopware 5.4.6 hat das auch alles so funktioniert - nur seid dieser Anpassung in Shopware Version 5.5.0 RC1 knallt es. Oder wie würde man sonst erreichen, dass das eigentliche Event ausgeführt wird (wenn die eigene Bedingung nicht erfüllt ist), außer mit executeParent (es geht ja hier allgemein darum und nicht nur um das notify-Event, man kann ja nicht immer return true; zurückgeben lassen, weil es ja nicht immer passen würde)?
Ich habe ja auch schon selbst versucht, anhand der Änderungen eine Lösung zu finden (siehe oben) - aber egal was ich probiert habe, es knallt immer wieder (siehe Fehlermeldungen oben).
danke auch für deine Antwort - berücksichtigst du gar nicht, was passiert, wenn netzp_announced nicht 1 (gesetzt) ist (das ist ja das, worum es im Prinzip ja auch geht)?
bei != 1 soll der Artikel in den WK gelegt werden - es wird also die vorige Kette der Handler aufgerufen. Der Genauigkeit halber könnte natürich ein abschließendes return; stehen (ohne! Rückgabewert).
vielen Dank für dein Feedback - klingt plausibel, ich hatte mich schon gewundert, dass das bei dir ohne return; überhaupt funktioniert konnte, weil nur der Code von dir hätte ja dazu geführt, das man gar keinen Artikel mehr in den Warenkorb legen kann.
Dann wäre also in diesem Fall return; der Weg, den man nutzen sollte. Dann hat das im Prinzip meine Frage beantwortet, ich danke für die Antworten.