vendor/pimcore/pimcore/bundles/EcommerceFrameworkBundle/CartManager/SessionCart.php line 57

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Bundle\EcommerceFrameworkBundle\CartManager;
  15. use Pimcore\Bundle\EcommerceFrameworkBundle\EventListener\SessionBagListener;
  16. use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
  17. use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
  18. class SessionCart extends AbstractCart implements CartInterface
  19. {
  20.     /**
  21.      * @var SessionCart[]
  22.      */
  23.     protected static $unserializedCarts;
  24.     /**
  25.      * @return string
  26.      */
  27.     protected function getCartItemClassName()
  28.     {
  29.         return SessionCartItem::class;
  30.     }
  31.     /**
  32.      * @return string
  33.      */
  34.     protected function getCartCheckoutDataClassName()
  35.     {
  36.         return SessionCartCheckoutData::class;
  37.     }
  38.     protected static function getSessionBag(): AttributeBagInterface
  39.     {
  40.         try {
  41.             $session \Pimcore::getContainer()->get('request_stack')->getSession();
  42.         } catch (SessionNotFoundException $e) {
  43.             trigger_deprecation('pimcore/pimcore''10.5',
  44.                 sprintf('Session used with non existing request stack in %s, that will not be possible in Pimcore 11.'__CLASS__));
  45.             $session \Pimcore::getContainer()->get('session');
  46.         }
  47.         /** @var AttributeBagInterface $sessionBag */
  48.         $sessionBag $session->getBag(SessionBagListener::ATTRIBUTE_BAG_CART);
  49.         if (empty($sessionBag->get('carts'))) {
  50.             $sessionBag->set('carts', []);
  51.         }
  52.         return $sessionBag;
  53.     }
  54.     public function save()
  55.     {
  56.         $session = static::getSessionBag();
  57.         if (!$this->getId()) {
  58.             $this->setId(uniqid('sesscart_'));
  59.         }
  60.         $carts $session->get('carts');
  61.         $carts[$this->getId()] = serialize($this);
  62.         $session->set('carts'$carts);
  63.     }
  64.     /**
  65.      * @return void
  66.      *
  67.      * @throws \Exception if the cart is not yet saved.
  68.      */
  69.     public function delete()
  70.     {
  71.         $session = static::getSessionBag();
  72.         if (!$this->getId()) {
  73.             throw new \Exception('Cart saved not yet.');
  74.         }
  75.         $this->clear();
  76.         $carts $session->get('carts');
  77.         unset($carts[$this->getId()]);
  78.         $session->set('carts'$carts);
  79.     }
  80.     /**
  81.      * @param callable $value_compare_func
  82.      *
  83.      * @return $this
  84.      */
  85.     public function sortItems(callable $value_compare_func)
  86.     {
  87.         if (is_array($this->items)) {
  88.             uasort($this->items$value_compare_func);
  89.         }
  90.         return $this;
  91.     }
  92.     /**
  93.      * {@inheritdoc}
  94.      */
  95.     public function modified()
  96.     {
  97.         return parent::modified();
  98.     }
  99.     /**
  100.      * @param int $id
  101.      *
  102.      * @return SessionCart|null
  103.      */
  104.     public static function getById($id)
  105.     {
  106.         $carts = static::getAllCartsForUser(-1);
  107.         return $carts[$id] ?? null;
  108.     }
  109.     /**
  110.      * @static
  111.      *
  112.      * @param int $userId
  113.      *
  114.      * @return SessionCart[]
  115.      */
  116.     public static function getAllCartsForUser($userId)
  117.     {
  118.         if (null === static::$unserializedCarts) {
  119.             static::$unserializedCarts = [];
  120.             foreach (static::getSessionBag()->get('carts') as $serializedCart) {
  121.                 $cart unserialize($serializedCart);
  122.                 static::$unserializedCarts[$cart->getId()] = $cart;
  123.             }
  124.         }
  125.         return static::$unserializedCarts;
  126.     }
  127.     /**
  128.      * @return array
  129.      *
  130.      * @internal
  131.      */
  132.     public function __sleep()
  133.     {
  134.         $vars parent::__sleep();
  135.         $blockedVars = ['creationDate''modificationDate''priceCalculator'];
  136.         $finalVars = [];
  137.         foreach ($vars as $key) {
  138.             if (!in_array($key$blockedVars)) {
  139.                 $finalVars[] = $key;
  140.             }
  141.         }
  142.         return $finalVars;
  143.     }
  144.     /**
  145.      * modified flag needs to be set
  146.      *
  147.      * @internal
  148.      */
  149.     public function __wakeup()
  150.     {
  151.         $timestampBackup $this->getModificationDate();
  152.         // set current cart
  153.         foreach ($this->getItems() as $item) {
  154.             $item->setCart($this);
  155.             if ($item->getSubItems()) {
  156.                 foreach ($item->getSubItems() as $subItem) {
  157.                     $subItem->setCart($this);
  158.                 }
  159.             }
  160.         }
  161.         $this->modified();
  162.         $this->setModificationDate($timestampBackup);
  163.     }
  164. }