. */ /* */ /*************************************************************************************/ namespace Thelia\Action; use Propel\Runtime\Exception\PropelException; use Symfony\Component\Config\Definition\Exception\Exception; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Thelia\Core\Event\ActionEvent; use Thelia\Core\Event\CartEvent; use Thelia\Core\Event\TheliaEvents; use Thelia\Core\HttpFoundation\Session\Session; use Thelia\Form\CartAdd; 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; /** * * Class Cart where all actions are manage like adding, modifying or delete items. * * Class Cart * @package Thelia\Action */ class Cart extends BaseAction implements EventSubscriberInterface { use \Thelia\Cart\CartTrait; /** * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface */ protected $dispatcher; /** * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher */ public function __construct(EventDispatcherInterface $dispatcher) { $this->dispatcher = $dispatcher; } /** * * add an article to cart * * @param \Thelia\Core\Event\ActionEvent $event */ public function addArticle(ActionEvent $event) { $request = $event->getRequest(); try { $cartAdd = $this->getAddCartForm($request); $form = $this->validateForm($cartAdd); $cart = $this->getCart($request); $newness = $form->get("newness")->getData(); $append = $form->get("append")->getData(); $quantity = $form->get("quantity")->getData(); $productSaleElementsId = $form->get("product_sale_elements_id")->getData(); $productId = $form->get("product")->getData(); $cartItem = $this->findItem($cart->getId(), $productId, $productSaleElementsId); if($cartItem === null || $newness) { $productPrice = ProductPriceQuery::create() ->filterByProductSaleElementsId($productSaleElementsId) ->findOne() ; $this->addItem($cart, $productId, $productSaleElementsId, $quantity, $productPrice); } if($append && $cartItem !== null) { $this->updateQuantity($cartItem, $quantity); } $this->redirect($cartAdd->getSuccessUrl($request->getUriAddingParameters(array("addCart" => 1)))); } catch (PropelException $e) { \Thelia\Log\Tlog::getInstance()->error(sprintf("Failed to add item to cart with message : %s", $e->getMessage())); $message = "Failed to add this article to your cart, please try again"; } catch(FormValidationException $e) { $message = $e->getMessage(); } // The form has errors, propagate it. $this->propagateFormError($cartAdd, $message, $event); } protected function updateQuantity(CartItem $cartItem, $quantity) { $cartItem->setDisptacher($this->dispatcher); $cartItem->addQuantity($quantity) ->save(); } protected function addItem(\Thelia\Model\Cart $cart, $productId, $productSaleElementsId, $quantity, ProductPrice $productPrice) { $cartItem = new CartItem(); $cartItem->setDisptacher($this->dispatcher); $cartItem ->setCart($cart) ->setProductId($productId) ->setProductSaleElementsId($productSaleElementsId) ->setQuantity($quantity) ->setPrice($productPrice->getPrice()) ->setPromoPrice($productPrice->getPromoPrice()) ->setPriceEndOfLife(time() + ConfigQuery::read("cart.priceEOF", 60*60*24*30)) ->save(); } protected function findItem($cartId, $productId, $productSaleElementsId) { return CartItemQuery::create() ->filterByCartId($cartId) ->filterByProductId($productId) ->filterByProductSaleElementsId($productSaleElementsId) ->findOne(); } private function getAddCartForm(Request $request) { if ($request->isMethod("post")) { $cartAdd = new CartAdd($request); } else { $cartAdd = new CartAdd( $request, "form", array(), array( 'csrf_protection' => false, ) ); } return $cartAdd; } /** * * Delete specify article present into cart * * @param \Thelia\Core\Event\ActionEvent $event */ public function deleteArticle(ActionEvent $event) { $request = $event->getRequest(); if (null !== $cartItemId = $request->get('cartItem')) { $cart = $this->getCart($request); try { $cartItem = CartItemQuery::create() ->filterByCartId($cart->getId()) ->filterById($cartItemId) ->delete(); } catch (PropelException $e) { \Thelia\Log\Tlog::getInstance()->error(sprintf("error during deleting cartItem with message : %s", $e->getMessage())); } } } /** * * Modify article's quantity * * don't use Form here just test the Request. * * @param \Thelia\Core\Event\ActionEvent $event */ public function modifyArticle(ActionEvent $event) { $request = $event->getRequest(); if(null !== $cartItemId = $request->get("cartItem") && null !== $quantity = $request->get("quantity")) { try { $cart = $this->getCart($request); $cartItem = CartItemQuery::create() ->filterByCartId($cart->getId()) ->filterById($cartItemId) ->findOne(); if($cartItem) { $this->updateQuantity($cartItem, $quantity); } } catch (PropelException $e) { \Thelia\Log\Tlog::getInstance()->error(sprintf("error during updating cartItem with message : %s", $e->getMessage())); } } } /** * 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 array( "action.addArticle" => array("addArticle", 128), "action.deleteArticle" => array("deleteArticle", 128), "action.modifyArticle" => array("modifyArticle", 128), ); } }