Hallo,
wir möchten gern bei jeder Bestellung automatisch noch einen Kommentar dazuspeichern, der sich aus Freitextfeldern in der Confirm-Form bezieht.
Dafür müssen wir uns natürlich an ein Event oder eine Art Hook wie aus SW5 hängen.
Leider habe ich hier nur ein Event gefunden, das in Zusammenhang mit dem Bestellung-Speichern steht. Wie ich das sehe gibt es nur den Einstiegspunkt über CheckoutController::order
CheckoutController
public function order(RequestDataBag $data, SalesChannelContext $context, Request $request):
Response
{
[...]
try {
$orderId = $this->orderService->createOrder($data, $context);
$this->addAffiliateTracking($orderId, $request, $context);
$finishUrl = $this->generateUrl('frontend.checkout.finish.page', [
'orderId' => $orderId,
]);
$response = $this->paymentService->handlePaymentByOrder($orderId, $data, $context, $finishUrl);
if ($response !== null) {
return $response;
}
return new RedirectResponse($finishUrl);
}
[...]
return $this->forwardToRoute('frontend.checkout.confirm.page', ['formViolations' => $formViolations]);
}
landet dann hier in OrderService.php
public function createOrder(DataBag $data, SalesChannelContext $context): string
{
$this->validateOrderData($data, $context);
$cart = $this->cartService->getCart($context->getToken(), $context);
return $this->cartService->order($cart, $context);
}
und dann wiederum hier:
public function order(Cart $cart, SalesChannelContext $context): string
{
[...]
$orderEntity->setOrderCustomer(
$this->fetchCustomer($orderEntity->getId(), $context->getContext())
);
$orderPlacedEvent = new CheckoutOrderPlacedEvent(
$context->getContext(),
$orderEntity,
$context->getSalesChannel()->getId()
);
$this->eventDispatcher->dispatch($orderPlacedEvent);
$this->persister->delete($context->getToken(), $context);
unset($this->cart[$calculatedCart->getToken()]);
return $orderId;
}
in der letzten Methode wird ein Event dispatched: CheckoutOrderPlacedEvent
aber das ist ja bereits NACH dem Speichern. Natürlich könnte man sich daran hängen und dann den Kommentar in die Datenbank schieben, aber dann steht er nicht in der Bestellbestätigungs-Mail, welche ja auch durch dieses Event getriggert wird…
Außerdem habe ich in diesem Event ja dann keinen Zugriff mehr auf den Inhalt des Confirm-Formulares …
hat jemand eine Lösung? Es gibt wohl noch zu wenig Event/Hook-Möglichkeiten…