[GELÖST] Shopware 5.5 - executeParent()

Hallo liebe Shopware - Gemeinde,

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.

Früher (siehe Shopware Dokumentation: Understanding the Shopware hook system und beispielsweise hier https://forum.shopware.com/discussion/comment/208196/#Comment_208196 und hier shopware-5/AddressCheck.php at master · PAYONE-GmbH/shopware-5 · GitHub ):

$args->setReturn(
     $args->getSubject()->executeParent(
          $args->getMethod(),
          $args->getArgs()
     )
);

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 ""

Der bisherige Umbau auf:

$args->setReturn(
     $args->getSubject()->executeParent(
          'Methodenname',
          [
               $args->getMethod(),
               $args->getArgs()
          ]
     )
);

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.

Grüße

Sebastian

Könntest du bei dir Lokal Fix variable and method name collisions in `Enlight_Hook_HookArgs` and generated hook proxy classes by svenmuennich · Pull Request #1634 · shopware/shopware · GitHub nachpatchen und schauen ob es dann so funktioniert wie vorher?

Hallo Shyim,

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.

Grüße

Sebastian

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.

Viele Grüße

@sschreier der PR wurde nach der 5.5 RC1 gemergt

Hallo Eike,

vielen Dank für deine Antwort.

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).

Viele Grüße

Sebastian

@Shyim schrieb:

@sschreier der PR wurde nach der 5.5 RC1 gemergt

Hallo Shyim,

wie gesagt, ich habe das grad geprüft, ich habe in meinem Shopware 5.5 RC1 exakt die Änderungen auch drin, die hier aufgeführt sind: Make sure one to one entities are encoded correctly by the JsonApiEncoder · Issue #1634 · shopware/shopware · GitHub . Ich hatte mir das dort auch angesehen, deshalb hatte ich das schon vor dem Starten des Themas geprüft.

Grüße

Sebastian

Ok - dann habe ich dich nicht missverstanden.

Die Methode executeParent() ist nur für hooks und nicht für events.
Siehe Shopware events

Viele Grüße

Ich mache es genau so, und es klappt auch in der 5.5 RC1 noch, gerade gestet. 

Don’t ask me… vor allem ist es egal, was zurückgegeben wird, auch ein return “nix” bricht die Ausführung ab.

public function onAddArticle(Enlight_Event_EventArgs $arguments)
    {
        $orderNumber = $arguments->getId();
        $articleId = Shopware()->Modules()->Articles()->sGetArticleIdByOrderNumber($orderNumber);
        if($articleId != null) {
            $article = Shopware()->Modules()->Articles()->sGetArticleById($articleId);
            if ($article['netzp_announced'] == 1) {
            	return false;
            }
        }
    }

 

Hallo netzperfekt,

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)?

Grüße

Sebastian

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).

Hallo netzperfekt,

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.

Grüße

Sebastian

Siehe shopware/EventManager.php at 5.4 · shopware/shopware · GitHub

Viele Grüße