diff --git a/core/lib/Thelia/Cart/CartTrait.php b/core/lib/Thelia/Cart/CartTrait.php index 26075dc75..5c60f0afa 100644 --- a/core/lib/Thelia/Cart/CartTrait.php +++ b/core/lib/Thelia/Cart/CartTrait.php @@ -97,7 +97,7 @@ trait CartTrait protected function createCart(Session $session) { $cart = new CartModel(); - $cart->setToken($this->generateCookie()); + $cart->setToken($this->generateCookie($session)); if (null !== $customer = $session->getCustomerUser()) { $cart->setCustomer($customer); @@ -120,7 +120,7 @@ trait CartTrait */ protected function duplicateCart(EventDispatcherInterface $dispatcher, CartModel $cart, Session $session, Customer $customer = null) { - $newCart = $cart->duplicate($this->generateCookie(), $customer, $dispatcher); + $newCart = $cart->duplicate($this->generateCookie($session), $customer, $dispatcher); $session->setCart($newCart->getId()); $cartEvent = new CartEvent($newCart); @@ -130,11 +130,13 @@ trait CartTrait return $cartEvent->getCart(); } - protected function generateCookie() + protected function generateCookie(Session $session) { $id = null; if (ConfigQuery::read("cart.session_only", 0) == 0) { $id = uniqid('', true); + $session->set('cart_use_cookie', $id); + setcookie( "thelia_cart", $id, diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 9657f80e0..614364294 100644 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -96,6 +96,10 @@ + + + + diff --git a/core/lib/Thelia/Core/EventListener/ResponseListener.php b/core/lib/Thelia/Core/EventListener/ResponseListener.php new file mode 100644 index 000000000..de14189fc --- /dev/null +++ b/core/lib/Thelia/Core/EventListener/ResponseListener.php @@ -0,0 +1,84 @@ +. */ +/* */ +/*************************************************************************************/ + +namespace Thelia\Core\EventListener; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Cookie; +use Symfony\Component\HttpKernel\Event\FilterResponseEvent; +use Symfony\Component\HttpKernel\KernelEvents; +use Thelia\Model\ConfigQuery; + + +/** + * Class ResponseListener + * @package Thelia\Core\EventListener + * @author Manuel Raynaud + */ +class ResponseListener implements EventSubscriberInterface +{ + + public function beforeResponse(FilterResponseEvent $event) + { + $session = $event->getRequest()->getSession(); + + if (null !== $id = $session->get("cart_use_cookie")) { + $response = $event->getResponse(); + $response->headers->setCookie(new Cookie( + "thelia_cart", + $id, + time()+ConfigQuery::read("cart.cookie_lifetime", 60*60*24*365), + '/' + )); + + $session->set("cart_use_cookie", null); + } + } + + /** + * Returns an array of event names this subscriber wants to listen to. + * + * The array keys are event names and the value can be: + * + * * The method name to call (priority defaults to 0) + * * An array composed of the method name to call and the priority + * * An array of arrays composed of the method names to call and respective + * priorities, or 0 if unset + * + * For instance: + * + * * array('eventName' => 'methodName') + * * array('eventName' => array('methodName', $priority)) + * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) + * + * @return array The event names to listen to + * + * @api + */ + public static function getSubscribedEvents() + { + return [ + KernelEvents::RESPONSE => ['beforeResponse', 128] + ]; + } +} \ No newline at end of file diff --git a/local/modules/Klikandpay b/local/modules/Klikandpay index 15cc539db..a72c066e7 160000 --- a/local/modules/Klikandpay +++ b/local/modules/Klikandpay @@ -1 +1 @@ -Subproject commit 15cc539db98eebd675538e6c35a92a3ca749195c +Subproject commit a72c066e7400d2350dca24016a302582cb7e7b62