Committing Orders
After all checkout steps are completed, the order can be committed. If no payment is involved, this is done as follows. If payment is involved, have a look at the Payment Integration docs.
<?php
$manager = Factory::getInstance()->getCheckoutManager($cart);
$order = $manager->commitOrder();
While committing the order, the checkout manager delegates it to the specified commit order processor implementation,
which needs to implement \Pimcore\Bundle\EcommerceFrameworkBundle\CheckoutManager\CommitOrderProcessorInterface
.
This is the place where all functionality for committing the order (e.g. sending orders to erp systems, sending order confirmation mails, ...) is located.
The default implementation \Pimcore\Bundle\EcommerceFrameworkBundle\CheckoutManager\V7\CommitOrderProcessor
provides
basic functionality like creating a Pimcore order object and sending an order confirmation mail.
Order creation itself is delegated to the \Pimcore\Bundle\EcommerceFrameworkBundle\OrderManager\OrderManagerInterface
.
Typically needed Custom Extensions
In simple use cases a project specific implementation needs
- ...to extend
\Pimcore\Bundle\EcommerceFrameworkBundle\OrderManager\V7\OrderManager
and overwrite the methodapplyCustomCheckoutDataToOrder
to add additional custom fields to the order object and - ...to extend
\Pimcore\Bundle\EcommerceFrameworkBundle\CheckoutManager\V7\CommitOrderProcessor
and overwrite the methodprocessOrder
where website specific functionality is integrated (sending orders to erp systems, ...).
See following examples for details.
Order Manager
If additional information needs to be stored into the order, the OrderManager has to be extended. For more Information concerning the OrderManager see the documentation.
A simple implementation of App\Ecommerce\Order\OrderManager
could look like:
<?php
class OrderManager extends \Pimcore\Bundle\EcommerceFrameworkBundle\OrderManager\V7\OrderManager
{
/**
* @throws InvalidConfigException
*/
protected function applyCustomCheckoutDataToOrder(CartInterface $cart, AbstractOrder $order): AbstractOrder
{
/** @var AbstractOrder $order */
$order = parent::applyCustomCheckoutDataToOrder($cart, $order);
$checkout = Factory::getInstance()->getCheckoutManager($cart);
$deliveryAddress = $checkout->getCheckoutStep('deliveryaddress') ? $checkout->getCheckoutStep('deliveryaddress')->getData() : null;
$confirm = $checkout->getCheckoutStep('confirm') ? $checkout->getCheckoutStep('confirm')->getData() : null;
if($deliveryAddress) {
//inserting delivery and billing address from checkout step delivery
$order->setCustomerFirstname( $deliveryAddress->firstname );
$order->setCustomerLastname( $deliveryAddress->lastname );
$order->setCustomerCompany( $deliveryAddress->company );
$order->setCustomerStreet( $deliveryAddress->address );
$order->setCustomerZip( $deliveryAddress->zip );
$order->setCustomerCity( $deliveryAddress->city );
$order->setCustomerCountry( $deliveryAddress->country );
$order->setCustomerEmail( $deliveryAddress->email );
$order->setDeliveryFirstname( $deliveryAddress->firstname );
$order->setDeliveryLastname( $deliveryAddress->lastname );
$order->setDeliveryCompany( $deliveryAddress->company );
$order->setDeliveryStreet( $deliveryAddress->address );
$order->setDeliveryZip( $deliveryAddress->zip );
$order->setDeliveryCity( $deliveryAddress->city );
$order->setDeliveryCountry( $deliveryAddress->country );
} else if($confirm) {
//in quick checkout - only get email-adress from confirm step
$order->setCustomerEmail( $confirm );
}
return $order;
}
}
Commit Order Processor
A simple implementation of \App\Checkout\Processor
could look like:
<?php
class Processor extends CommitOrderProcessor
{
protected function processOrder(AbstractOrder $order): void
{
//send order to ERP-System
try {
$connector = ERPConnector::getInstance();
$erpOrderNumber = $connector->sendOrder($order);
$order->setOrderNumber($erpOrderNumber);
} catch(Exception $e) {
Logger::error($e->getMessage());
throw $e;
}
}
}
If needed, further methods can be overwritten. E.g. sendConfirmationMail
if special e-mails should be sent to
specific persons.
After commit order was successful, the user can be directed to a success-page.