diff --git a/core/lib/Thelia/Action/Module.php b/core/lib/Thelia/Action/Module.php index 249aab3b2..ecd72aece 100644 --- a/core/lib/Thelia/Action/Module.php +++ b/core/lib/Thelia/Action/Module.php @@ -176,7 +176,11 @@ class Module extends BaseAction implements EventSubscriberInterface $paymentModuleInstance = $this->container->get(sprintf('module.%s', $paymentModule->getCode())); - $paymentModuleInstance->pay($order); + $response = $paymentModuleInstance->pay($order); + + if (null !== $response && $response instanceof \Thelia\Core\HttpFoundation\Response) { + $event->setResponse($response); + } } /** diff --git a/core/lib/Thelia/Action/Order.php b/core/lib/Thelia/Action/Order.php index ece908a96..9d0da5563 100644 --- a/core/lib/Thelia/Action/Order.php +++ b/core/lib/Thelia/Action/Order.php @@ -340,12 +340,6 @@ class Order extends BaseAction implements EventSubscriberInterface $event->getDispatcher()->dispatch(TheliaEvents::ORDER_BEFORE_PAYMENT, new OrderEvent($placedOrder)); - /* clear session */ - $session - ->setProcessedOrder($placedOrder) - ->setOrder(new \Thelia\Model\Order()) - ; - /* but memorize placed order */ $event->setOrder(new \Thelia\Model\Order()); $event->setPlacedOrder($placedOrder); @@ -353,14 +347,14 @@ class Order extends BaseAction implements EventSubscriberInterface /* empty cart */ $dispatcher = $event->getDispatcher(); - $dispatcher->dispatch( - TheliaEvents::CART_CLEAR, new CartEvent($this->getCart($dispatcher, $this->request))); - - /* call pay method */ $payEvent = new OrderPaymentEvent($placedOrder); $dispatcher->dispatch(TheliaEvents::MODULE_PAY, $payEvent); + + if ($payEvent->hasResponse()) { + $event->setResponse($payEvent->getResponse()); + } } /** diff --git a/core/lib/Thelia/Cart/CartTrait.php b/core/lib/Thelia/Cart/CartTrait.php index e7c946a67..568a6aaec 100644 --- a/core/lib/Thelia/Cart/CartTrait.php +++ b/core/lib/Thelia/Cart/CartTrait.php @@ -135,7 +135,12 @@ trait CartTrait $id = null; if (ConfigQuery::read("cart.session_only", 0) == 0) { $id = uniqid('', true); - setcookie("thelia_cart", $id, time()+ConfigQuery::read("cart.cookie_lifetime", 60*60*24*365)); + setcookie( + "thelia_cart", + $id, + time()+ConfigQuery::read("cart.cookie_lifetime", 60*60*24*365), + '/' + ); } diff --git a/core/lib/Thelia/Core/Event/Order/OrderEvent.php b/core/lib/Thelia/Core/Event/Order/OrderEvent.php index 7463bd176..f35f343d2 100644 --- a/core/lib/Thelia/Core/Event/Order/OrderEvent.php +++ b/core/lib/Thelia/Core/Event/Order/OrderEvent.php @@ -24,6 +24,7 @@ namespace Thelia\Core\Event\Order; use Thelia\Core\Event\ActionEvent; +use Thelia\Core\HttpFoundation\Response; use Thelia\Model\Order; class OrderEvent extends ActionEvent @@ -39,6 +40,11 @@ class OrderEvent extends ActionEvent protected $status = null; protected $deliveryRef = null; + /** + * @var Response + */ + protected $response; + /** * @param Order $order */ @@ -206,4 +212,28 @@ class OrderEvent extends ActionEvent { return $this->deliveryRef; } + + /** + * @param Response $response + * @return $this + */ + public function setResponse(Response $response) + { + $this->response = $response; + + return $this; + } + + /** + * @return Response + */ + public function getResponse() + { + return $this->response; + } + + public function hasResponse() + { + return null !== $this->response; + } } diff --git a/core/lib/Thelia/Core/Event/Order/OrderPaymentEvent.php b/core/lib/Thelia/Core/Event/Order/OrderPaymentEvent.php index 13211092e..9881afc82 100644 --- a/core/lib/Thelia/Core/Event/Order/OrderPaymentEvent.php +++ b/core/lib/Thelia/Core/Event/Order/OrderPaymentEvent.php @@ -24,6 +24,7 @@ namespace Thelia\Core\Event\Order; use Thelia\Core\Event\ActionEvent; +use Thelia\Core\HttpFoundation\Response; use Thelia\Model\Order; /** @@ -38,6 +39,11 @@ class OrderPaymentEvent extends ActionEvent */ protected $order; + /** + * @var \Thelia\Core\HttpFoundation\Response + */ + protected $response; + public function __construct(Order $order) { $this->order = $order; } @@ -49,4 +55,29 @@ class OrderPaymentEvent extends ActionEvent { return $this->order; } + + /** + * @param \Thelia\Core\HttpFoundation\Response $response + */ + public function setResponse(Response $response) + { + $this->response = $response; + + return $this; + } + + /** + * @return \Thelia\Core\HttpFoundation\Response + */ + public function getResponse() + { + return $this->response; + } + + public function hasResponse() + { + return null !== $this->response; + } + + } \ No newline at end of file diff --git a/core/lib/Thelia/Core/HttpFoundation/Session/Session.php b/core/lib/Thelia/Core/HttpFoundation/Session/Session.php index 5179d7e56..b35bd4a13 100644 --- a/core/lib/Thelia/Core/HttpFoundation/Session/Session.php +++ b/core/lib/Thelia/Core/HttpFoundation/Session/Session.php @@ -253,26 +253,6 @@ class Session extends BaseSession return $this->get("thelia.order"); } - /** - * @param Order $order - * @return $this - */ - public function setProcessedOrder(Order $order) - { - $this->set('thelia.order.processed', $order); - - return $this; - } - - /** - * Return an order already processed, usefull for payment modules - * @return Order - */ - public function getProcessedOrder() - { - return $this->get('thelia.order.processed'); - } - /** * Set consumed coupons by the Customer * diff --git a/local/modules/Front/Controller/OrderController.php b/local/modules/Front/Controller/OrderController.php index 56d97f5cb..e69bf6ea7 100644 --- a/local/modules/Front/Controller/OrderController.php +++ b/local/modules/Front/Controller/OrderController.php @@ -23,6 +23,7 @@ namespace Front\Controller; use Propel\Runtime\Exception\PropelException; +use Thelia\Cart\CartTrait; use Thelia\Controller\Front\BaseFrontController; use Thelia\Core\Event\PdfEvent; use Thelia\Core\HttpFoundation\Response; @@ -51,6 +52,7 @@ use Thelia\Tools\URL; */ class OrderController extends BaseFrontController { + use CartTrait; /** * set delivery address * set delivery module @@ -199,7 +201,11 @@ class OrderController extends BaseFrontController if (null !== $placedOrder && null !== $placedOrder->getId()) { /* order has been placed */ - $this->redirect(URL::getInstance()->absoluteUrl($this->getRoute('order.placed', array('order_id' => $orderEvent->getPlacedOrder()->getId())))); + if($orderEvent->hasResponse()) { + return $orderEvent->getResponse(); + } else { + $this->redirect(URL::getInstance()->absoluteUrl($this->getRoute('order.placed', array('order_id' => $orderEvent->getPlacedOrder()->getId())))); + } } else { /* order has not been placed */ $this->redirectToRoute('cart.view'); @@ -222,6 +228,10 @@ class OrderController extends BaseFrontController if (null === $customer || $placedOrder->getCustomerId() !== $customer->getId()) { throw new TheliaProcessException("Received placed order id does not belong to the current customer", TheliaProcessException::PLACED_ORDER_ID_BAD_CURRENT_CUSTOMER, $placedOrder); } + $session = $this->getRequest()->getSession(); + $this->createCart($this->getRequest()->getSession()); + + $session->setOrder(new Order()); $this->getParserContext()->set("placed_order_id", $placedOrder->getId()); }