[-] BO : cart rule with attributes filter and reduction on the selection of products fixed

git-svn-id: http://dev.prestashop.com/svn/v1/branches/1.5.x@13047 b9a71923-0436-4b27-9f14-aed3839534dd
This commit is contained in:
dMetzger
2012-02-06 17:00:47 +00:00
parent 6648b4da8d
commit e22f837ebc
+14 -13
View File
@@ -474,7 +474,7 @@ class CartRuleCore extends ObjectModel
{ {
$eligibleProductsList = array(); $eligibleProductsList = array();
foreach ($context->cart->getProducts() as $product) foreach ($context->cart->getProducts() as $product)
$eligibleProductsList[] = (int)$product['id_product']; $eligibleProductsList[] = (int)$product['id_product'].'-'.(int)$product['id_product_attribute'];
$productRules = $this->getProductRules($id_product_rule_group); $productRules = $this->getProductRules($id_product_rule_group);
foreach ($productRules as $productRule) foreach ($productRules as $productRule)
@@ -483,11 +483,11 @@ class CartRuleCore extends ObjectModel
{ {
case 'attributes': case 'attributes':
$cartAttributes = Db::getInstance()->ExecuteS(' $cartAttributes = Db::getInstance()->ExecuteS('
SELECT cp.quantity, cp.`id_product`, pac.`id_attribute` SELECT cp.quantity, cp.`id_product`, pac.`id_attribute`, cp.`id_product_attribute`
FROM `'._DB_PREFIX_.'cart_product` cp FROM `'._DB_PREFIX_.'cart_product` cp
LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON cp.id_product_attribute = pac.id_product_attribute LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON cp.id_product_attribute = pac.id_product_attribute
WHERE cp.`id_cart` = '.(int)$context->cart->id.' WHERE cp.`id_cart` = '.(int)$context->cart->id.'
AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').') AND cp.`id_product` IN ('.implode(array_map('intval', $eligibleProductsList), ',').')
AND cp.id_product_attribute > 0'); AND cp.id_product_attribute > 0');
$countMatchingProducts = 0; $countMatchingProducts = 0;
$matchingProductsList = array(); $matchingProductsList = array();
@@ -495,7 +495,7 @@ class CartRuleCore extends ObjectModel
if (in_array($cartAttribute['id_attribute'], $productRule['values'])) if (in_array($cartAttribute['id_attribute'], $productRule['values']))
{ {
$countMatchingProducts += $cartAttribute['quantity']; $countMatchingProducts += $cartAttribute['quantity'];
$matchingProductsList[] = $cartAttribute['id_product']; $matchingProductsList[] = $cartAttribute['id_product'].'-'.$cartAttribute['id_product_attribute'];
} }
if ($countMatchingProducts < $productRuleGroup['quantity']) if ($countMatchingProducts < $productRuleGroup['quantity'])
return Tools::displayError('You cannot use this voucher with these products'); return Tools::displayError('You cannot use this voucher with these products');
@@ -506,14 +506,14 @@ class CartRuleCore extends ObjectModel
SELECT cp.quantity, cp.`id_product` SELECT cp.quantity, cp.`id_product`
FROM `'._DB_PREFIX_.'cart_product` cp FROM `'._DB_PREFIX_.'cart_product` cp
WHERE cp.`id_cart` = '.(int)$context->cart->id.' WHERE cp.`id_cart` = '.(int)$context->cart->id.'
AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); AND cp.`id_product` IN ('.implode(array_map('intval', $eligibleProductsList), ',').')');
$countMatchingProducts = 0; $countMatchingProducts = 0;
$matchingProductsList = array(); $matchingProductsList = array();
foreach ($cartProducts as $cartProduct) foreach ($cartProducts as $cartProduct)
if (in_array($cartProduct['id_product'], $productRule['values'])) if (in_array($cartProduct['id_product'], $productRule['values']))
{ {
$countMatchingProducts += $cartProduct['quantity']; $countMatchingProducts += $cartProduct['quantity'];
$matchingProductsList[] = $cartProduct['id_product']; $matchingProductsList[] = $cartProduct['id_product'].'-0';
} }
if ($countMatchingProducts < $productRuleGroup['quantity']) if ($countMatchingProducts < $productRuleGroup['quantity'])
return Tools::displayError('You cannot use this voucher with these products'); return Tools::displayError('You cannot use this voucher with these products');
@@ -525,14 +525,14 @@ class CartRuleCore extends ObjectModel
FROM `'._DB_PREFIX_.'cart_product` cp FROM `'._DB_PREFIX_.'cart_product` cp
LEFT JOIN `'._DB_PREFIX_.'category_product` catp ON cp.id_product = catp.id_product LEFT JOIN `'._DB_PREFIX_.'category_product` catp ON cp.id_product = catp.id_product
WHERE cp.`id_cart` = '.(int)$context->cart->id.' WHERE cp.`id_cart` = '.(int)$context->cart->id.'
AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); AND cp.`id_product` IN ('.implode(array_map('intval', $eligibleProductsList), ',').')');
$countMatchingProducts = 0; $countMatchingProducts = 0;
$matchingProductsList = array(); $matchingProductsList = array();
foreach ($cartCategories as $cartCategory) foreach ($cartCategories as $cartCategory)
if (in_array($cartCategory['id_category'], $productRule['values'])) if (in_array($cartCategory['id_category'], $productRule['values']))
{ {
$countMatchingProducts += $cartCategory['quantity']; $countMatchingProducts += $cartCategory['quantity'];
$matchingProductsList[] = $cartCategory['id_product']; $matchingProductsList[] = $cartCategory['id_product'].'-0';
} }
if ($countMatchingProducts < $productRuleGroup['quantity']) if ($countMatchingProducts < $productRuleGroup['quantity'])
return Tools::displayError('You cannot use this voucher with these products'); return Tools::displayError('You cannot use this voucher with these products');
@@ -544,14 +544,14 @@ class CartRuleCore extends ObjectModel
FROM `'._DB_PREFIX_.'cart_product` cp FROM `'._DB_PREFIX_.'cart_product` cp
LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.id_product = p.id_product LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.id_product = p.id_product
WHERE cp.`id_cart` = '.(int)$context->cart->id.' WHERE cp.`id_cart` = '.(int)$context->cart->id.'
AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); AND cp.`id_product` IN ('.implode(array_map('intval', $eligibleProductsList), ',').')');
$countMatchingProducts = 0; $countMatchingProducts = 0;
$matchingProductsList = array(); $matchingProductsList = array();
foreach ($cartManufacturers as $cartManufacturer) foreach ($cartManufacturers as $cartManufacturer)
if (in_array($cartManufacturer['id_manufacturer'], $productRule['values'])) if (in_array($cartManufacturer['id_manufacturer'], $productRule['values']))
{ {
$countMatchingProducts += $cartManufacturer['quantity']; $countMatchingProducts += $cartManufacturer['quantity'];
$matchingProductsList[] = $cartManufacturer['id_product']; $matchingProductsList[] = $cartManufacturer['id_product'].'-0';
} }
if ($countMatchingProducts < $productRuleGroup['quantity']) if ($countMatchingProducts < $productRuleGroup['quantity'])
return Tools::displayError('You cannot use this voucher with these products'); return Tools::displayError('You cannot use this voucher with these products');
@@ -563,14 +563,14 @@ class CartRuleCore extends ObjectModel
FROM `'._DB_PREFIX_.'cart_product` cp FROM `'._DB_PREFIX_.'cart_product` cp
LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.id_product = p.id_product LEFT JOIN `'._DB_PREFIX_.'product` p ON cp.id_product = p.id_product
WHERE cp.`id_cart` = '.(int)$context->cart->id.' WHERE cp.`id_cart` = '.(int)$context->cart->id.'
AND cp.`id_product` IN ('.implode($eligibleProductsList, ',').')'); AND cp.`id_product` IN ('.implode(array_map('intval', $eligibleProductsList), ',').')');
$countMatchingProducts = 0; $countMatchingProducts = 0;
$matchingProductsList = array(); $matchingProductsList = array();
foreach ($cartSuppliers as $cartSupplier) foreach ($cartSuppliers as $cartSupplier)
if (in_array($cartSupplier['id_supplier'], $productRule['values'])) if (in_array($cartSupplier['id_supplier'], $productRule['values']))
{ {
$countMatchingProducts += $cartSupplier['quantity']; $countMatchingProducts += $cartSupplier['quantity'];
$matchingProductsList[] = $cartSupplier['id_product']; $matchingProductsList[] = $cartSupplier['id_product'].'-0';
} }
if ($countMatchingProducts < $productRuleGroup['quantity']) if ($countMatchingProducts < $productRuleGroup['quantity'])
return Tools::displayError('You cannot use this voucher with these products'); return Tools::displayError('You cannot use this voucher with these products');
@@ -657,7 +657,8 @@ class CartRuleCore extends ObjectModel
$selectedProducts = $this->checkProductRestrictions($context, true); $selectedProducts = $this->checkProductRestrictions($context, true);
if (is_array($selectedProducts)) if (is_array($selectedProducts))
foreach ($context->cart->getProducts() as $product) foreach ($context->cart->getProducts() as $product)
if (in_array($product['id_product'], $selectedProducts)) if (in_array($product['id_product'].'-'.$product['id_product_attribute'], $selectedProducts)
|| in_array($product['id_product'].'-0', $selectedProducts))
{ {
$price = ($useTax ? $product['price_wt'] : $product['price']); $price = ($useTax ? $product['price_wt'] : $product['price']);
$selectedProductsReduction += $price * $product['cart_quantity']; $selectedProductsReduction += $price * $product['cart_quantity'];