Neu Dispatcher (Hook) innerhalb Dispatcher

ematjar

Mitglied
31. Oktober 2021
8
1
Hi,

ich möchte für meinen Plugin den HOOK_TOOLSGLOBAL_INC_BERECHNEVERSANDPREIS benutzen. Allerdings wird es überall auf jeder Seiten-Typ aufgerufen. Es sollte nur auf der Bestellvorgangsseite aufgerufen werden.

Kann ich also einen Hook von einen anderen abhängig machen?

Code Beispiel:

PHP:
$dispatcher->listen('shop.hook.' . \HOOK_LETZTERINCLUDE_INC, function () use ($plugin) {
    if (Shop::getPageType() === \PAGE_BESTELLVORGANG) {
        var_dump(1);
        $this->foobar = true;
    }
}, 10);

if ($this->foobar) {
    $dispatcher->listen('shop.hook.' . \HOOK_TOOLSGLOBAL_INC_BERECHNEVERSANDPREIS, function (array &$args) {
        var_dump(2);
    },10);
}

In der Bestellvorgangsseite erhalte ich als Ausgabe ich nur den ersten "var_dump".
 

ematjar

Mitglied
31. Oktober 2021
8
1
Prüfe doch auf den Seitentyp und führe in Abhängigkeit davon deine Funktionen aus…
Die Funktion ist das manipulieren des Versandpreises. Um den Versandpreis zu ändern, benötige ich ja den HOOK_TOOLSGLOBAL_INC_BERECHNEVERSANDPREIS.
Wenn ich das innerhalb vom ersten Dispatcher packe, dann bekomme ich die Fehlermeldung "Call to a member function listen() on null" weil der innere disaptcher 'undefined' ist.
Wenn ich den Dispatcher in der ersten Funktion übergebe, bekomme ich zwar keinen Fehler, aber der 'var_dump' wird nicht ausgeführt, weil der HOOK nicht ausgeführt wird.

Variante 1:
PHP:
$dispatcher->listen('shop.hook.' . \HOOK_LETZTERINCLUDE_INC, function () use ($plugin) {
    if (Shop::getPageType() === \PAGE_BESTELLVORGANG) {
        //$dispatcher undefined
        $dispatcher->listen('shop.hook.' . \HOOK_TOOLSGLOBAL_INC_BERECHNEVERSANDPREIS, function (array &$args) {
            var_dump(2);
        },10);
    }
}, 10);

Variante2
PHP:
$dispatcher->listen('shop.hook.' . \HOOK_LETZTERINCLUDE_INC, function () use ($dispatcher) {
    if (Shop::getPageType() === \PAGE_BESTELLVORGANG) {
        $dispatcher->listen('shop.hook.' . \HOOK_TOOLSGLOBAL_INC_BERECHNEVERSANDPREIS, function (array &$args) {
            //wird nicht ausgeführt
            var_dump(2);
        },10);
    }
}, 10);

Bzw. wie würdest du das machen? Kannst du mir ein Beispiel geben? Danke
 

NETZdinge.de

Sehr aktives Mitglied
7. April 2010
2.285
339
Ja wie gesagt… Das mit der Verschachtelung wird nicht gehen… Ich würde das in dem einen hook machen und innerhalb dessen auf den Seitentyp prüfen… Und nur wenn der Seitentyp korrekt ist, wird deine Funktion ausgeführt, sonst läuft das einfach leer durch…
 
  • Gefällt mir
Reaktionen: ematjar

ematjar

Mitglied
31. Oktober 2021
8
1
Ja wie gesagt… Das mit der Verschachtelung wird nicht gehen… Ich würde das in dem einen hook machen und innerhalb dessen auf den Seitentyp prüfen… Und nur wenn der Seitentyp korrekt ist, wird deine Funktion ausgeführt, sonst läuft das einfach leer durch…
Ja, es wird nur mehrmals aufgerufen und ich dachte das würde die Performance benachteiligen, aber ok. Danke

PHP:
$dispatcher->listen('shop.hook.' . \HOOK_TOOLSGLOBAL_INC_BERECHNEVERSANDPREIS, function (array &$args) {
    if (Shop::$pageType === 11) {
        var_dump('Bestellvorgang');
    }
},10);

1638019437381.png
 

NETZdinge.de

Sehr aktives Mitglied
7. April 2010
2.285
339
Dein Beispiel ist aber Quatsch… Du gibst dir nicht den Inhalt der variable „Bestellvorgang“ aus, sondern nur den String selbst…
 

ematjar

Mitglied
31. Oktober 2021
8
1
Dein Beispiel ist aber Quatsch… Du gibst dir nicht den Inhalt der variable „Bestellvorgang“ aus, sondern nur den String selbst…
Das mit dem "Bestellvorgang" ist nur für das Beispiel gedacht, (sowas wie: //code goes here) nach der pageType Abfrage kommen natürlich noch sehr viele und komplexe Code Zeilen sowie Business Logik, die ich aber für den Zweck meiner Frage hier nicht geschrieben habe. Deshalb wegen Performance gefragt.
Jedenfalls mache ich nun von der Abfrage gebrauch. Danke