Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс

Просмотров: 13377

В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне корзины на 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']);
    }
}
Михаил Базаров 13.08.2021
Цитата
Александр написал:
а с оформлением заказа как быть? /personal/order/make/
В принципе, точно так же. Проверять сумму товаров заказа и скрывать / показывать кнопку оформления заказа.
Гость 28.04.2023
Здравствуйте, после добавления
if ($arParams['MIN_SUMM'] < $arResult['JS_DATA']['TOTAL']['PRICE_WITHOUT_DISCOUNT_VALUE']) {
   header('Location:'.$arParams['PATH_TO_BASKET']);
}

в sale.order.ajax и нажатия на кнопку "Оформить заказ" идет переброска на страницу с корзиной, которая пустая, хотя по по плану должна была быть страница с инф. о заказе и оплатой...

В чем может быть причина такой ошибки?
Михаил Базаров 29.04.2023
Цитата
Гость написал:
в sale.order.ajax и нажатия на кнопку "Оформить заказ" идет переброска на страницу с корзиной, которая пустая, хотя по по плану должна была быть страница с инф. о заказе и оплатой...

В чем может быть причина такой ошибки?

Да, что-то этот момент я не учел. После оформления, само собой сумма станет меньше минимальной (точнее 0) и условие сработает.
Быстрое решение, перенесите эту проверку из result_modifier.php в вверх template.php
Тогда не должно бы срабатывать после оформления заказа, за него отвечает файл confirm.php

Позже дополню заметку более "фен шуйным" вариантом.
Гость 30.04.2023
А я в  template.php (sale.order.ajax) и добавляла проверку и был переброс на корзину...
Михаил Базаров 01.05.2023
Цитата
Гость написал:
А я в  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']);
    }
}

В заметку дописал этот нюансик
Гость 06.05.2023
Обернула код в template.php (sale.order.ajax) новым условием, которое вы прислали в пред.комментарии и вышло много ошибок (см. прил.), а сама форма заказа пропала.
Михаил Базаров 07.05.2023
Все работает, проверил со штатными шаблонами вот тут https://bxstore.ru/ (минимальная сумма 100 000 руб)

В интек шаблоне видимо есть какая-то модификация. Попробуйте найти там подключение файла confirm.php и перешлите сюда.

В штатном шаблоне выглядет так, ищите что-то похожее.
Код
if ($request->get('ORDER_ID') <> '')
{
   include(Main\Application::getDocumentRoot().$templateFolder.'/confirm.php');
}

Собственно, он в это же условие обвернут, но без отрицания.
SAG 28.06.2023
А какой может быть способ решения схожей задачи, в которой нужен контроль минимальной стоимости (сбора) в разрезе каждой номенклатуры? Другими словами, отдельного товара можно купить на общую сумму не менее чем ХХХ руб. при этом в заказе (в корзине) могут быть подобраны разные товары, и по каждому из них установлена установлена индивидуальная "отсечка" минимального стоимости (сбора)!
Михаил Базаров 28.06.2023
Цитата
SAG написал:
А какой может быть способ решения схожей задачи, в которой нужен контроль минимальной стоимости (сбора) в разрезе каждой номенклатуры? Другими словами, отдельного товара можно купить на общую сумму не менее чем ХХХ руб. при этом в заказе (в корзине) могут быть подобраны разные товары, и по каждому из них установлена установлена индивидуальная "отсечка" минимального стоимости (сбора)!
Такое через свойства товара, думаю, проще всего. У товаров свойство типа число "Минимальная сумма".
В корзине получать свойство каждого товара, сравнивать с суммой этого товара в корзине и выводить оповещение.

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