Ich bin auf der Suche nach einem Event oder Hook der mir sagt, dass ein User upgedatet wurde.
Hintergrund: Shopware ist im konkreten Fall mehr so etwas wie ein “Frontend” für die Warenwirtschaft. Die Kunden müssen also auf dem neuesten Stand gehalten werden, damit Versand und Buchungen über das andere System abgewickelt werden kann.
Im Moment nutze ich das Event “Shopware_Modules_Admin_GetUserData_FilterResult”. Es funktioniert soweit alles. Nur leider wird jedesmal, wenn Userdaten zur Anzeige in Shopware aus der DB geladen werden, das Event emittet und löst damit ein Update aus, obwohl sich nichts verändert hat.
Ich sitze momentan an einem ähnlichen problem, nur dass es bei mir um Produktpreise geht, es hat auch bisher nach Wochen keiner eine Antwort auf meine Frage hinterlassen.
Soweit ich jetzt herausgefunden habe braucht man folgenden hook und daraus müsstest du dir dann eine Update-Info oder was du brauchst aus der Methode senden.
Beachte, dass wenn du mit PHPStorm arbeitest und dir die function automatisch generieren lässt, wird die function mit dem Parameter
Enlight\_Hook\_HookArgs angelegt, und schmeißt fehlermeldungen, benötigt wird aber
Enlight\_Event\_EventArgs wie unten angegeben.
public static function getSubscribedEvents()
{
return array(
'Shopware\Models\Customer\Customer::postUpdate' =>'afterUserUpdate'
);
}
public function afterUserUpdate(\Enlight_Event_EventArgs $args)
{
/** @var \Shopware\Models\Customer\Customer $subject */
$subject = $args->getSubject();
$return = $args->getReturn();
$args->setReturn($return);
}
Absolut, völlig richtig! Ich wollte nur einen Fingerzeig geben was es da sonst noch in dem Zusammenhang gibt. Diese Events sind ja weder auf den Customer noch auf das postUpdate beschränkt. Nur wenn man nicht weiss wonach man suchen soll ist es schwer die nötigen Infos zu finden.
Okay, also das ist ja jetzt schonmal ziemlich spitze, danke euch
Leider krieg ich aus den $args gar nichts raus. Genauer gesagt ist bisher alles null bis auf $args->getEntity(), da bekomm ich immerhin ein leeres Array zurück.
Okay, also das ist ja jetzt schonmal ziemlich spitze, danke euch
Leider krieg ich aus den $args gar nichts raus. Genauer gesagt ist bisher alles null bis auf $args->getEntity(), da bekomm ich immerhin ein leeres Array zurück.
Greift der hook bei dr denn überhaupt? Also hast du versucht zu prüfen ob das das richtige Event ist? Vielleicht da ein Breakpoint setzen und mit aktivierten debugger kunden aktualisieren bzw. irgendeine Ausgabe produzieren um zu schauen ob das das richtige ist. Wenn du einen neuen Kunden anlegst brauchst du „postPersist“ nicht „postUpdate“.
oder schreib irgendwas in ne Datei mit file_put_contents (die args musst du mit serialize(args) umschließen um ne ausgabe zu bekommen).
Achso ja stimmt den hab ich auch, nur wenn ich bei mir in der Zeile mit $subject = $args->getSubject(); ein Breakpoint setze und einen kunden anpasse habe ich in den args alle kundendaten stehen.
Das Doctrine-Model ist ja offenbar vorhanden, ansonsten könnte der Serializer nicht meckern dass er keine Entities serialisieren kann.
Um ein Entity dennoch serialisieren zu können gibt es die Helfer-Methode Doctrine\Common\Util\Debug::dump() mit verschiedenen Parametern bzgl. auszugebender Verschachtelungstiefe und ob der Dump auch direkt angezeigt werden soll. Vielleicht kannst Du damit Dein Entity in eine Datei ausgeben.
ich habe wie vorher shcon gepostet nur folgendes in meinem testplugin stehen:
public static function getSubscribedEvents()
{
return array(
'Shopware\Models\Customer\Customer::postUpdate' => 'afterUserUpdate'
);
}
public function afterUserUpdate(\Enlight_Event_EventArgs $args)
{
/** @var \Shopware\Models\Customer\Customer $subject */
$subject = $args->getSubject();
file_put_contents('/var/www/html/shopware-vagrant/customerUpdate.txt', serialize($args->getEntity()));
$return = $args->getReturn();
$args->setReturn($return);
}
Und ich krieg einen output der Kundendaten in der .txt sowie beim debugger alle daten angezeigt werden.
Nutzt du PHPStorm (+ SymfonyPlugin & Shopware Plugin) ? Lass dir mal deine “onCustomerUpdate” automatisch generieren oder kopier die mal von mir, vielleicht hast du irgendwo einen tippfehler?
BTW. : Arbeitest du unter windows? GIbt oft probleme damit (vor allem Pfade), bin auch schnell auf vagrant umgestiegen.
Ja, ich arbeite hier auf Arbeit unter Windows und nein, ich nutze gar keine IDE; ich hab das bisher nicht für nötig befunden. Nur mein bevorzugter Texteditor und ich .
Inwiefern könnte das Problem mit den Pfaden zusammenhängen? Ich müsste doch wahrscheinlich einen Nicht-Gefunden- / Nicht-Definiert-Fehler bekommen… das schreiben in die Datei klappt ja auch ohne weiteres…
Ich hatte als ich unter Windows gearbeitet habe, Probleme beim Plugin Schreiben z.B. bei Übersetzungen wenn man diese mit einer .ini mitliefert oder das Theme mit demPlugin erweitert, da hat Windows die verzeichnisse nicht gefunden. Es scheint aber auch nicht jeder diese Probleme zu haben.
Hier das Ticket dazu -> Shopware Issuetracker
Es ist gut möglich dass es bei dir auch gar nicht am Betriebssystem liegtda du ja irgend ein Output kriegst, war nur sone Vermutung.
Dein output sieht mir irgendwie nach HEX aus, hast du einfach nur mein Code kopiert oder noch irgendetwas hinzugefügt?
HAHA! Sehr geil. Einen Fix nicht zu mergen, weil man “offiziell nicht die Entwicklung auf Win unterstützt” hat Stil … deswegen muss man ja nicht dafür sorgen, dass Probleme weiter bestehen; dafür ist Community-Entwicklung doch da^^ Naja…
Nee, hab nur den Pfad für die txt verändert, ansonsten ist der Code 1:1 wie du ihn gepostet hast.
Ja irgendwie komisch aber naja …
Hmmm jetzt bin ich leider auch ein wenig ratlos falls ich das ganze irgendwie nachstellen kann oder einen anderen Tipp für dich hab melde ich mich.
Vielleicht ist hier ja noch jemand unterwegs der soetwas schonmal hatte.
So, hab einen Weg gefunden. Ich hab folgendes probiert:
class RgCustomerSync extends \Shopware\Components\Plugin
{
private $resource;
private $agentRules;
public static function getSubscribedEvents()
{
return [
"Shopware\Models\Customer\Customer::postUpdate" => "onCustomerUpdate"
];
}
public function onCustomerUpdate(\LifecycleEventArgs $args)
{
get_class_methods($args); // natürlich geloggt
}
}
Dadurch hab ich herausbekommen, dass $args eine Methode $args->getEntity(); hat. Mit der $entity kann ich mich dann zu meinen Werten hangeln, z.B. mit
$entity = $args->getEntity();
$entity->getCountry()->getIso(); // z.B. "DE"
Ich würd mal sagen: JUHU!
… nicht. Habe jetzt leider herausgefunden, das der Customer-Hook gar nicht gefeuert wird, wenn beispielsweise die Zahlungsmethode oder eine Adresse (Liefer- oder Rechnungs-) geupdated wird. Das ist jetzt leider sehr frustrierend, weil ich jetzt den halben Tag damit vertan habe, weitere Hooks zu finden, auf die ich mich draufschnallen kann.
Kann mir da eventuell nochmal jemand einen Hinweis geben?