* * @package stBasket * @subpackage libs */ class stBasket { /** * Przestrzeń nazw dla sesji * @var const */ const SESSION_NAMESPACE = 'soteshop/stBasket'; const ERR_OUT_OF_STOCK = -1; const ERR_MIN_QTY = -2; const ERR_POINTS = -3; const ERR_MAX_QTY = -4; const ERR_NO_OPTIONS_SELECTED = -5; const ERROR_MESSAGES = [ self::ERR_MAX_QTY => 'Maksymalna ilość jaką możesz zamówić w ramach jednego zamówienia to %quantity% %uom%', self::ERR_OUT_OF_STOCK => 'Brak wymaganej ilości towaru w magazynie (dostępnych: %stock% %uom%)', self::ERR_MIN_QTY => 'Minimalna ilość to %quantity% %uom%', self::ERR_POINTS => 'Brak wymaganej ilości punktów', self::ERR_NO_OPTIONS_SELECTED => 'Brak wybranych opcji produktu', ]; /** * Basket model instance * * @var Basket $basket */ protected $basket = null; /** * Produkty w koszyku * * @var BasketProduct[] */ protected $items = null; /** * * @var stEventDispatcher */ protected $dispatcher; protected $productConfig = null, $couponCode = null, $basketConfig = null, $lastAddedItems = array(), $totalTaxAmount = array(), $totalAmount = array(), $totalWeight = null, $totalQuantity = null, $discountConfig = null, $giftItem = null; /** * * @var sfGuardSecurityUser */ protected $user; /** * Rabat na zamówienie * @var false|null|Discount */ protected $discount = null; /** * Singleton * * @var stBasket */ protected static $instance = null; /** * Zwraca instancje obiektu * * @return stBasket */ public static function getInstance(sfGuardSecurityUser $user) { if (!isset(self::$instance)) { $class = __CLASS__; self::$instance = new $class(); self::$instance->initialize($user); } return self::$instance; } public static function getErrorMessage(BasketProduct $item, string $errorCode, sfI18N $i18n) { return $i18n->__(self::ERROR_MESSAGES[$errorCode], [ '%quantity%' => $item->getProductMaxQty(), '%uom%' => null !== $item->getProduct() ? $item->getProduct()->getFormattedUom($i18n) : ProductPeer::getDefaultUom($i18n), '%stock%' => $item->getMaxQuantity(), '%quantity%' => $errorCode == self::ERR_MIN_QTY ? $item->getProductMinQty() : $item->getProductMaxQty(), ]); } /** * Zwraca obiekt do obsługi zdarzeń * * @return stEventDispatcher */ public function getDispatcher() { return $this->dispatcher; } /** * Zwraca kontekst aplikacji * @return sfContext */ public function getContext() { return $this->user->getContext(); } /** * Incjalizuje koszyk * * @param sfGuardSecurityUser $user */ public function initialize(sfGuardSecurityUser $user) { $this->user = $user; $this->dispatcher = stEventDispatcher::getInstance(); if (!$this->user->hasAttribute('product_list', self::SESSION_NAMESPACE)) { $this->user->setAttribute('product_list', array(), self::SESSION_NAMESPACE); } $this->basketConfig = stConfig::getInstance('stBasket'); $this->productConfig = stConfig::getInstance('stProduct'); $this->discountConfig = stConfig::getInstance('stDiscountBackend'); } /** * Zapisuje zawartosc koszyka */ public function save() { if ($this->basket) { $gift = $this->getGiftItem(); if ($gift && !$gift->isDeleted()) { $discount = $this->getDiscount(); $this->setDiscount(false); $gift->setDeleted(true); $total_amount = $this->getTotalAmount(true); $gift->setDeleted(false); $this->setDiscount($discount); $this->clearProductTotals(); // throw new Exception($total_amount); if (!$gift->getProduct() || !ProductGroupPeer::isGift($gift->getProduct(), $total_amount, true)) { $gift->delete(); } } $this->basket->save(); $this->setBasketCookieId(); self::clearCache(); } } /** * Dodaje produkt do koszyka * Jesli dany produkt znajduje sie juz w koszyku zwieksza jego ilosc * * @param integer $id_product ID produktu * @param integer $num ilosc sztuk danego produktu - domyslnie 1 */ public function addItem($id, $quantity = 1, &$error = false, $updateQuantity = false) { $this->getDispatcher()->notify(new sfEvent($this, 'stBasket.preAddItem', array('id_product' => $id, 'num' => $quantity))); $item = $this->getItem($id); $themeVersion = sfContext::getInstance()->getController()->getTheme()->getVersion(); if ($this->getGiftItem() && $this->getContext()->getRequest()->hasParameter('gift')) { return $this->getGiftItem(); } $remove = false; if ($item) { if($item -> getProductForPoints() && $themeVersion < 7) { if(stPoints::getUnusedUserPoints() >= $item->getProduct()->getPointsValue()) { $item->setQuantity($item->getQuantity() + $quantity); } else { if($item->getProduct()->getPointsOnly()) { $error = self::ERR_POINTS; } else { $item->setQuantity($item->getQuantity() + $quantity); } } } else { $item->setQuantity($item->getQuantity() + $quantity); } } else { if ($product = ProductPeer::retrieveByPK($id)) { if(($product->getPointsOnly()==1 && $product->getPointsValue() > stPoints::getUnusedUserPoints()) && ($themeVersion < 7)) { $error = self::ERR_POINTS; $remove = true; } $item = new BasketProduct(); $item->setProduct($product); if ($this->getContext()->getRequest()->hasParameter('option_list')) { $option_list = $this->getContext()->getRequest()->getParameter('option_list'); if (!empty($option_list)) { $ids = explode('-', $option_list); $options = ProductOptionsValuePeer::doSelectByIds($ids); stNewProductOptions::updateProductBySelectedOptions($product, $options); } elseif ($product->hasOptions()) { $error = self::ERR_NO_OPTIONS_SELECTED; return $item; } } if ($this->getContext()->getRequest()->getParameter('product_set_discount')) { $item->setProductSetDiscountId($this->getContext()->getRequest()->getParameter('product_set_discount')); } if ($this->getContext()->getRequest()->hasParameter('gift')) { $item->setIsGift(ProductGroupPeer::isGift($product)); } elseif ($product->getIsGift()) { return false; } $this->getDispatcher()->notify(new sfEvent($this, 'stBasket.addItem.prePopulateItem', array('product' => $product, 'item' => $item))); $item = $this->populateItem($item, $product); if ($item->getIsGift()) { $quantity = 1; } $item->setQuantity($quantity); $item->setIsWithoutReturn($product->getIsWithoutReturn()); $this->getDispatcher()->notify(new sfEvent($this, 'stBasket.modAddItem', array('product' => $product, 'item' => $item))); $this->get()->addBasketProduct($item, true); if (!isset($this->items[$item->getItemId()])) { $this->items[$item->getItemId()] = $item; } self::setPointsOnlyProduct($item); $product->resetModified(); } else { return false; } } $previous_quantity = $item->getQuantity() - $quantity; $this->getDispatcher()->notify(new sfEvent($this, 'stBasket.postAddItem', array('item' => $item))); if (false === $error) { $error = $this->validateQuantity($item, $updateQuantity); } $quantity = $item->getQuantity() - $previous_quantity; $this->lastAddedItems[$item->getItemId()] = array( 'item' => $item, 'quantity' => $quantity > 0 ? $quantity : 0, 'error_code' => $error ); if ($error && $remove) { $this->removeItem($item->getItemId()); $this->save(); $this->refresh($item->getItemId()); } $this->clearProductTotals(); return $item; } public function getlastAddedItems() { return $this->lastAddedItems; } public function updateItem($id, $quantity, &$error = false, $updateQuantity = false) { $themeVersion = sfContext::getInstance()->getController()->getTheme()->getVersion(); $item = $this->getItem($id); if ($this->getGiftItem() && $this->getContext()->getRequest()->hasParameter('gift')) { return $this->getGiftItem(); } if ($item) { $error = false; if($item -> getProductForPoints() && ($themeVersion < 7)){ $new_qty = $quantity-$item->getQuantity(); $add_points_value = $new_qty * $item->getProduct()->getPointsValue(); if(stPoints::getUnusedUserPoints() >= $add_points_value){ $item->setQuantity($quantity); }else{ if($item->getProduct()->getPointsOnly()){ $error = self::ERR_POINTS; }else{ $item->setQuantity($quantity); stPoints::refreshLoginStatusPoints(); } } }else{ $item->setQuantity($quantity); } } else { return false; } if (false === $error) { $error = $this->validateQuantity($item, $updateQuantity); } $this->clearProductTotals(); return $item; } /** * Usuwa produkt o danym ID z koszyka * * @param integer $id_product ID produktu */ public function removeItem($id) { $item = $this->getItem($id); $themeVersion = sfContext::getInstance()->getController()->getTheme()->getVersion(); if(is_object($item)){ if((stPoints::isItemByPoints($item->getItemId()) && ($themeVersion < 7))){ stPoints::removeItemByPoints($item->getItemId()); $value = stPoints::getLoginStatusPoints() + ($item -> getProduct() -> getPointsValue() * $item -> getQuantity()); stPoints::setLoginStatusPoints($value); } $item->delete(); } $this->clearProductTotals(); } /** * Ustawia rabat na zamówienie * * @param false|null|Discount $discount * @return void */ public function setDiscount($discount) { $this->discount = $discount; $this->clearProductTotals(); } public function getDiscount(): ?Discount { return !empty($this->discount) ? $this->discount : null; } public function hasDiscount() { if (null === $this->discount) { stDiscount::updateBasketDiscount($this); } return $this->discount; } /** * Zwraca wszystkie produkty z koszyka w postaci tablicy modelów BasketProduct * * @return BasketProduct[] */ public function getItems() { if (null === $this->items) { $ids = BasketProductPeer::doSelectProductIds($this->get()); if ($this->getCouponCode()) { stDiscount::updateDiscountCouponCodeProductIds($this->getCouponCode(), $ids); } DiscountPeer::setProductBatchIds($ids); $c = new Criteria(); $c->addAscendingOrderByColumn(BasketProductPeer::ID); $this->items = array(); foreach ($this->get()->getBasketProductsJoinProduct($c) as $item) { $this->items[$item->getItemId()] = $item; } } return $this->items; } public function refresh($item_id = null) { if (null === $item_id) { $coupon_code = $this->getCouponCode(); if (null === $this->get()->getDiscountCouponCode() || !$this->basket->getDiscountCouponCode()->isValid() || stDiscount::isDisabledForWholesale($this->getUser()->getGuardUser())) { $this->setCouponCode(null); } } $this->get()->clearCollBasketProducts(); $this->items = null; foreach ($this->getItems() as $item) { if (!$item->getProduct() || $item_id !== null && $item->getItemId() != $item_id) continue; $product = $item->getProduct(); $tax = $product->getTax(); if (null !== $tax) { $tax->setDeliveryCountry(null); } $ids = array(); $custom_modifiers = array(); $item->updateVatEu(); foreach ($item->getPriceModifiers() as $pm) { if (isset($pm['custom']['type']) && $pm['custom']['type'] == 'product_options' || isset($pm['type']) && $pm['type'] == 'product_options') { $ids[$pm['custom']['id']] = $pm['custom']['id']; } else { $custom_modifiers[] = $pm; } } if ($item->getProduct()->getOptHasOptions() > 1) { $options = $item->getProductOptions(); if ($options) { stNewProductOptions::updateProductBySelectedOptions($product, $options); } else { $item->setProduct(null); } } $this->populateItem($item, $product); if ($custom_modifiers) { foreach ($custom_modifiers as $pm) { if (isset($pm['label'])) { $pm['custom']['label'] = $pm['label']; } $item->addPriceModifier($pm['value'], $pm['type'], $pm['prefix'], $pm['level'], $pm['custom']); } } $this->dispatcher->notify(new sfEvent($this, 'stBasket.refresh', array('item' => $item, 'product' => $item->getProduct()))); } $this->clearProductTotals(); $this->needRefresh(false); } /** * Zwraca produkt o danych ID * * @param integer $id_product ID produktu * @return BasketProduct */ public function getItem($id) { $id = stBasket::generateItemId($id); $items = $this->getItems(); return isset($items[$id]) ? $items[$id] : null; } /** * Zwraca ID klienta * * @return integer */ public function getUserId() { if ($this->user->isAuthenticated()) { return $this->user->getGuardUser()->getId(); } return false; } /** * Zwraca instancje modelu DiscountCouponCode * * @return DiscountCouponCode */ public function getCouponCode() { if (!$this->discountConfig->get('coupon_code')) { return null; } if (null === $this->couponCode) { $this->couponCode = $this->get()->getDiscountCouponCode(); } return $this->couponCode; } public function setCouponCode($v) { $this->get()->setDiscountCouponCode($v); $this->couponCode = $v; } /** * Zwraca użytkownika * * @return stUser */ public function getUser() { return $this->user; } /** * Pobierz laczna sume produktow w koszyku * * @param bool $with_tax Uwzględnij podatek * @param bool $with_currency Uwzględnij walute * @return suma */ public function getTotalAmount($with_tax = false, $with_currency = false, $with_vat_eu = true, $with_discount = true) { $cache_id = $with_tax . '-' . $with_currency . '-' . $with_vat_eu . '-' . $with_discount; if (!isset($this->totalAmount[$cache_id])) { $total_amount = 0; foreach ($this->getItems() as $item) { if ($item->isDeleted()) { continue; } if (!$with_vat_eu) { $item->setVatEu(false); } $total_amount += $item->getTotalAmount($with_tax, $with_currency, $with_discount); if (!empty($this->dispatcher->getListeners('stBasket.filterTotalAmount'))) { $total_amount = $this->dispatcher->filter(new sfEvent($item, 'stBasket.filterTotalAmount', ['with_tax' => $with_tax, 'with_currency' => $with_currency, 'with_discount' => $with_discount, 'with_vat_eu' => $with_vat_eu]), $total_amount)->getReturnValue(); } $item->setVatEu($this->user->hasVatEu() || $this->user->hasVatEx()); } if ($this->hasDiscount()) { $total_amount = $this->getDiscount()->apply($total_amount, $this->user->isAuthenticated() ? $this->user->getGuardUser() : null, $with_currency); } $this->totalAmount[$cache_id] = $total_amount; } return $this->totalAmount[$cache_id]; } /** * Pobierz laczna liczbę produktow w koszyku * * @return integer */ public function getTotalProductQuantity() { if (null === $this->totalQuantity) { $quantity = 0; foreach ($this->getItems() as $item) { $quantity += $item->getQuantity(); } $this->totalQuantity = $quantity; } return $this->totalQuantity; } public function getTotalProductDiscountAmount($with_tax = false, $with_currency = false) { $discount = 0; $total_amount = 0; foreach ($this->getItems() as $item) { // $discount += $item->getTotalDiscountAmount($with_tax, $with_currency); $total_amount += $item->getTotalAmount($with_tax, $with_currency); } if ($this->hasDiscount()) { $discount += $total_amount - $this->getDiscount()->apply($total_amount, $this->user->isAuthenticated() ? $this->user->getGuardUser() : null, $with_currency); } return $discount; } /** * * Pobierz lączną wagę produktów w koszyku * * @return float */ public function getTotalProductWeight() { if (null === $this->totalWeight) { $weight = 0; foreach ($this->getItems() as $item) { $weight += $item->getTotalWeight(); } $this->totalWeight = $weight; } return $this->totalWeight; } public function getTotalProductTaxAmount($with_currency = false, $with_vat_eu = true) { if (!isset($this->totalTaxAmount[$with_currency][$with_vat_eu])) { $total = 0; foreach ($this->getItems() as $item) { if (!$with_vat_eu) { $item->setVatEu(false); } $total += $item->getTotalTaxAmount($with_currency, $with_vat_eu); $item->setVatEu($this->user->hasVatEu() || $this->user->hasVatEx()); } $this->totalTaxAmount[$with_currency][$with_vat_eu] = $total; } return $this->totalTaxAmount[$with_currency][$with_vat_eu]; } /** * Zmniejsza ilość produktu w koszyku. * Jeżeli ilość produktu wynosi jeden, usuwa produkt z koszyka * * @param integer $id_product ID produktu * @param integer $num ilosc odejmowanych sztuk danego produktu - domyslnie 1 */ public function decrease($id_product, $num = 1) { if ($item = $this->getItem($id_product)) { $quantity = $item->getQuantity() - $num; $item->setQuantity($quantity); return $item->getQuantity(); } return false; } /** * Deletes the current shopping cart */ public function clear() { $this->deleteBasket($this->get()); } /** * Clears all items in shopping cart */ public function clearItems() { $themeVersion = sfContext::getInstance()->getController()->getTheme()->getVersion(); foreach ($this->getItems() as $item) { if($item -> getProductForPoints() && $themeVersion < 7){ stPoints::removeItemByPoints($item->getItemId()); } $item->delete(); } self::clearCache(); } /** * Zwraca aktualny koszyk uzytkownika * * @param bool $create_default Określa czy ma tworzyć domyślny koszyk, jeżeli żaden nie był wcześniej koszykiem domyślnym * @return Basket */ public function get($create_default = true) { if (null === $this->basket) { $basket_id = $this->getBasketCookieId(); $user = $this->getUserId(); $authenticated = $this->user->isAuthenticated() && $this->user->getGuardUser()->getIsConfirm(); if ($basket_id || $authenticated) { if ($basket_id) { $this->basket = BasketPeer::retrieveByPK($basket_id); if ($this->basket) { if ($authenticated && !$this->basket->countBasketProducts()) { $this->basket = null; } elseif (null === $this->basket->getSfGuardUserId() && $authenticated) { $this->basket->setSfGuardUserId($user); $this->basket->setIsDefault(true); $this->refresh(); $this->save(); } elseif ($this->basket->getSfGuardUserId() && !$authenticated && $this->needRefresh()) { $this->refresh(); $this->save(); } } else { $this->clearBasketCookieId(); } } if (null === $this->basket && $authenticated) { $c = new Criteria(); $c->add(BasketPeer::IS_DEFAULT, true); $c->add(BasketPeer::SF_GUARD_USER_ID, $user); $this->basket = BasketPeer::doSelectOne($c); if ($this->basket) { $this->setBasketCookieId($this->basket->getId()); } } } if (null === $this->basket && $create_default) { $this->basket = new Basket(); if ($authenticated) { $this->basket->setSfGuardUserId($user); } $this->basket->setIsDefault(true); } } return $this->basket; } public function needRefresh($needed = null) { if (null !== $needed) { $this->getUser()->setAttribute('refreshed', !$needed, self::SESSION_NAMESPACE); } return !$this->getUser()->getAttribute('refreshed', false, self::SESSION_NAMESPACE); } /** * Ustawia domyślny koszyk * * @param mixed $basket Id koszyka lub instancja modelu Basket */ public function set($basket) { if (!is_object($basket)) { $basket = BasketPeer::retrieveByPK($basket); } if ($basket != null) { if ($prev_basket = $this->get(false)) { $prev_basket->setIsDefault(false); $prev_basket->save(); } $basket->setIsDefault(true); $basket->setSfGuardUserId($this->getUserId()); $this->basket = $basket; $this->save(); } } /** * Dodaje nowy koszyk * * @param bool $make_default Określa czy dodany koszyk ma być ustawiony jako domyślny */ public function addBasket($make_default = false) { $new_basket = new Basket(); $new_basket->setSfGuardUserId($this->getUserId()); if ($make_default) { $this->set($new_basket); } else { $new_basket->save(); } } /** * Usuwa koszyk * * @param mixed $basket Id koszyka lub instancja modelu Basket */ public function deleteBasket($basket) { if (!is_object($basket)) { $basket = BasketPeer::retrieveByPK($basket); } if ($this->get()->getId() == $basket->getId()) { $this->basket = null; } $basket->delete(); self::clearCache(); } /** * Koszyk posiada produkty * * @return bool */ public function hasItems() { return (bool) $this->getItems(); } /** * Koszyk jest pusty * * @return bool */ public function isEmpty() { return!$this->hasItems(); } public function getGiftItem() { if (null === $this->giftItem) { $this->giftItem = false; foreach ($this->getItems() as $item) { if ($item->getIsGift()) { $this->giftItem = $item; break; } } } return $this->giftItem; } public function clearProductTotals() { $this->totalQuantity = null; $this->totalWeight = null; $this->totalAmount = array(); $this->totalTaxAmount = array(); stDeliveryFrontend::getInstance($this)->clearBasketTotals(); } /** * * @param Product $product * @return BasketProduct */ protected function populateItem(BasketProduct $item, Product $product) { $item->setProduct(null); $item->setProduct($product); if (!$item->getIsGift()) { $coupon_code = $this->getCouponCode(); $productSetDiscount = $item->getProductSetDiscount(); $item->setDiscount($productSetDiscount ? array('value' => $productSetDiscount->getValueByUser($this->user->isAuthenticated() ? $this->user->getGuardUser() : null), 'type' => $productSetDiscount->getPriceType()) : $product->getDiscount()); if ($coupon_code && stDiscount::isValidDiscountCouponCodeProductIds($coupon_code, $product)) { $discount = stDiscount::calculateCouponCodeDiscount($item, $coupon_code); $item->setDiscount($discount); } } if ($item->isNew()) { // $item->setProduct($product); $item->setItemId(stBasket::generateItemId($product->getId())); } return $item; } /** * * @param BasketProduct $item * @return */ public function validateQuantity(BasketProduct $item, $updateQuantity = false) { $maxQuantity = $this->getMaxQuantityForItem($item); $maxQuantity = $this->dispatcher->filter(new sfEvent($item, 'stBasket.filterMaxQuantity'), $maxQuantity)->getReturnValue(); if ($item->getProduct()->getIsStockValidated() && $item->getQuantity() > $maxQuantity && (!$item->getProductMaxQty() || $maxQuantity <= $item->getProductMaxQty()) || $item->getQuantity() === 0) { if ($updateQuantity) { $item->setQuantity($maxQuantity); } return self::ERR_OUT_OF_STOCK; } if ($item->getProductMaxQty() > 0 && $item->getProductMaxQty() < $item->getQuantity()) { if ($updateQuantity) { $item->setQuantity($item->getProductMaxQty()); } return self::ERR_MAX_QTY; } if ($item->getProductMinQty() > $item->getQuantity()) { if ($updateQuantity) { $item->setQuantity($item->getProductMinQty()); } return self::ERR_MIN_QTY; } return null; } protected function getMaxQuantityForItem($current) { $max_quantity = $current->getMaxQuantity(); if (null === $current->getProductSetDiscountId()) { foreach ($this->getItems() as $item) { if ($item->getProductSetDiscount()) { foreach ($item->getProductSetDiscount()->getProducts() as $product) { if ($current->getProductId() == $product->getId()) { $max_quantity -= $item->getQuantity(); } } } } } return $max_quantity > 0 ? $max_quantity : 0; } protected function setBasketCookieId() { if (!$this->isEmpty()) { $this->getContext()->getResponse()->setCookie('basket', $this->basket->getId(), time() + 14 * 86400, "/"); } $this->getUser()->setAttribute("id", $this->basket->getId(), self::SESSION_NAMESPACE); } protected function clearBasketCookieId() { $this->getContext()->getResponse()->setCookie('basket', null, time() - 3600, "/"); } protected function getBasketCookieId() { $id = $this->getContext()->getRequest()->getCookie('basket'); if (!$id) { $id = $this->getUser()->getAttribute("id", null, self::SESSION_NAMESPACE); } return $id; } public static function generateItemId($id) { if (!is_numeric($id)) { return $id; } $request = sfContext::getInstance()->getRequest(); $product_set_discount = $request->getParameter('product_set_discount'); if ($product_set_discount) { $id .= '-'.$product_set_discount; } if ($request->hasParameter('gift')) { $id .= '-1'; } $ids = $request->getParameter('option_list'); if ($ids) { $id = md5($id.$ids); } $event = stEventDispatcher::getInstance()->filter(new sfEvent(null, 'stBasket.generateItemId'), $id); return $event->getReturnValue(); } public static function cacheId() { return array(session_id()); } public static function clearCache() { } /** * Zwraca łączną cenę produktu (ilosc x cena) * * @param BasketProduct $basket_product Produkt w koszyku * @param bool $with_tax Uwzględnij podatek * @param bool $with_currency Uwzględnij walute * @return float */ public static function getProductTotalAmount($basket_product, $with_tax = false, $with_currency = false) { return $basket_product->getTotalAmount($with_tax, $with_currency); } /** * Weryfikuje czy podany koszyk nalezy do danego uzytkownika * * @param mixed $basket Id koszyka lub instancja modelu Basket * @param sfGuardSecurityUser $user */ public static function validateBasket($basket, $user) { if (!is_object($basket)) { $basket = BasketPeer::retrieveByPK($basket); } if ($guard_user = $user->getGuardUser()) { $guard_user_id = $guard_user->getId(); } else { $guard_user_id = 0; } return isset($basket) && $basket->getUserId() == $guard_user_id; } public static function isEnabled(Product $product) { if ($product->getIsStockValidated()) { return null === $product->getStock() || $product->getStock() >= $product->getMinQty(); } return true; } public static function isHidden(Product $product) { return $product->getConfiguration()->get('hide_basket') || !$product->isPriceVisible(); } protected static function setPointsOnlyProduct($item) { $themeVersion = sfContext::getInstance()->getController()->getTheme()->getVersion(); if($item->getProduct()->getPointsOnly() && $themeVersion < 7){ stPoints::addItemByPoints($item->getItemId()); $item -> setProductForPoints(true); } } }