diff --git a/core/lib/Thelia/Action/Cart.php b/core/lib/Thelia/Action/Cart.php index c0c305488..28fb5aa0d 100755 --- a/core/lib/Thelia/Action/Cart.php +++ b/core/lib/Thelia/Action/Cart.php @@ -42,6 +42,7 @@ use Thelia\Model\Cart as CartModel; use Thelia\Model\ConfigQuery; use Thelia\Model\Customer; + /** * * Class Cart where all actions are manage like adding, modifying or delete items. @@ -51,6 +52,7 @@ use Thelia\Model\Customer; */ class Cart extends BaseAction implements EventSubscriberInterface { + use \Thelia\Cart\CartTrait; /** * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface */ @@ -253,103 +255,5 @@ class Cart extends BaseAction implements EventSubscriberInterface ); } - /** - * - * search if cart already exists in session. If not try to create a new one or duplicate an old one. - * - * @param \Symfony\Component\HttpFoundation\Request $request - * @return \Thelia\Model\Cart - */ - public function getCart(Request $request) - { - if(null !== $cart = $request->getSession()->getCart()){ - return $cart; - } - - if ($request->cookies->has("thelia_cart")) { - //le cookie de panier existe, on le récupère - $token = $request->cookies->get("thelia_cart"); - - $cart = CartQuery::create()->findOneByToken($token); - - if ($cart) { - //le panier existe en base - $customer = $request->getSession()->getCustomerUser(); - - if ($customer) { - if($cart->getCustomerId() != $customer->getId()) { - //le customer du panier n'est pas le mm que celui connecté, il faut cloner le panier sans le customer_id - $cart = $this->duplicateCart($cart, $request->getSession(), $customer); - } - } else { - if ($cart->getCustomerId() != null) { - //il faut dupliquer le panier sans le customer_id - $cart = $this->duplicateCart($cart, $request->getSession()); - } - } - - } else { - $cart = $this->createCart($request->getSession()); - } - } else { - //le cookie de panier n'existe pas, il va falloir le créer et faire un enregistrement en base. - $cart = $this->createCart($request->getSession()); - } - - return $cart; - } - - /** - * @param \Thelia\Core\HttpFoundation\Session\Session $session - * @return \Thelia\Model\Cart - */ - protected function createCart(Session $session) - { - $cart = new CartModel(); - $cart->setToken($this->generateCookie()); - - if(null !== $customer = $session->getCustomerUser()) { - $cart->setCustomer($customer); - } - - $cart->save(); - - $session->setCart($cart->getId()); - - return $cart; - } - - - /** - * try to duplicate existing Cart. Customer is here to determine if this cart belong to him. - * - * @param \Thelia\Model\Cart $cart - * @param \Thelia\Core\HttpFoundation\Session\Session $session - * @param \Thelia\Model\Customer $customer - * @return \Thelia\Model\Cart - */ - protected function duplicateCart(CartModel $cart, Session $session, Customer $customer = null) - { - $newCart = $cart->duplicate($this->generateCookie(), $customer); - $session->setCart($newCart->getId()); - - $cartEvent = new CartEvent($newCart); - $this->dispatcher->dispatch(TheliaEvents::CART_DUPLICATE, $cartEvent); - - return $cartEvent->cart; - } - - protected function generateCookie() - { - $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)); - - } - - return $id; - - } } diff --git a/core/lib/Thelia/Cart/CartTrait.php b/core/lib/Thelia/Cart/CartTrait.php new file mode 100644 index 000000000..90230c474 --- /dev/null +++ b/core/lib/Thelia/Cart/CartTrait.php @@ -0,0 +1,138 @@ +. */ +/* */ +/*************************************************************************************/ +namespace Thelia\Cart; + +use Thelia\Model\ProductPrice; +use Thelia\Model\ProductPriceQuery; +use Thelia\Model\CartItem; +use Thelia\Model\CartItemQuery; +use Thelia\Model\CartQuery; +use Thelia\Model\Cart as CartModel; +use Thelia\Model\ConfigQuery; +use Thelia\Model\Customer; +use Symfony\Component\HttpFoundation\Request; +use Thelia\Core\HttpFoundation\Session\Session; +use Thelia\Core\Event\CartEvent; +use Thelia\Core\Event\TheliaEvents; + +trait CartTrait { + /** + * + * search if cart already exists in session. If not try to create a new one or duplicate an old one. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @return \Thelia\Model\Cart + */ + public function getCart(Request $request) + { + + if(null !== $cart = $request->getSession()->getCart()){ + return $cart; + } + + if ($request->cookies->has("thelia_cart")) { + //le cookie de panier existe, on le récupère + $token = $request->cookies->get("thelia_cart"); + + $cart = CartQuery::create()->findOneByToken($token); + + if ($cart) { + //le panier existe en base + $customer = $request->getSession()->getCustomerUser(); + + if ($customer) { + if($cart->getCustomerId() != $customer->getId()) { + //le customer du panier n'est pas le mm que celui connecté, il faut cloner le panier sans le customer_id + $cart = $this->duplicateCart($cart, $request->getSession(), $customer); + } + } else { + if ($cart->getCustomerId() != null) { + //il faut dupliquer le panier sans le customer_id + $cart = $this->duplicateCart($cart, $request->getSession()); + } + } + + } else { + $cart = $this->createCart($request->getSession()); + } + } else { + //le cookie de panier n'existe pas, il va falloir le créer et faire un enregistrement en base. + $cart = $this->createCart($request->getSession()); + } + + return $cart; + } + + /** + * @param \Thelia\Core\HttpFoundation\Session\Session $session + * @return \Thelia\Model\Cart + */ + protected function createCart(Session $session) + { + $cart = new CartModel(); + $cart->setToken($this->generateCookie()); + + if(null !== $customer = $session->getCustomerUser()) { + $cart->setCustomer($customer); + } + + $cart->save(); + + $session->setCart($cart->getId()); + + return $cart; + } + + + /** + * try to duplicate existing Cart. Customer is here to determine if this cart belong to him. + * + * @param \Thelia\Model\Cart $cart + * @param \Thelia\Core\HttpFoundation\Session\Session $session + * @param \Thelia\Model\Customer $customer + * @return \Thelia\Model\Cart + */ + protected function duplicateCart(CartModel $cart, Session $session, Customer $customer = null) + { + $newCart = $cart->duplicate($this->generateCookie(), $customer); + $session->setCart($newCart->getId()); + + $cartEvent = new CartEvent($newCart); + $this->dispatcher->dispatch(TheliaEvents::CART_DUPLICATE, $cartEvent); + + return $cartEvent->cart; + } + + protected function generateCookie() + { + $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)); + + } + + return $id; + + } +} \ No newline at end of file diff --git a/core/lib/Thelia/Config/Resources/config.xml b/core/lib/Thelia/Config/Resources/config.xml index 0d51284c7..f9a55fe13 100755 --- a/core/lib/Thelia/Config/Resources/config.xml +++ b/core/lib/Thelia/Config/Resources/config.xml @@ -24,7 +24,7 @@ - + diff --git a/core/lib/Thelia/Core/Template/Loop/Cart.php b/core/lib/Thelia/Core/Template/Loop/Cart.php index 91f62a328..4e236caae 100644 --- a/core/lib/Thelia/Core/Template/Loop/Cart.php +++ b/core/lib/Thelia/Core/Template/Loop/Cart.php @@ -11,8 +11,37 @@ namespace Thelia\Core\Template\Loop; use Thelia\Core\Template\Element\BaseLoop; +use Thelia\Core\Template\Element\LoopResult; +use Thelia\Core\Template\Element\LoopResultRow; +use Thelia\Core\Template\Loop\Argument\ArgumentCollection; class Cart extends BaseLoop { + use \Thelia\Cart\CartTrait; + /** + * + * define all args used in your loop + * + * array key is your arg name. + * + * example : + * + * return array ( + * "ref", + * "id" => "optional", + * "stock" => array( + * "optional", + * "default" => 10 + * ) + * ); + * + * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection + */ + protected function getArgDefinitions() + { + return new ArgumentCollection( + + ); + } /** * @@ -42,30 +71,33 @@ class Cart extends BaseLoop { */ public function exec(&$pagination) { - // TODO: Implement exec() method. + $result = new LoopResult(); + $cart = $this->getCart($this->request); + + if($cart === null) { + return $result; + } + + + $cartItems = $cart->getCartItems(); + + foreach ($cartItems as $cartItem) { + $product = $cartItem->getProduct(); + //$product->setLocale($this->request->getSession()->getLocale()); + + $loopResultRow = new LoopResultRow(); + + $loopResultRow->set("ITEM_ID", $cartItem->getId()); + $loopResultRow->set("TITLE", $product->getTitle()); + $loopResultRow->set("REF", $product->getRef()); + $loopResultRow->set("QUANTITY", $cartItem->getQuantity()); + $loopResultRow->set("PRICE", $cartItem->getPrice()); + $loopResultRow->set("PRODUCT_ID", $product->getId()); + $result->addRow($loopResultRow); + } + + return $result; } - /** - * - * define all args used in your loop - * - * array key is your arg name. - * - * example : - * - * return array ( - * "ref", - * "id" => "optional", - * "stock" => array( - * "optional", - * "default" => 10 - * ) - * ); - * - * @return \Thelia\Core\Template\Loop\Argument\ArgumentCollection - */ - protected function getArgDefinitions() - { - // TODO: Implement getArgDefinitions() method. - } + } \ No newline at end of file diff --git a/templates/default/cart.html b/templates/default/cart.html index 95f63ab5a..92de9838e 100644 --- a/templates/default/cart.html +++ b/templates/default/cart.html @@ -1,6 +1,11 @@ {include file="includes/header.html"}

{intl l='cart'}

+
    +{loop name="cart" type="cart"} +
  • Item {$LOOP_COUNT}/{$LOOP_TOTAL} : #TITLE - quantity : #QUANTITY
  • +{/loop} +
{form name="thelia.cart.add" } {* We use $INDEX_PAGE as form action to avoid mixing post and get data *}