Отключение правил корзины для товаров со скидкой
Возможна ситуация, когда вы хотите ограничить снижение цены товара запретив использование купонов (правил корзины) для товаров со скидкой. В Prestashop такая возможность не предусмотрена, придется модифицировать код ядра системы. Существует два пути — простой (просто добавить ограничения в файл класса правил корзины CartRule.php), и более сложный, подразумевающий также модификацию интерфейса админки, что бы можно было изменять настройки по каждому правилу корзины отдельно, не прибегая всякий раз к модификации кода.
Рассмотрим второй способ, как более функциональный.
Прежде всего, добавим в шаблон бек офиса опцию для отключения правил корзины для товаров со скидкой. Для этого отредактируем файл <ваш admin-каталог>/themes/default/template/controllers/cart_rules/actions.tpl вставив после строки 116 следующий код:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<div id="apply_discount_to_product_special" class="form-group"> <label class="control-label col-lg-3">{l s='Exclude products on special'}</label> <div class="col-lg-9"> <span class="switch prestashop-switch fixed-width-lg"> <input type="radio" name="reduction_exclude_special" id="reduction_exclude_special_on" value="1" {if $currentTab->getFieldValue($currentObject, 'reduction_exclude_special')|intval}checked="checked"{/if} /> <label class="t" for="reduction_exclude_special_on"> {l s='Yes'} </label> <input type="radio" name="reduction_exclude_special" id="reduction_exclude_special_off" value="0" {if !$currentTab->getFieldValue($currentObject, 'reduction_exclude_special')|intval}checked="checked"{/if} /> <label class="t" for="reduction_exclude_special_off"> {l s='No'} </label> <a class="slide-button btn"></a> </span> </div> </div> |
В вкладке «Действие» в подразделе «Правила корзины» из раздела «Ценовые правила» у нас появится новый переключатель «Exclude products on special» (Если хотите название на русском потом переведите его через «Локализация» — «Переводы» — «Переводы бек-офиса». Это же относится и к другим сообщениям в примере):

Теперь добавим ограничение, чтобы эта опция отображалась только если скидка по купону назначается в процентах. Для этого отредактируем файл <ваш admin-каталог>/themes/default/template/controllers/cart_rules/forms.js
После строки 142 вставим следующий код:
|
1 |
$('#apply_discount_to_product_special').show(400); |
А после строки 151 этот код:
|
1 |
$('#apply_discount_to_product_special').hide(200); |
Далее модифицируем непосредственно файл класса правил корзины classes/CartRule.php
После строки 63 добавим описании новой конфигурационной переменной:
|
1 |
public $reduction_exclude_special; |
И её определение после строки 104:
|
1 |
'reduction_exclude_special' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), |
После этого кода
|
1 2 3 |
if ($cartTotal < $minimum_amount) return (!$display_error) ? false : Tools::displayError('You have not reached the minimum amount required to use this voucher'); } |
добавим проверку случая если все товары в корзине со скидкой:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//check if not only products with specials in the cart if ($this->reduction_exclude_special) { $products = $context->cart->getProducts(); $is_ok = false; foreach ($products as $product) { if (!$product['reduction_applies']) { $is_ok = true; break; } } if(!$is_ok) return (!$display_error) ? false : Tools::displayError('You cannot use this voucher on reduced products'); } |
А после этого:
|
1 2 3 4 5 |
// Do not give a reduction on free products! $order_total = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS, $package_products); foreach ($context->cart->getCartRules(CartRule::FILTER_ACTION_GIFT) as $cart_rule) { $order_total -= Tools::ps_round($cart_rule['obj']->getContextualValue($use_tax, $context, CartRule::FILTER_ACTION_GIFT, $package), _PS_PRICE_COMPUTE_PRECISION_); } |
Добавим функционал запрещения назначения правила корзины на товары со скидкой непосредственно:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//remove products that are on special if ($this->reduction_exclude_special) { foreach ($package_products as $product) { if ($product['reduction_applies']) { if ($use_tax) $order_total -= Tools::ps_round($product['total_wt'],2); else $order_total -= Tools::ps_round($product['total'],2); } } } |
После кода:
|
1 2 3 |
// Discount (%) on a specific product if ($this->reduction_percent && $this->reduction_product > 0) { foreach ($package_products as $product) { |
Удалим код:
|
1 |
if ($product['id_product'] == $this->reduction_product) |
И вставим новый код с проверкой не запрещено ли добавление скидки:
|
1 |
if ($product['id_product'] == $this->reduction_product && (($this->reduction_exclude_special && !$product['reduction_applies']) || !$this->reduction_exclude_special)) |
После кода:
|
1 2 3 4 5 6 7 |
foreach ($all_products as $product) { $price = $product['price']; if ($use_tax) { // since later on we won't be able to know the product the cart rule was applied to, // use average cart VAT for price_wt $price *= (1 + $context->cart->getAverageProductsTaxRate()); } |
Удалим код:
|
1 |
if ($price > 0 && ($minPrice === false || $minPrice > $price)) { |
И вставим новый проверочный код:
|
1 |
if ($price > 0 && ($minPrice === false || $minPrice > $price) && (($this->reduction_exclude_special && !$product['reduction_applies']) || !$this->reduction_exclude_special)) |
И наконец, после кода:
|
1 2 3 |
$selected_products = $this->checkProductRestrictions($context, true); if (is_array($selected_products)) { foreach ($package_products as $product) { |
Удалим код:
|
1 2 |
if (in_array($product['id_product'].'-'.$product['id_product_attribute'], $selected_products) || in_array($product['id_product'].'-0', $selected_products)) |
И вставим измененное условие:
|
1 2 |
if ((in_array($product['id_product'].'-'.$product['id_product_attribute'], $selected_products) || in_array($product['id_product'].'-0', $selected_products)) && (($this->reduction_exclude_special && !$product['reduction_applies']) || !$this->reduction_exclude_special)) |
Теперь только остается модифицировать таблицу в базе данных таблицу ps_cart_rule, чтобы добавить туда поле для сохраения настроек ограничения скидки для каждого правила. Для этого через зайдем в приложение PhpMyAdmin в панели хостинга и выполним следущий SQL-запрос:
|
1 |
ALTER TABLE `ps_cart_rule` ADD `reduction_exclude_special` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `reduction_percent`; |
Как вы поняли, данная модификация запрещает применение купона с процентным снижением цены. Если вы хотите запретить применение купона и для скидки от суммы, модифицируйте код по аналогии.

Добавить комментарий