Hook: Hook-Registrierung nach Abschluss Registrierung funktioniert nicht

Guten Morgen.

Ich bin relativ neu im Hook-System von Shopware und versuche gerade nach dem Speichern der Kundenregistrierung im Frontend einen Hook zu platzieren.

Der Hintergrund des Hooks soll sein, dem Nutzer je nach Länderauswahl in eine länderbezogene Kundengruppe zu schieben, z.B. „Kunden DE“, „Kunden CH“ usw.

Hier mal der Quellcode:

public function install()
    {
        $this->subscribeEvent(
            'sAdmin::sSaveRegister::after',
            'afterSaveRegisterHook'
        );

        $this->createConfig();

        return true;
    }

public function afterSaveRegisterHook(Enlight_Hook_HookArgs $args)
    {
        /** @var \sAdmin $subject */
        $subject = $args->getSubject();

        $return = $args->getReturn();

        Shopware()->Debuglogger()->info("Methode aufgerufen.");
        Shopware()->Debuglogger()->info($subject);

        $args->setReturn($return);
    }

Doch leider ist es so, dass er die Methode „afterSaveRegisterHook“ nie aufruft.

Mache ich hier irgendwo einen Fehler ? Oder funktioniert die Logging-Ausgabe dort nicht ? Die Methode „die()“ hatte auch nicht funktioniert.

Freundliche Grüße

Heiko Bihlmaier

Hi,

hast du das Plugin neu installiert (ist nach jeder Änderung an einem “subscribeEvent” nötig?) und den Cache geleert? Das sind die häufigsten beiden Probleme. Falls es da in der Methode ein gutes Event gibt (notify, filter etc), kannst du auch das probieren. 

Daniel

Hallo Daniel, 

Okay nun geht es

Wie erkenne ich nun wie ich die Variable abändernr kann also z.b. Kundengruppe? 

Gruß

Hi,

naja, vom Prinzip her kannst du beim Before-Hook die Funktions-Parameter ändern und beim After-Hook die Rückgabewerte. Bei “filter”-Events kannst du den zweiten Parameter modifizieren, bei notify / notifyUntil nur Objekte per Objektreferenz, da ist eigentlich keine Änderung vorgesehen.

Falls das nicht genügt, gibt es natürlich noch immer die Möglichkeit, die entsprechende Logik direkt in der DB vorzunehmen - also den Kunden da in die richtige Gruppe zu schieben, darauf wird es vermutlich hinaus laufen.

Daniel

Okay 

 

Und wie überschreibe ich z.b die Kundengruppe im Rückgabewert? 

Ich habe dort ja keine Variablen. 

Moin,

wenn ich alles richtig verstanden habe, brauchst du da kein Hook. Du kannst alles mit dem „Shopware_Models_Admin_SaveRegisterMainData_FilterSql“ Filter Event lösen:

$this->subscribeEvent(
    'Shopware_Models_Admin_SaveRegisterMainData_FilterSql', 
    'onSaveRegisterMainData'
);


/**
 * Filter event on save register main data
 *
 * @param \Enlight_Event_EventArgs $arguments
 * @return mixed
 */
public function onSaveRegisterMainData(\Enlight_Event_EventArgs $arguments)
{
    $sessionRegisterData = Shopware()->Session()->offsetGet('sRegister');
    $returnData = $arguments->getReturn();

    // If country is germany switch the customer group
    if($sessionRegisterData['billing']['country'] = 2){
        $returnData[1][7] = 'Kunde DE';
    }

    return $returnData;
}

Unter „$sessionRegisterData“ findest du alle Daten die der Kunde eingegeben hat.

Unter „$returnData“ findest du die Daten die in der Datenbank geschrieben werden. Diese kannst du jetzt modifizieren.
 

In dem Beispiel ersetze ich einfach die Kundengruppe auf „Kunde DE“ wenn der Kunden „Deutschland“ ausgewählt hat. Da wirst du noch eine DB Abfrage machen müssen für eine vernünftige Zuordnung zwischen Land und Kundengruppe.
 

Besten Gruß,

Nikita

Hallo Nikita,

ich habe das so angelegt, doch er ruft bei meinem Plugin nicht den Event auf, d.h. es gibt keinerlei Änderung.

Auch wenn ich einen die() hinzufüge, passiert nichts.

So sieht mein Plugin aus:

public function install()
    {
        $this->subscribeEvent(
            'Shopware_Models_Admin_SaveRegisterMainData_FilterSql',
            'onSaveRegisterMainData'
        );

        return true;
    }


public function onSaveRegisterMainData(Enlight_Event_EventArgs $args)
    {
        $sessionRegisterData = Shopware()->Session()->offsetGet('sRegister');
        $returnData = $args->getReturn();

        if ($sessionRegisterData['billing']['country'] = 2) {
            $returnData[1][7] = 'B2C_D';
        } else {
            if ($sessionRegisterData['billing']['country'] = 26) {
                $returnData[1][7] = 'B2C_S';
            }
        }

        return $returnData;
    }

Neuinstalliert mit Cache habe ich erledigt.

Hast du noch eine Idee ?

Shopware_Models_Admin_SaveRegisterMainData_FilterSql

Der Name des events ist falsch.

Viele Grüße

1 Like

Super!

Klappt. Danke.

Hi,

lasst Ihr euch die Werte mit dem Logger ausgeben?:

Wie seht Ihr euch die Werte aus dem Formular an, da ja nach der Registrierung sofort weitergeleitet wird? In der Console sehe ich nämlich nix.

Danke -Flo