В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне корзины на 1С-Битрикс.
В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне корзины на 1С-Битрикс. Не "прибитую гвоздями" в шаблоне компонента, а управляемую через параметры компонента.
Работать будет так: Если сумма в корзине меньше минимальной - то кнопка "Оформить заказ" не показывается, вместо нее уведомление. Как только сумма превышает минимальную - кнопка появляется. Все работает на лету, без перезагрузки страницы. Как-то так:

Добавляем параметр в корзину
Для начала скопируем шаблон корзины в шаблон своего сайта. В моем случае получился путь: /local/templates/ШАБЛОН_САЙТА/components/bitrix/sale.basket.basket/basket
Открываем, в шаблоне, файл .parameters.php и в массив параметров arTemplateParameters добавляем:
$arTemplateParameters['MIN_SUMM'] = array(
'PARENT' => 'BASE',
'NAME' => "Минимальная сумма",
'TYPE' => 'STRING',
'DEFAULT' => '0'
);
PS: в 'NAME' можно добавить и прописать сообщение из lang файла GetMessage('MIN_SUMM'), прописал прямо в файл для простоты объяснения.
После этого, в настройках компонента появится поле для указания минимальной суммы:

Добавляем параметр в AJAX обработчик
Теперь, нужно добавить вывод этого параметра в шаблон. Для этого открываем файл (в шаблоне корзины) mutator.php. В этом файле собран массив с данными для вывода в представление. Обращение к этому файлу происходит при каждом запросе и массив отрабатывает на лету (AJAX). Файл фомирует результат для шаблонизатора mustashe
Находим формирование массива $totalData - примерно на 310-ой строчке. Нужно добавить:
//До формирования массива
$minSummOrder = $this->arParams['MIN_SUMM'];
if ($result['allSum'] < (int)$minSummOrder) {
$minSummMustache = $minSummOrder;
}
//В конец массива ключ MIN_SUMM
'MIN_SUMM' => $minSummMustache
Для наглядности картинка: здесь мы проверили меньше ли сумма товаров, минимальной суммы и создали переменную для добавления в массив ключа 'MIN_SUMM'

На картинке опечатка: не правильно оформлен int - в примере кода все правильно
Выводим параметр пользователям
И осталось вывести и обработать этот параметр для пользователей. Открываем файл шаблон_корзины/js-templates/basket-total.php он отвечает за формирование и вывод низа корзины: где поле купона, итоговая сумма и кнопка перехода к оформлению.
Находим строчку, в которой прописана кнопка перехода к оформлению (примерно, строка 75) и заворачиваем в условие.
{{#MIN_SUMM}}
<div class="minimal_summ">
Минимальная сумма заказа {{{MIN_SUMM}}} руб.
</div>
{{/MIN_SUMM}}
{{^MIN_SUMM}}
<button data-entity="basket-checkout-button">
<?=Loc::getMessage('SBB_ORDER')?>
</button>
{{/MIN_SUMM}}
Здесь мы проверили: если из файла mutator.php пришло значение для MIN_SUMM убираем кнопку перехода к оформлению, но выводим оповещение.
Минимальная сумма в оформлении заказа
Особо хитрые пользователи могут проигнорировать этот функционал и просто перейти на страницу оформления (если знают ссылку). Что бы обезопасить и оформление заказа, можно также проверять минимальную сумму и перенаправлять в корзину.
Как реализовать, смотрите в видео.
В видео не учел важный момент. После оформления заказа не покажется результат из файла confirm.php, так как сумма заказа станет 0 - и сработает условие с редиректом. Что бы этого избежать, нужно обвернуть условие проверки и редирект в условие:
if (!$request->get('ORDER_ID') <> '') {
if ($arParams['MIN_SUMM'] > $arResult['JS_DATA']['TOTAL']['PRICE_WITHOUT_DISCOUNT_VALUE']) {
LocalRedirect($arParams['PATH_TO_BASKET']);
}
}

Цитата |
---|
Александр написал: а с оформлением заказа как быть? /personal/order/make/ |
if ($arParams['MIN_SUMM'] < $arResult['JS_DATA']['TOTAL']['PRICE_WITHOUT_DISCOUNT_VALUE']) {
header('Location:'.$arParams['PATH_TO_BASKET']);
}
в sale.order.ajax и нажатия на кнопку "Оформить заказ" идет переброска на страницу с корзиной, которая пустая, хотя по по плану должна была быть страница с инф. о заказе и оплатой...
В чем может быть причина такой ошибки?

Цитата |
---|
Гость написал: в sale.order.ajax и нажатия на кнопку "Оформить заказ" идет переброска на страницу с корзиной, которая пустая, хотя по по плану должна была быть страница с инф. о заказе и оплатой... В чем может быть причина такой ошибки? |
Да, что-то этот момент я не учел. После оформления, само собой сумма станет меньше минимальной (точнее 0) и условие сработает.
Быстрое решение, перенесите эту проверку из result_modifier.php в вверх template.php
Тогда не должно бы срабатывать после оформления заказа, за него отвечает файл confirm.php
Позже дополню заметку более "фен шуйным" вариантом.

Цитата |
---|
Гость написал: А я в template.php (sale.order.ajax) и добавляла проверку и был переброс на корзину... |
Обверните код, который проверяет сумму в корзине и отвечает за редирект, вот в такое условие:
Код |
---|
if (!$request->get('ORDER_ID') <> '') { if ($arParams['MIN_SUMM'] > $arResult['JS_DATA']['TOTAL']['PRICE_WITHOUT_DISCOUNT_VALUE']) { LocalRedirect($arParams['PATH_TO_BASKET']); } } |
В заметку дописал этот нюансик

В интек шаблоне видимо есть какая-то модификация. Попробуйте найти там подключение файла confirm.php и перешлите сюда.
В штатном шаблоне выглядет так, ищите что-то похожее.
Код |
---|
if ($request->get('ORDER_ID') <> '') { include(Main\Application::getDocumentRoot().$templateFolder.'/confirm.php'); } |
Собственно, он в это же условие обвернут, но без отрицания.

Цитата |
---|
SAG написал: А какой может быть способ решения схожей задачи, в которой нужен контроль минимальной стоимости (сбора) в разрезе каждой номенклатуры? Другими словами, отдельного товара можно купить на общую сумму не менее чем ХХХ руб. при этом в заказе (в корзине) могут быть подобраны разные товары, и по каждому из них установлена установлена индивидуальная "отсечка" минимального стоимости (сбора)! |
В корзине получать свойство каждого товара, сравнивать с суммой этого товара в корзине и выводить оповещение.
Можно скомпоновать с этой заметкой:
https://bazarow.ru/blog-note/13200/
Если сумма не достаточна при переходе к заказу удалять такие товары (предупредив пользователя)
А как можно сделать чтобы минимальная стоимость заказа была только у определённого типа плательщиков?