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 *}