diff --git a/classes/Cart.php b/classes/Cart.php
index 52ed4000d..dbb7870a4 100644
--- a/classes/Cart.php
+++ b/classes/Cart.php
@@ -828,7 +828,7 @@ class CartCore extends ObjectModel
*/
public function deleteDiscount($id_discount)
{
- return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_discount` WHERE `id_discount` = '.(int)($id_discount).' AND `id_cart` = '.(int)($this->id).' LIMIT 1');
+ return Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_discount` WHERE `id_discount` = '.(int)$id_discount.' AND `id_cart` = '.(int)$this->id.' LIMIT 1');
}
/**
@@ -845,21 +845,21 @@ class CartCore extends ObjectModel
unset(self::$_nbProducts[$this->id]);
if (isset(self::$_totalWeight[$this->id]))
unset(self::$_totalWeight[$this->id]);
- if ((int)($id_customization))
+ if ((int)$id_customization)
{
- $productTotalQuantity = (int)(Db::getInstance()->getValue('SELECT `quantity`
+ $productTotalQuantity = (int)Db::getInstance()->getValue('SELECT `quantity`
FROM `'._DB_PREFIX_.'cart_product`
- WHERE `id_product` = '.(int)($id_product).' AND `id_product_attribute` = '.(int)($id_product_attribute)));
- $customizationQuantity = (int)(Db::getInstance()->getValue('SELECT `quantity`
+ WHERE `id_product` = '.(int)$id_product.' AND `id_product_attribute` = '.(int)$id_product_attribute);
+ $customizationQuantity = (int)Db::getInstance()->getValue('SELECT `quantity`
FROM `'._DB_PREFIX_.'customization`
- WHERE `id_cart` = '.(int)($this->id).'
- AND `id_product` = '.(int)($id_product).'
- AND `id_product_attribute` = '.(int)($id_product_attribute)));
- if (!$this->_deleteCustomization((int)($id_customization), (int)($id_product), (int)($id_product_attribute)))
+ WHERE `id_cart` = '.(int)$this->id.'
+ AND `id_product` = '.(int)$id_product.'
+ AND `id_product_attribute` = '.(int)$id_product_attribute);
+ if (!$this->_deleteCustomization((int)$id_customization, (int)$id_product, (int)$id_product_attribute))
return false;
// refresh cache of self::_products
$this->_products = $this->getProducts(true);
- return ($customizationQuantity == $productTotalQuantity AND $this->deleteProduct((int)($id_product), $id_product_attribute, NULL));
+ return ($customizationQuantity == $productTotalQuantity && $this->deleteProduct((int)$id_product, $id_product_attribute, null));
}
/* Get customization quantity */
@@ -882,7 +882,7 @@ class CartCore extends ObjectModel
($id_product_attribute != NULL ? ' AND `id_product_attribute` = '.(int)($id_product_attribute) : ''));
/* Product deletion */
- if (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)($id_product).($id_product_attribute != NULL ? ' AND `id_product_attribute` = '.(int)($id_product_attribute) : '').' AND `id_cart` = '.(int)($this->id)))
+ if (Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'cart_product` WHERE `id_product` = '.(int)($id_product).(!is_null($id_product_attribute) ? ' AND `id_product_attribute` = '.(int)($id_product_attribute) : '').' AND `id_cart` = '.(int)($this->id)))
{
// refresh cache of self::_products
$this->_products = $this->getProducts(true);
@@ -906,7 +906,7 @@ class CartCore extends ObjectModel
FROM `'._DB_PREFIX_.'customization`
WHERE `id_customization` = '.(int)($id_customization));
- if ($customization and sizeof($customization))
+ if ($customization)
{
$custData = Db::getInstance()->getRow('SELECT *
FROM `'._DB_PREFIX_.'customized_data`
@@ -940,7 +940,7 @@ class CartCore extends ObjectModel
public static function getTotalCart($id_cart, $use_tax_display = false)
{
- $cart = new Cart((int)($id_cart));
+ $cart = new Cart($id_cart);
if (!Validate::isLoadedObject($cart))
die(Tools::displayError());
$with_taxes = $use_tax_display ? $cart->_taxCalculationMethod != PS_TAX_EXC : true;
@@ -973,7 +973,7 @@ class CartCore extends ObjectModel
{
if (!$this->id)
return 0;
- $type = (int)($type);
+ $type = (int)$type;
if (!in_array($type, array(Cart::ONLY_PRODUCTS, Cart::ONLY_DISCOUNTS, Cart::BOTH, Cart::BOTH_WITHOUT_SHIPPING, Cart::ONLY_SHIPPING, Cart::ONLY_WRAPPING, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING)))
die(Tools::displayError());
@@ -1027,11 +1027,11 @@ class CartCore extends ObjectModel
$wrapping_fees = 0;
if ($this->gift)
{
- $wrapping_fees = (float)(Configuration::get('PS_GIFT_WRAPPING_PRICE'));
+ $wrapping_fees = (float)Configuration::get('PS_GIFT_WRAPPING_PRICE');
if ($withTaxes)
{
- $wrapping_fees_tax = new Tax((int)(Configuration::get('PS_GIFT_WRAPPING_TAX')));
- $wrapping_fees *= 1 + (((float)($wrapping_fees_tax->rate) / 100));
+ $wrapping_fees_tax = new Tax(Configuration::get('PS_GIFT_WRAPPING_TAX'));
+ $wrapping_fees *= 1 + ((float)$wrapping_fees_tax->rate / 100);
}
$wrapping_fees = Tools::convertPrice(Tools::ps_round($wrapping_fees, 2), Currency::getCurrencyInstance((int)($this->id_currency)));
}
diff --git a/classes/Controller.php b/classes/Controller.php
index ef759255b..f43654f1b 100644
--- a/classes/Controller.php
+++ b/classes/Controller.php
@@ -111,7 +111,7 @@ abstract class ControllerCore
public function run()
{
$this->init();
-
+
if ($this->ajax && method_exists($this, 'ajaxProcess'))
$this->ajaxProcess();
else
diff --git a/classes/Cookie.php b/classes/Cookie.php
index 6cc724081..1baf0eb53 100644
--- a/classes/Cookie.php
+++ b/classes/Cookie.php
@@ -1,6 +1,6 @@
_cipherTool = new Blowfish($this->_key, $this->_iv);
$this->update();
}
-
+
protected function getDomain()
{
$r = '!(?:(\w+)://)?(?:(\w+)\:(\w+)@)?([^/:]+)?(?:\:(\d*))?([^#?]+)?(?:\?([^#]+))?(?:#(.+$))?!i';
preg_match ($r, Tools::getHttpHost(false, false), $out);
- if (preg_match('/^(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]{1}[0-9]|[1-9]).)'.
- '{1}((25[0-5]|2[0-4][0-9]|[1]{1}[0-9]{2}|[1-9]{1}[0-9]|[0-9]).)'.
+ if (preg_match('/^(((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]{1}[0-9]|[1-9]).)'.
+ '{1}((25[0-5]|2[0-4][0-9]|[1]{1}[0-9]{2}|[1-9]{1}[0-9]|[0-9]).)'.
'{2}((25[0-5]|2[0-4][0-9]|[1]{1}[0-9]{2}|[1-9]{1}[0-9]|[0-9]){1}))$/', $out[4]))
return false;
if (!strstr(Tools::getHttpHost(false, false), '.'))
@@ -176,7 +176,7 @@ class CookieCore
Tools::displayAsDeprecated();
if (!$withGuest AND $this->is_guest == 1)
return false;
-
+
/* Customer is valid only if it can be load and if cookie password is the same as database one */
if ($this->logged == 1 AND $this->id_customer AND Validate::isUnsignedId($this->id_customer) AND Customer::checkPassword((int)($this->id_customer), $this->passwd))
return true;
@@ -235,7 +235,7 @@ class CookieCore
$this->_modified = true;
$this->write();
}
-
+
function makeNewLog()
{
unset($this->_content['id_customer']);
@@ -272,17 +272,17 @@ class CookieCore
/* Check if cookie has not been modified */
if (!isset($this->_content['checksum']) OR $this->_content['checksum'] != $checksum)
$this->logout();
-
+
if (!isset($this->_content['date_add']))
$this->_content['date_add'] = date('Y-m-d H:i:s');
}
else
$this->_content['date_add'] = date('Y-m-d H:i:s');
-
+
//checks if the language exists, if not choose the default language
if (!Language::getLanguage((int)$this->id_lang))
$this->id_lang = Configuration::get('PS_LANG_DEFAULT');
-
+
}
/**
@@ -350,11 +350,21 @@ class CookieCore
}
/**
- *
* @return String name of cookie
*/
public function getName()
{
return $this->_name;
}
+
+ /**
+ * Check if the cookie exists
+ *
+ * @since 1.5.0
+ * @return bool
+ */
+ public function exists()
+ {
+ return isset($_COOKIE[$this->_name]);
+ }
}
diff --git a/classes/FrontController.php b/classes/FrontController.php
index 23454db7b..76059f509 100755
--- a/classes/FrontController.php
+++ b/classes/FrontController.php
@@ -662,6 +662,17 @@ class FrontControllerCore extends Controller
return $allowed;
}
+ /**
+ * Check if token is valid
+ *
+ * @since 1.5.0
+ * @return bool
+ */
+ public function isTokenValid()
+ {
+ return Configuration::get('PS_TOKEN_ENABLE') && strcasecmp(Tools::getToken(false), Tools::getValue('token')) && $this->context->customer->isLogged();
+ }
+
/**
* Add one or several CSS for front, checking if css files are overriden in theme/css/modules/ directory
*
diff --git a/controllers/front/AddressController.php b/controllers/front/AddressController.php
index d41bcb48b..daf1331eb 100644
--- a/controllers/front/AddressController.php
+++ b/controllers/front/AddressController.php
@@ -131,7 +131,7 @@ class AddressControllerCore extends FrontController
$address->id_customer = (int)$this->context->customer->id;
// Check page token
- if (Configuration::get('PS_TOKEN_ENABLE') == 1 && strcmp(Tools::getToken(false), Tools::getValue('token')) && $this->context->customer->isLogged(true))
+ if ($this->isTokenValid())
$this->errors[] = Tools::displayError('Invalid token');
// Check phone
@@ -361,7 +361,7 @@ class AddressControllerCore extends FrontController
$vat_display = 0;
$this->context->smarty->assign(array(
- 'vatnumber_ajax_call' => (int)file_exists(_PS_MODULE_DIR_.'vatnumber/ajax.php'),
+ 'vatnumber_ajax_call' => file_exists(_PS_MODULE_DIR_.'vatnumber/ajax.php'),
'vat_display' => $vat_display,
));
}
diff --git a/controllers/front/CartController.php b/controllers/front/CartController.php
index 74524e77d..6dc3e89ad 100644
--- a/controllers/front/CartController.php
+++ b/controllers/front/CartController.php
@@ -29,221 +29,235 @@ class CartControllerCore extends FrontController
{
public $php_self = 'cart';
- // This is not a public page, so the canonical redirection is disabled
- public function canonicalRedirection($canonicalURL = ''){}
+ protected $id_product;
+ protected $id_product_attribute;
+ protected $customization_id;
+ protected $qty;
- public function ajaxProcess()
+ /**
+ * This is not a public page, so the canonical redirection is disabled
+ */
+ public function canonicalRedirection($canonicalURL = '')
{
+ }
+
+ /**
+ * Initialize cart controller
+ * @see FrontController::init()
+ */
+ public function init()
+ {
+ parent::init();
+
+ // Get page main parameters
+ $this->id_product = (int)Tools::getValue('id_product', null);
+ $this->id_product_attribute = (int)Tools::getValue('id_product_attribute', Tools::getValue('ipa'));
+ $this->customization_id = (int)Tools::getValue('id_customization');
+ $this->qty = abs(Tools::getValue('qty', 1));
+ }
+
+ public function postProcess()
+ {
+ // Check cart discounts
+ $this->processRemoveDiscounts();
+
+ if ($this->isTokenValid())
+ $this->errors[] = Tools::displayError('Invalid token');
+
+ // Update the cart ONLY if $this->cookies are available, in order to avoid ghost carts created by bots
+ if ($this->context->cookie->exists() && !$this->errors)
+ {
+ if (Tools::getIsset('add') || Tools::getIsset('update'))
+ $this->processChangeProductInCart();
+ else if (Tools::getIsset('delete'))
+ $this->processDeleteProductInCart();
+
+ $this->processRemoveDiscounts();
+
+ // Make redirection
+ if (!$this->errors && !$this->ajax)
+ {
+ $queryString = Tools::safeOutput(Tools::getValue('query', null));
+ if ($queryString && !Configuration::get('PS_CART_REDIRECT'))
+ Tools::redirect('index.php?controller=search&search='.$queryString);
+
+ // Redirect to previous page
+ if (isset($_SERVER['HTTP_REFERER']))
+ {
+ preg_match('!http(s?)://(.*)/(.*)!', $_SERVER['HTTP_REFERER'], $regs);
+ if (isset($regs[3]) && !Configuration::get('PS_CART_REDIRECT'))
+ Tools::redirect($_SERVER['HTTP_REFERER']);
+ }
+
+ Tools::redirect('index.php?controller=order&'.(isset($this->id_product) ? 'ipa='.$this->id_product : ''));
+ }
+ }
+ }
+
+ /**
+ * This process delete a product from the cart
+ */
+ protected function processDeleteProductInCart()
+ {
+ if ($this->context->cart->deleteProduct($this->id_product, $this->id_product_attribute, $this->customization_id))
+ if (!Cart::getNbProducts((int)($this->context->cart->id)))
+ {
+ $this->context->cart->id_carrier = 0;
+ $this->context->cart->gift = 0;
+ $this->context->cart->gift_message = '';
+ $this->context->cart->update();
+ }
+ }
+
+ /**
+ * This process add or update a product in the cart
+ */
+ protected function processChangeProductInCart()
+ {
+ $mode = (Tools::getIsset('update') && $this->id_product) ? 'update' : 'add';
+
+ if ($this->qty == 0)
+ $this->errors[] = Tools::displayError('Null quantity');
+ else if (!$this->id_product)
+ $this->errors[] = Tools::displayError('Product not found');
+
+ $product = new Product($this->id_product, true, $this->context->language->id);
+ if (!$product->id || !$product->active)
+ {
+ $this->errors[] = Tools::displayError('Product is no longer available.', false);
+ return;
+ }
+
+ // Check product quantity availability
+ if ($this->id_product_attribute)
+ {
+ if (!Product::isAvailableWhenOutOfStock($product->out_of_stock) && !Attribute::checkAttributeQty($this->id_product_attribute, $this->qty))
+ $this->errors[] = Tools::displayError('There is not enough product in stock.');
+ }
+ else if ($product->hasAttributes())
+ {
+ $minimumQuantity = ($product->out_of_stock == 2) ? !Configuration::get('PS_ORDER_OUT_OF_STOCK') : !$product->out_of_stock;
+ $this->id_product_attribute = Product::getDefaultAttribute($product->id, $minimumQuantity);
+ // @todo do something better than a redirect admin !!
+ if (!$this->id_product_attribute)
+ Tools::redirectAdmin($this->context->link->getProductLink($product));
+ else if (!Product::isAvailableWhenOutOfStock($product->out_of_stock) && !Attribute::checkAttributeQty($this->id_product_attribute, $this->qty))
+ $this->errors[] = Tools::displayError('There is not enough product in stock.');
+ }
+ else if (!$product->checkQty($this->qty))
+ $this->errors[] = Tools::displayError('There is not enough product in stock.');
+
+ // Check vouchers compatibility
+ if ($mode == 'add' && (($product->specificPrice && (float)$product->specificPrice['reduction']) || $product->on_sale))
+ {
+ $discounts = $this->context->cart->getDiscounts();
+ $hasUndiscountedProduct = null;
+ foreach ($discounts as $discount)
+ {
+ if (is_null($hasUndiscountedProduct))
+ {
+ $hasUndiscountedProduct = false;
+ foreach ($this->context->cart->getProducts() as $product)
+ if ($product['reduction_applies'] === false)
+ {
+ $hasUndiscountedProduct = true;
+ break;
+ }
+ }
+ if (!$discount['cumulable_reduction'] && ($discount['id_discount_type'] != Discount::PERCENT || !$hasUndiscountedProduct))
+ $this->errors[] = Tools::displayError('Cannot add this product because current voucher does not allow additional discounts.');
+
+ }
+ }
+
+ // If no errors, process product addition
+ if (!$this->errors && $mode == 'add')
+ {
+ // Add cart if no cart found
+ if (!$this->context->cart->id)
+ {
+ $this->context->cart->add();
+ if ($this->context->cart->id)
+ $this->context->cookie->id_cart = (int)$this->context->cart->id;
+ }
+
+ // Check customizable fields
+ if (!$product->hasAllRequiredCustomizableFields() && !$this->customization_id)
+ $this->errors[] = Tools::displayError('Please fill in all required fields, then save the customization.');
+
+ if (!$this->errors)
+ {
+ $updateQuantity = $this->context->cart->updateQty($this->qty, $this->id_product, $this->id_product_attribute, $this->customization_id, Tools::getValue('op', 'up'));
+ if ($updateQuantity < 0)
+ {
+ // If product has attribute, minimal quantity is set with minimal quantity of attribute
+ $minimal_quantity = ($this->id_product_attribute) ? Attribute::getAttributeMinimalQty($this->id_product_attribute) : $product->minimal_quantity;
+ $this->errors[] = Tools::displayError('You must add').' '.$minimal_quantity.' '.Tools::displayError('Minimum quantity');
+ }
+ else if (!$updateQuantity)
+ $this->errors[] = Tools::displayError('You already have the maximum quantity available for this product.');
+ }
+ }
+ }
+
+ /**
+ * Remove discounts on cart
+ */
+ protected function processRemoveDiscounts()
+ {
+ $orderTotal = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS);
+ $cartProducts = $this->context->cart->getProducts();
+ foreach ($this->context->cart->getDiscounts() as $discount)
+ {
+ $discountObj = new Discount($discount['id_discount'], $this->context->language->id);
+ if ($error = $this->context->cart->checkDiscountValidity($discountObj, $discounts, $orderTotal, $cartProducts, false))
+ {
+ $this->context->cart->deleteDiscount($discount['id_discount']);
+ $this->context->cart->update();
+ $this->errors[] = $error;
+ }
+ }
+ }
+
+ /**
+ * @see FrontController::initContent()
+ */
+ public function initContent()
+ {
+ $this->setTemplate(_PS_THEME_DIR_.'errors.tpl');
+ }
+
+ /**
+ * Display ajax content (this function is called instead of classic display, in ajax mode)
+ */
+ public function displayAjax()
+ {
+ if ($this->errors)
+ die(Tools::jsonEncode(array('hasError' => true, $this->errors)));
+
if (Tools::getIsset('summary'))
{
if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1)
{
- if (Validate::isLoadedObject($this->context->customer))
- $groups = $this->context->customer->getGroups();
- else
- $groups = array(1);
+ $groups = (Validate::isLoadedObject($this->context->customer)) ? $this->context->customer->getGroups() : array(1);
if ($this->context->cart->id_address_delivery)
$deliveryAddress = new Address($this->context->cart->id_address_delivery);
- $result = array('carriers' => Carrier::getCarriersForOrder(Country::getIdZone((isset($deliveryAddress) AND (int)$deliveryAddress->id) ? (int)$deliveryAddress->id_country : (int)Configuration::get('PS_COUNTRY_DEFAULT')), $groups));
+ $id_country = (isset($deliveryAddress) && $deliveryAddress->id) ? $deliveryAddress->id_country : Configuration::get('PS_COUNTRY_DEFAULT');
+ $result = array('carriers' => Carrier::getCarriersForOrder(Country::getIdZone($id_country), $groups));
}
$result['summary'] = $this->context->cart->getSummaryDetails();
$result['customizedDatas'] = Product::getAllCustomizedDatas($this->context->cart->id, null, true);
$result['HOOK_SHOPPING_CART'] = Module::hookExec('shoppingCart', $result['summary']);
$result['HOOK_SHOPPING_CART_EXTRA'] = Module::hookExec('shoppingCartExtra', $result['summary']);
+
// Display reduced price (or not) without quantity discount
if (Tools::getIsset('getproductprice'))
foreach ($result['summary']['products'] as $key => &$product)
$product['price_without_quantity_discount'] = Product::getPriceStatic($product['id_product'], !Product::getTaxCalculationMethod(), $product['id_product_attribute']);
die(Tools::jsonEncode($result));
}
- else
- $this->includeCartModule();
- }
-
- public function includeCartModule()
- {
- require_once(_PS_MODULE_DIR_.'/blockcart/blockcart-ajax.php');
- }
-
-
-
- public function init()
- {
- parent::init();
-
- $orderTotal = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS);
- $this->cartDiscounts = $this->context->cart->getDiscounts();
- foreach ($this->cartDiscounts AS $k => $this->cartDiscount)
- if ($error = $this->context->cart->checkDiscountValidity(new Discount((int)($this->cartDiscount['id_discount'])), $this->cartDiscounts, $orderTotal, $this->context->cart->getProducts(), false))
- $this->context->cart->deleteDiscount((int)($this->cartDiscount['id_discount']));
-
- $add = Tools::getIsset('add') ? 1 : 0;
- $delete = Tools::getIsset('delete') ? 1 : 0;
-
- if (Configuration::get('PS_TOKEN_ENABLE') == 1 &&
- strcasecmp(Tools::getToken(false), strval(Tools::getValue('token'))) &&
- $this->context->customer->isLogged() === true)
- $this->errors[] = Tools::displayError('Invalid token');
-
- // Update the cart ONLY if $this->cookies are available, in order to avoid ghost carts created by bots
- if (($add OR Tools::getIsset('update') OR $delete) AND isset($_COOKIE[$this->context->cookie->getName()]))
- {
- //get the values
- $idProduct = (int)(Tools::getValue('id_product', NULL));
- $idProductAttribute = (int)(Tools::getValue('id_product_attribute', Tools::getValue('ipa')));
- $customizationId = (int)(Tools::getValue('id_customization', 0));
- $qty = (int)(abs(Tools::getValue('qty', 1)));
- if ($qty == 0)
- $this->errors[] = Tools::displayError('Null quantity');
- elseif (!$idProduct)
- $this->errors[] = Tools::displayError('Product not found');
- else
- {
- $producToAdd = new Product($idProduct, true, $this->context->language->id);
- if ((!$producToAdd->id OR !$producToAdd->active) AND !$delete)
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('Product is no longer available.', false).'"]}');
- else
- $this->errors[] = Tools::displayError('Product is no longer available.', false);
- else
- {
- /* Check the quantity availability */
- if ($idProductAttribute AND is_numeric($idProductAttribute))
- {
- if (!$delete AND !Product::isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty((int)$idProductAttribute, (int)$qty))
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('There is not enough product in stock.', false).'"]}');
- else
- $this->errors[] = Tools::displayError('There is not enough product in stock.');
- }
- elseif ($producToAdd->hasAttributes() AND !$delete)
- {
- $idProductAttribute = Product::getDefaultAttribute((int)$producToAdd->id, (int)$producToAdd->out_of_stock == 2 ? !(int)Configuration::get('PS_ORDER_OUT_OF_STOCK') : !(int)$producToAdd->out_of_stock);
- if (!$idProductAttribute)
- Tools::redirectAdmin($this->context->link->getProductLink($producToAdd));
- elseif (!$delete AND !Product::isAvailableWhenOutOfStock($producToAdd->out_of_stock) AND !Attribute::checkAttributeQty((int)$idProductAttribute, (int)$qty))
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('There is not enough product in stock.', false).'"]}');
- else
- $this->errors[] = Tools::displayError('There is not enough product in stock.');
- }
- elseif (!$delete AND !$producToAdd->checkQty((int)$qty))
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('There is not enough product in stock.').'"]}');
- else
- $this->errors[] = Tools::displayError('There is not enough product in stock.');
- /* Check vouchers compatibility */
- if ($add AND (($producToAdd->specificPrice AND (float)($producToAdd->specificPrice['reduction'])) OR $producToAdd->on_sale))
- {
- $discounts = $this->context->cart->getDiscounts();
- $hasUndiscountedProduct = null;
- foreach($discounts as $discount)
- {
- if(is_null($hasUndiscountedProduct))
- {
- $hasUndiscountedProduct = false;
- foreach($this->context->cart->getProducts() as $product)
- if($product['reduction_applies'] === false)
- {
- $hasUndiscountedProduct = true;
- break;
- }
- }
- if (!$discount['cumulable_reduction'] && ($discount['id_discount_type'] != Discount::PERCENT || !$hasUndiscountedProduct))
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('Cannot add this product because current voucher does not allow additional discounts.').'"]}');
- else
- $this->errors[] = Tools::displayError('Cannot add this product because current voucher does not allow additional discounts.');
-
- }
- }
- if (!sizeof($this->errors))
- {
- if ($add AND $qty >= 0)
- {
- /* Product addition to the cart */
- if (!$this->context->cart->id)
- {
- $this->context->cart->add();
- if ($this->context->cart->id)
- $this->context->cookie->id_cart = (int)$this->context->cart->id;
- }
-
- if ($add AND !$producToAdd->hasAllRequiredCustomizableFields() AND !$customizationId)
- $this->errors[] = Tools::displayError('Please fill in all required fields, then save the customization.');
- if (!sizeof($this->errors))
- {
- $updateQuantity = $this->context->cart->updateQty($qty, $idProduct, $idProductAttribute, $customizationId, Tools::getValue('op', 'up'));
-
- if ($updateQuantity < 0)
- {
- /* if product has attribute, minimal quantity is set with minimal quantity of attribute*/
- if ((int)$idProductAttribute)
- $minimal_quantity = Attribute::getAttributeMinimalQty($idProductAttribute);
- else
- $minimal_quantity = $producToAdd->minimal_quantity;
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('You must add', false).' '.$minimal_quantity.' '.Tools::displayError('Minimum quantity', false).'"]}');
- else
- $this->errors[] = Tools::displayError('You must add').' '.$minimal_quantity.' '.Tools::displayError('Minimum quantity')
- .((isset($_SERVER['HTTP_REFERER']) AND basename($_SERVER['HTTP_REFERER']) == 'order.php' OR (!Tools::isSubmit('ajax') AND substr(basename($_SERVER['REQUEST_URI']),0, strlen('cart.php')) == 'cart.php')) ? ('
- '.
- Tools::displayError('You will be redirected to your cart in a few seconds.')) : '');
- }
- elseif (!$updateQuantity)
- {
- if (Tools::getValue('ajax') == 'true')
- die('{"hasError" : true, "errors" : ["'.Tools::displayError('You already have the maximum quantity available for this product.', false).'"]}');
- else
- $this->errors[] = Tools::displayError('You already have the maximum quantity available for this product.')
- .((isset($_SERVER['HTTP_REFERER']) AND basename($_SERVER['HTTP_REFERER']) == 'order.php' OR (!Tools::isSubmit('ajax') AND substr(basename($_SERVER['REQUEST_URI']),0, strlen('cart.php')) == 'cart.php')) ? ('
- '.
- Tools::displayError('You will be redirected to your cart in a few seconds.')) : '');
- }
- }
- }
- elseif ($delete)
- {
- if ($this->context->cart->deleteProduct($idProduct, $idProductAttribute, $customizationId))
- if (!Cart::getNbProducts((int)($this->context->cart->id)))
- {
- $this->context->cart->id_carrier = 0;
- $this->context->cart->gift = 0;
- $this->context->cart->gift_message = '';
- $this->context->cart->update();
- }
- }
- }
- $discounts = $this->context->cart->getDiscounts();
- foreach($discounts AS $discount)
- {
- $discountObj = new Discount($discount['id_discount'], $this->context->language->id);
-
- if ($error = $this->context->cart->checkDiscountValidity($discountObj, $discounts, $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS), $this->context->cart->getProducts(), false))
- {
- $this->context->cart->deleteDiscount((int)($discount['id_discount']));
- $this->context->cart->update();
- $errors[] = $error;
- }
- }
- if (!sizeof($this->errors))
- {
- $queryString = Tools::safeOutput(Tools::getValue('query', NULL));
- if ($queryString AND !Configuration::get('PS_CART_REDIRECT'))
- Tools::redirect('index.php?controller=search&search='.$queryString);
- if (isset($_SERVER['HTTP_REFERER']))
- {
- // Redirect to previous page
- preg_match('!http(s?)://(.*)/(.*)!', $_SERVER['HTTP_REFERER'], $regs);
- if (isset($regs[3]) AND !Configuration::get('PS_CART_REDIRECT') AND Tools::getValue('ajax') != 'true')
- Tools::redirect($_SERVER['HTTP_REFERER']);
- }
- }
- }
- if (Tools::getValue('ajax') != 'true' AND !sizeof($this->errors))
- Tools::redirect('index.php?controller=order&'.(isset($idProduct) ? 'ipa='.(int)($idProduct) : ''));
-
- }
- }
-
- $this->setTemplate(_PS_THEME_DIR_.'errors.tpl');
+ // @todo create a hook
+ else if (file_exists(_PS_MODULE_DIR_.'/blockcart/blockcart-ajax.php'))
+ require_once(_PS_MODULE_DIR_.'/blockcart/blockcart-ajax.php');
}
}