Hallo, Gibt es ein Event, welches ausgelöst wird, wenn die Zahlart einer Bestellung im Backend geändert wird? Ich möchte mich gerne in dieses Event einklinken und bei unserem Zahlungsmodul verhindern, dass Bestellungen mit unserer Zahlart nachträglich die Zahlart ändern können. Vielen Dank
Hi, ich denke nicht, dass es genau für deinen Fall ein Event gibt, bin aber auch gerade Quellcode-los :). Der Standard-Weg bei solchen Fragen ist eigentlich immer der gleiche: Firebug/DeveloperTools öffnen (F12) und den Netzwerk-Tab aktivieren. Dann gewünschte Aktion durchführen und schauen, welche Controller/welche Action aufgerufen wird. Auf die entsprechende Action registrierst du dann ein Pre- oder Dispatch-Event und kannst da dann deine Manipulationen durchführen. Wenn es keine Möglichkeit gibt, sauber auszusteigen, kannst du als letzte Notlösung bspw. eine Exception werfen, die wird in SW in aller Regel abgefangen und dann dem Nutzer als GrowlMessage angezeigt. Falls Pre- bzw. PostDispatch-Events nicht passen, kann man public und protected-Methoden in den Controllern auch Hooken. Auch das wäre ein Weg. Auf die Weise solltest du zum Ziel kommen. lG Daniel
So… ich bin nun etwas weiter in der Materie drinne und hab mich in den Controller gehooked: $this-\>subscribeEvent( 'Shopware\_Controllers\_Backend\_Order::saveAction::before', 'beforeSaveOrderInBackend' );
Klappt soweit auch wunderbar. In meiner Logik möchte ich prüfen, ob bei einem Update einer Bestellung diese Bestellung ursprünglich eine unserer Zahlarten benutzt hat und wenn diese dann geändert werden soll, möchte ich dies verbieten. Komischerweise wird trotzdem die Bestellung immer upgedated, auch wenn dies eigentlich nicht passieren dürfte? Und witzigerweise ist in enthält $parameter[‚payment‘][0][‚name‘] manchmal noch die Zahlart von dem vorherigen Request. Sprich wenn ich einmal auf z.B. Cash geändert habe und dann noch einmal zu einer anderen Zahlart ändere, hat manchmal $parameter[‚payment‘][0][‚name‘] immer noch Cash als Wert. Hier der Code zu meiner Logik, eventuell kann jemand helfen. public function beforeSaveOrderInBackend(Enlight\_Hook\_HookArgs $arguments) { $request = $arguments-\>getSubject()-\>Request(); $parameter = $request-\>getParams(); $order = Shopware()-\>Models()-\>find('Shopware\Models\Order\Order', $parameter['attribute'][0]['orderId']); Shopware()-\>Log()-\>Warn($order-\>getPayment()-\>getName() . " " .$parameter['payment'][0]['name']); if(in\_array($order-\>getPayment()-\>getName(), array('foo', 'fii', 'faa')) && $parameter['payment'][0]['name'] !== $order-\>getPayment()-\>getName()) { Shopware()-\>Log()-\>Warn('Bei einer Foo Bestellung kann die Zahlart nicht nachträglich geändert werden.'); $arguments-\>stop(); return true; } return false; }
Ps: Die Zahlarten habe ich mal schwachsinnige Werte geändert.
Echt merkwürdig, ich logge ja den Parameter, dieser sagt mir zum Beispiel noch foo obwohl ich auf zB Cash ändere… trotzdem wird die Bestellung aug Cash gesetzt… obwohl der übergebene Parameter im Log foo ist Oo. Oder hooke ich mich am falschen Punkt ein? beforeSave müsste eigentlich korrekt sein?
Hat hierzu jemand eventuell eine Idee / einen Tipp?
Mittlerweile hab ich den Code geupdated und die Zahlarten werden nun richtig übergeben… Aber der Prozess steigt bei $arguments->stop() nicht aus… public function beforeSaveOrderInBackend(Enlight\_Hook\_HookArgs $arguments) { $request = $arguments-\>getSubject()-\>Request(); $order = Shopware()-\>Models()-\>find('Shopware\Models\Order\Order', $request-\>getParam('id')); $newPaymentMethod = Shopware()-\>Models()-\>find('Shopware\Models\Payment\Payment', $request-\>getParam('paymentId')); if(in\_array($order-\>getPayment()-\>getName(), array('foo', 'fii', 'faa')) && $order-\>getPayment()-\>getName() !== $newPaymentMethod-\>getName() ) { Shopware()-\>Log()-\>Warn('Bei einer Foo Bestellung kann die Zahlart nicht nachträglich geändert werden.'); $arguments-\>stop(); } return false; }