Call to a member function getId() im Backend

Hallo,

ich hoffe, dass hier im Entwicklerforum Hilfe bekommen kann. Es geht um ein eigenes Plugin, welches anhand der Emailadresse, die der Kunde als Gast oder mit Konto angibt, eine Datenbankabfrage gestartet und ein Wert zurückgegeben wird, wenn die Emailadresse in der Tabelle gefunden wurde. Ist ein Wert vorhanden, wird dieser in das erste Freitextfeld der Bestellung gespeichert.

Das Ganze funktioniert auch wunderbar unter SW 5.1.x. Nun habe ich testweise auf SW 5.2.24 geupdateted, hier funktioniert nun das Backend nicht mehr. Unter SW 5.2.x ältere Versionen lief es noch.

Es wird im Logfile des Servers folgender Fehler ausgegeben: Call to a member function getId()

Ich konnte im Plugin due fehlerhafte Zeile finden:

$userData = Shopware()->Modules()->Admin()->sGetUserData();

Hiermit greife ich auf die Kundendaten im Bestellprozess zu, also auf die eingegebene Emailadresse ($UserMail = $userData[‚additional‘][‚user‘][‚email‘];).

Das Backend lässt sich nicht mehr aufrufen, es sei denn ich kommentiere die Zeile aus. Das Frontend ist funktioniert fehlerfrei. Auch das Plugin arbeitet fehlerfrei, der Wert wird korrekt in das Freitextfeld der Bestellung eingetragen.

Ich komme hier leider überhaupt nicht voran, ich finde nichts zu dem Fehler und auch nicht, wie man anders auf die Emailadresse des Kunden zugreifen kann, geschweige denn, dass die Codezeile nicht mehr funktioniert, ist sie doch eine Standardanweisung in Shopware.

Ich wäre euch für jeden Tipp oder Hilfe echt dankbar!

Viele Grüße

 

 

Hallo,

reicht 1 Thread zu dem Thema nicht aus: https://forum.shopware.com/discussion/comment/197560/#Comment_197560 ?

Zum Thema selbst: hast du einmal folgenden Code vor die Zeile gesetzt und dann geprüft, ob sich das Backend auch aufrufen lässt? Der Fehler wird daran liegen, das im Backend ja gar kein aktiver Shop da ist, wo Sessiondaten ausgelesen werden können, deshalb funktioniert es dann auch nur im Frontend und nicht im Backend.

if(!$request->isDispatched() || $response->isException() || ($request->getModuleName()!='frontend' && $request->getModuleName()!="widgets")) {
     return;
}

Beste Grüße

Sebastian

2 „Gefällt mir“

Moin @eierund‍ !

Der Vorschlag von @sschreier‍ ist schon richtig.
Kurz zur Erklärung:

Die Methode  sGetUserData  benötigt zum Auslesen der Benutzer-Daten eine Session.
Eine Session wiederum benötigt einen derzeit aktiven Shop. Dies ist im Backend nicht der Fall, dort gibt es keinen aktiven Shop.
Entsprechend bekommst du im Backend einen solchen Fehler angezeigt.

Die entsprechende Codestelle findest du bei der Erstellung der Session.

Die Lösung ist also: Deinen Code auf das Frontend beschränken bzw. das Backend ausschließen.
Ergo: $request->getModuleName() !== ‚frontend‘ oder $request->getModuleName() === ‚backend‘

Hilft dir das etwas weiter?

Gruß,
Patrick  Shopware

1 „Gefällt mir“

Hallo!

Vielen Dank, das hat mich schon sehr weitergebracht, obwohl ich den Einsatz des Codes noch nicht so ganz verstehe.

Nun bekomme ich zB den Fehler:

 PHP Fatal error: Call to a member function isDispatched() 

Foot-in-Mouth

Hallo,

dann nimm nur die “Light-Version” meines Befehls, also:

if($request->getModuleName()!='frontend') {
     return;
}

Da schließt du aus, das der Code danach im Backend ausgeführt wird.

Beste Grüße

Sebastian

1 „Gefällt mir“

Dann kommt:

 Call to a member function getModuleName()

Kann ich mit einer eigenen Klasse nicht auf die Controller zugreifen?

Hier mal der Code:

public function getWhiteList()
	{
	if($request->getModuleName()!='frontend') {
      return; }		
	$userData = Shopware()->Modules()->Admin()->sGetUserData();
	$UserMail = $userData['additional']['user']['email'];


   .....

 

Hallo,

ich bin natürlich auch davon ausgegangen, dass du dich damit beschäftigst und es nicht einfach nur kopierst. Natürlich muss auch vorher bei der Funktion die arguments mit übergeben, sodass anhand dessen überhaupt die request-Variable ermittelt werden kann, beispielsweise:

$controller = $arguments->getSubject();

$request = $controller->Request();

Die Request - Variable ist ja keine globale Variable. Logischerweise kommt bei dir ein Fehler, wenn du eine Variable nutzt, die du gar nicht vorher definiert hast.

Beste Grüße

Sebastian

1 „Gefällt mir“

Hey, etwas weiter war ich schon, sorry, da hab´ich zuviel entfernt. Ich komme aber mit der Regsitrierung noch gar nicht klar bei einer eigenen Klasse, dazu finde ich auch nichts passendes im Forum :frowning:

  $this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatch_Frontend_Checkout',
            'getWhiteList'
        );



public function getWhiteList(Enlight_Event_EventArgs $arguments)
	{
	
	$controller = $arguments->getSubject();
	$request = $controller->Request();

Mir fehlt es an Wissen um

‘Enlight_Controller_Action_PostDispatch_Frontend_Checkout’,
‘getWhiteList’

zu schreiben, denn das ist irgendwie falsch. Undecided

Ok ich habe es jetzt anders gelöst und meine getWhiteLit Funktion in die public function onPostDispatchCheckout(Enlight_Event_EventArgs $arguments) mit untergebracht, so dass ich meine Funktion komplett löschen konnte.

So funktioniert das Ganze wieder.

 

Hallo,

 

vielleicht kann uns doch noch mal wer helfen. Wir durforsten jetzt seit drei Tagen alle Dokus und Google, finden nichts dazu wie man mittels eigener Funktion auf die Shopware Daten zugreifen kann:

  $this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatch_Frontend_Checkout',
            'getWhiteList'
        );



public function getWhiteList(Enlight_Event_EventArgs $arguments)
	{
	
	$controller = $arguments->getSubject();
	$request = $controller->Request();

        $userData = Shopware()->Modules()->Admin()->sGetUserData();

...mach was....

Oder vielleicht kennt ihr eine Quelle, wo das dokumentiert ist, wie gesgat, wir finden rein gar nichts zu dem Thema.